刚开始学Java的时候一度以为:基本数据类型是值传递,引用类型是引用传递。新人很容易在这两个概念上面被搞糊涂,后来看了Hollis的文章才明白了Java中只有值传递。

接下来我能用简单明了的方式来说明这一问题,希望能对刚学习Java的朋友有点帮助。

1.概念

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

引用传递:在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

值传递的概念没啥说的,修改复制文件不会影响到源文件,最容易产生歧义的就在这个引用传递上。理解上面两句话的关键在于两句话的前半段中是否有复制。

可以理解为有复制的就是值传递,无论复制的是值还是地址值。接下来我们依次探讨Java中传递基本类型和应用类型的过程。

2.传递基本数据类型

代码:

public static void main(String[] args) {
int i = 2;
add(i);
System.out.println("i = "+i);
} public static void add(int x){
x += 1;
System.out.println("x = "+x);
}

通过代码和输出结果可以看出来,这就是值传递。

i 把值复制一份给了 x ,再修改x的值无法影响 i 的值

3.传递引用类型

代码:

public static void main(String[] args) {
Person p1 = new Person("张三", 18);
change(p1);
System.out.println("p1地址:"+p1);
System.out.println("p1姓名:"+p1.getName());
System.out.println("p1年龄:"+p1.getAge()); } public static void change(Person p2){
p2.setAge(28);
System.out.println("p2地址:"+p2);
System.out.println("p2姓名:"+p2.getName());
System.out.println("p2年龄:"+p2.getAge()); }

结果:

单从结果来看,可能就会有人误以为这是引用传递。

我们再来详细说说堆栈中是如何运作的:

我们再来看一个案例:

public static void main(String[] args) {
Person p1 = new Person("张三", 18);
change(p1);
System.out.println("p1地址:"+p1);
System.out.println("p1姓名:"+p1.getName());
System.out.println("p1年龄:"+p1.getAge()); } public static void change(Person p2){
p2 = new Person("李四",20);
System.out.println("p2地址:"+p2);
System.out.println("p2姓名:"+p2.getName());
System.out.println("p2年龄:"+p2.getAge()); }

结果:

此时p1的值就没有受到change方法的影响

由此可见,虽然对象中的数据可变,但是p1存的地址值是不会被change方法更改,即使传递引用对象,仍然是值传递。

如有错误欢迎指正!

最新文章

  1. 实用控件分享:自定义逼真相机光圈View
  2. Python学习【第七篇】基本数据类型
  3. zoom和transform:scale的区别
  4. JS替换函数
  5. start bbs轻论坛安装时数据库提示错误
  6. python编码声明的位置很重要
  7. 2015 Multi-University Training Contest 1 - 1009 Annoying problem
  8. 使用 margin 让div块内容居中
  9. 工作中nginx配置文件的一些参数记录
  10. 《算法导论》习题解答 Chapter 22.1-4(去除重边)
  11. Windows服务监视,如果停止则启动
  12. Linq语句与aspnetpager结合分页
  13. Hadoop 7、MapReduce执行环境配置
  14. Bootstrap之Button.js
  15. jqGrid整合篇
  16. Go Deeper HDU - 3715(2 - sat 水题 妈的 智障)
  17. Python基础之关于表达式
  18. 最近见到一个用react native实现的标尺动画,不知道如何实现 帖两张图(新知食App)
  19. 【Spring学习笔记-MVC-13】Spring MVC之文件上传
  20. 利用对象思想来绘制canvas帧动画

热门文章

  1. NLP论文阅读一:Paper阅读方法
  2. Linux CentOS7.x 升级内核的方法
  3. oslab oranges 一个操作系统的实现 实验二 认识保护模式
  4. UML类图设计神器 AmaterasUML 的配置及使用
  5. 计蒜客第五场 UCloud 的安全秘钥(中等) (尺取游标法
  6. USB2.0协议学习笔记---USB工作过程(类的方法)
  7. μC/OS-III---I笔记5---多值信号量
  8. json-server All In One
  9. Code Book All In One
  10. copyright@xgqfrms