Java方法中的引用传递

  • 背景
    • 基础知识
    • 探究
      • 定义Person类
      • 写定义测试类进行测试
      • 运行结果
      • 分析
      • 另一个例子
      • 运行结果
    • 分析和结论

背景

最近复习java相关的知识,看到有一个资料里写道:Java 中不存在引用传递。于是又看了一些帖子,有些说Java中只有值传递,而有些说二者都有;这难免让人感到疑惑,大概在这里总结一下。

基础知识

Java中,除基本类型外,其他类型都是以引用的方式传递变量。

值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递中,形参实参指向同一个对象,形参的操作会改变实参对象。

对象的传递则和基本类型不同,传递的是该对象的一个引用,即指向对象的一个指针。也就是说,传递到方法中的对象和外部的对象是同一个对象,在方法内部对对象的修改,在方法外部会有所体现。

探究

定义Person类

public class Person {public String name = "Person";public int age = 20;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

写定义测试类进行测试

public class Test {public static void main(String[] args) {Person p = new Person();System.out.println("方法传递前Person为:" + p);func(p);System.out.println("方法传递后Person为:" + p);}public static void func(Person p) {p.name = "被修改的名字";}
}

运行结果

分析

传递到方法中的对象和方法外部的对象是同一个对象, 在方法内修改对象的属性,方法外的对象也会变化。那为什么会说Java中不存在引用传递呢?请看下面的例子

另一个例子

public class Test {public static void main(String[] args) {Person p = new Person();System.out.println("方法传递前Person为:" + p);func(p);System.out.println("方法传递后Person为:" + p);}public static void func(Person p) {p = new Person();p.name = "被修改的名字";}
}

运行结果

分析和结论

再看一下引用传递的定义:引用传递中,形参实参指向同一个对象,形参的操作会改变实参对象。

而在第二次的测试中,可以看到,在方法内对传入的引用的改变, 并没有在外部被体现出来。在函数内,传入的参数指向了另一个对象,但在方法外部外部,指向原对象的引用并没有跟着改变。

引用传递严格来说是C++中的概念,而Java中没有明确的定义。在C++ 中, 对象的传递可以通过 & 运算符直接将地址传递给函数,这意味着,如果在函数内将另外一个对象赋给了传入的参数,那么在函数外面仍然是可以被影响的到的。这也就是与Java中不同而引起争议的地方。

可以得出:中Java中确实不存在严格意义上的引用传递

Java方法中的引用传递相关推荐

  1. C#中方法参数的引用传递、值传递。

    一.值类型和引用类型 C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type). 值类型包括结构体(struct)和枚举(enum). 引用类型 ...

  2. java中是引用传递还是值传递....

    刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...

  3. Java方法中的参数太多,第1部分:自定义类型

    我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当前或将来出现错误的可能性很高 ...

  4. Java方法中的参数太多,第5部分:方法命名

    在上一篇文章 (有关处理Java方法中过多参数的系列文章的 第4部分 )中,我将方法重载视为一种向客户提供需要较少参数的方法版本或构造函数的方法. 我描述了该方法的一些缺点,并建议从方法重载中摆脱出来 ...

  5. python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...

    python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...

  6. Java方法中的参数太多,第8部分:工具

    在我的系列文章的前七篇文章中,有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上. 在本系列的第八篇文章中,我将介绍一些工具,这些工具可帮助您确定可能存在过多 ...

  7. Java方法中的参数太多,第4部分:重载

    期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值. 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来解决此问题. 解决此问题的 ...

  8. Java方法中的参数太多,第7部分:可变状态

    在我的系列文章的第七篇中,有关解决Java方法或构造函数中过多参数的问题 ,我着眼于使用状态来减少传递参数的需要. 我等到本系列的第七篇文章来解决这个问题的原因之一是,它是我最不喜欢的减少传递给方法和 ...

  9. Java方法中的参数太多,第6部分:方法返回

    在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , 方法重载和方法命名 ). ...

最新文章

  1. [cb]NGUI组件基类之 UIWidget
  2. 我是如何进入全球顶级AI实验室的 (1)
  3. linux计算机硬件信息,计算机linux查看硬件信息命令.doc
  4. C#开发人员应该知道的13件事情
  5. python多进程与多线程实验
  6. C++常见错误:LINK:fatal error LNL1123:转换到COFF期间失败,文件无效或者损坏
  7. day08—css布局解决方案之多列布局
  8. 浏览器滚动条默认样式改变
  9. MDT实现windows系统批量部署
  10. 一些特殊区域的全纯自同构群
  11. 10亿数据导入oracle方案
  12. Java Swing教程
  13. throttle/debounce应用及原理
  14. 潘多拉 搭建 php服务器,MAYA带你重建潘多拉!
  15. 泳池马赛克让你徜徉在在海洋般的湛蓝与天际之间
  16. Etyma01 ced ceed cess
  17. 代码技巧1.类似于登录、注册界面要判断登录账号是不是空,验证码是否正确等,怎么写比较舒服一点?
  18. [笔记] 最优化方法 - 凸集
  19. 解决高并发项目下的热点问题
  20. 用mysql关联4个表_MySQL多表操作

热门文章

  1. ANTLR4入门(二):图示说明eclipse Antlr4IDE插件的安装及语法测试过程
  2. 视频类产品直播+录制后端设计实践
  3. 【Ceres】(三)Covariance Estimation
  4. 重磅来袭!这么香的技术还不快点学起来,含BATJM大厂
  5. 2019年6月8日14:49:00
  6. TCP的ACK机制学习日志
  7. vmware虚拟机安装macos系统?vmware虚拟机安装macos系统教程
  8. 离散型随机变量 连续型随机变量汇总
  9. 禁止浏览器打开 F12 调试
  10. 计算机病毒能否自动启动,电脑突然自动开机,中病毒么?