结论:Java中只有值传递

很多人困惑既然是值传递,为什么有的时候还能改变原对象属性呢?

值传递和引用传递区别:值传递会创建副本作为参数,而引用传递是直接作为参数

验证结论:

基本类型时

public class Demo01 {
​@Testpublic void test(){int i=1;add(i);System.out.println(i);}public void add(int i){i+=1;System.out.println(i);}
}

输出

2
1

可见,将基本类型变量作为参数传递到方法中,在方法中对其进行修改,是不会影响变量自身的值

引用类型时

public class Demo01 {@Testpublic void test(){Student student = new Student();student.name="aa";updateName(student);System.out.println(student.name);}public void updateName(Student student){student.name="bb";System.out.println(student.name);}
}
class Student{String name;
}

输出

bb
bb

上述代码。编写了一个Student类,然后创建了一个对象,设置name属性为aa,然后调用updateName方法对象name属性进行修改,最终发现值传递情况下原对象属性也被修改了。

这是为什么?因为参数类型为引用类型时,传递的时引用地址的副本,因此在方法中也可以使用这个副本操作该对象的属性,因为这个副本指向的地址和该对象是一样的

既然值传递也能改变对象属性,那么二者怎么区分呢,再看一个例子

public class Demo01 {@Testpublic void test(){Student student = new Student();student.name="aa";updateName(student);System.out.println(student.name);}public void updateName(Student student){student=new Student();student.name="bb";System.out.println(student.name);}
}
class Student{String name;
}

输出

bb
aa

这次在方法中没有直接修改对象的属性,而是创建了一个新对象,然后将其引用复制给该变量,然后修改属性,此时原对象的属性是没有被修改的。

这也验证了值传递,传递的是引用地址的副本,因此方法中只是改变了引用副本,让其指向其他对象,但是原引用是没有被改变的,还是指向原对象,因此也就不能修改原对象的属性了。

拓展

public class Demo01 {@Testpublic void test() {String str = "aa";updateStr(str);System.out.println(str);}
​public void updateStr(String str) {str = "bb";System.out.println(str);}
}

输出

bb
aa

道理和上面的一样,str = "bb";相当于让引用副本指向的其他对象,原引用还是指向"aa"这个对象。

最终结论:Java中只有值传递,若参数为基本类型,则传递的就是基本类型变量值的副本;若为引用类型,则传递的是引用地址的副本,该引用副本也能修改对象,因为虽然是副本,但是和原引用都是指向一个对象。但是让引用副本指向其他对象,这不影响原引用,原引用还是指向原对象,这种情况下修改就不会对原对象产生影响。

Java中值传递还是引用传递(三个例子说明)相关推荐

  1. java引用传递106_(转载)java的值传递与引用传递

    1 说明:本文的适用对象为java初学者.如果有读者发现文章中有叙述不妥之处,请指正.2 3 今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交.有人说java只 ...

  2. java形参、实参、值传递、引用传递

    工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...

  3. java形参_java形参、实参、值传递、引用传递

    工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...

  4. 多图证明,Java到底是值传递还是引用传递?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见 ...

  5. 【重难点】【Java基础 04】值传递和引用传递、序列化和反序列化

    [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 文章目录 [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 一.值传递和引用传递 1.对比 二.序列化 1.基本概 ...

  6. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  7. 一文彻底搞懂Java中的值传递和引用传递!

    关于Java中方法间的参数传递到底是怎样的.为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至我在面试的时候问过很多有丰富经验的开发者,他们也很难解释的很清楚. 我很久也写过一篇文章,我当 ...

  8. java形参和实参的三种传递方式(值传递,地址传递,引用传递)

    博客 博客 值传递:对形参的修改不会影响到实参 引用传递:对形参的修改会影响实参 一.值传递 在主函数中 #include <iostream> using namespace std;v ...

  9. java中的参数传递(只有值传递没有引用传递)

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递).所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答. java中的数据类 ...

最新文章

  1. GAN生成的结果多样性不足怎么办?那就再添一个鉴别器!
  2. JOGL   java调用openGL
  3. html闪烁字体设置,HTML最简单的文字闪烁代码
  4. information_schema系列十一
  5. JEPLUS之简单流程创建——JEPLUS软件快速开发平台
  6. 2017202110104-高级软件工程2017第8次作业—个人总结
  7. 中科院NLPIR中文分词java版
  8. 跨域解决方案之CORS
  9. python读取hdf文件 高效_利用python读取MODIS hdf文件
  10. hdu 1087 最大递增和
  11. Hadoop Name node is in safe mode报错解决办法
  12. 2017.10.11 Problem c 失败总结
  13. SqlServer智能提示工具
  14. Hello,Java!(娱乐)
  15. 层次化网络设计(三层网络结构)
  16. 谭浩强c语言第五版视频,张子枫平胸
  17. 【Pytorch】Tensor.contiguous()使用与理解
  18. web前端开发基础知识整理以及前端视频教程
  19. access随系统启动的宏_Access 中启动带宏的excel
  20. C语言去掉字符串前后空格,中间多余空格

热门文章

  1. 【沃顿商学院学习笔记】领导力——Impact Investing:03 经典影响力投资 Classic Impact Investing
  2. VB速查大全(数据库、表格及报表编程) ★ VB错误处理,ado常见错误,VB数据类型等,网上有很多教程是错的,强烈建议看此文
  3. 一个月通过大学英语四级考试
  4. android音乐播放器ppt,基于Android音乐播放器设计与开发.ppt
  5. U盘(闪存盘)量产的普及知识的问题
  6. java中 jacob作用_Jacob用法收集
  7. Bloomier filter简介
  8. python爬取历史天气数据并保存_Python爬取天气网历史天气数据
  9. 企业公众号运营堪忧 微信涨粉已过黄金时代
  10. java 车牌正则表达式_车牌号校验正则表达式