BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #54376同步于 2016/12/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java引用传递

shixu
2016/12/20镜像同步16 回复
------ ## 看了各位大神的回复,自己后来也想了一下 今天突然脑袋转圈。。。。似乎明白为什么了。 说一下自己的理解: - `//1`:`new`一个`Value`对象,`v`是这个对象的引用,这时对象中`i`的值为初始值`15` - `//2`:通过引用`v`改变`i`的值,这时对象中`i`的值为`25` - `//3`:**Thinking in java**中说到: >如果`java`是传值,那么传递的是值的副本;如果是传引用,那么传递的是引用的副本。 所以这里只是把引用`v`的一个拷贝传到方法`second`中 - `//4`:因为`second`中的`v`是`first`中`v`的一个拷贝,所以二者都指向内存中同一个对象,通过引用的副本来改变原对象的值 - `//5`:这是重新`new`一个新对象,没什么好说的 - `//6`:相当于把引用的副本指向刚才生成的新的对象。但是`first`中的`v`引用并没有改变,还是指向原来的对象。这也就解释了为什么代码行`//8`中依然打印的是`20`而不是`15` ---- ```java public class Demo4 { public static void main(String[] args) { Demo4 test = new Demo4(); test.first(); } public void first(){ int i = 5; Value v = new Value(); //1 v.i = 25; //2 second(v,i); //3 System.out.println(v.i); //8 } private void second(Value v, int i) { i = 0; v.i = 20; //4 Value val = new Value(); //5 //System.out.println(val); //System.out.println(v); v = val; //6 这行代码不是已经将v指向val了吗 为什么v的值没有变first中的v后来还打印20 System.out.println(v.i+" "+i);//7 } } class Value{ int i = 15; } ``` ## 为什么打印结果是15 0 20 ## 我想的是15 0 15 求大神看看啊
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2016/12/20
你明明有4个println,怎么只有3个数字呢?
shixu机器人#2 · 2016/12/20
【 在 nuanyangyang 的大作中提到: 】 : 你明明有4个println,怎么只有3个数字呢? 啊 暖神果然好眼力。那两行代码是我后来加的,已经注释掉。
nuanyangyang机器人#3 · 2016/12/20
你觉得修改了second里面的形参v会改变first里面的实参v吗?不会的。 【 在 shixu 的大作中提到: 】 : : 啊 暖神果然好眼力。那两行代码是我后来加的,已经注释掉。
shixu机器人#4 · 2016/12/20
【 在 nuanyangyang 的大作中提到: 】 : 你觉得修改了second里面的形参v会改变first里面的实参v吗?不会的。 : 传入second的是fisrt中v的引用副本,既然改变引用副本的成员变量会造成原引用的成员变量改变,那为什么将引用副本指向别的引用就不会变呢
chenxiansf机器人#5 · 2016/12/20
java传的都是拷贝
nuanyangyang机器人#6 · 2016/12/20
引用是副本,但对象不是。 【 在 shixu 的大作中提到: 】 : : 传入second的是fisrt中v的引用副本,既然改变引用副本的成员变量会造成原引用的成员变量改变,那为什么将引用副本指向别的引用就不会变呢
e97ace机器人#7 · 2016/12/20
个人觉得,把参数传递看做“形参 = 实参”的变量初始化过程还是相对好理解的,学过C++的应该不会对引用传递这个概念感到迷惑。 ———— 微博 @flowmemo 主要写JavaScript. 此签名通过「北邮人签名档」脚本发送
suweiquan机器人#8 · 2016/12/22
看得太累,不看了,不过我建议以后楼主遇到这种问题,自己debug进去,跟踪一下就能发现为什么了
wjdtsx机器人#9 · 2016/12/24
也对这个问题没想明白,求解释