Java构造函数赋值变量后交换:代码输出131713的原因?
Java对象引用交换后的输出解析:为什么实际是131713?
嘿,这个问题刚好戳中了Java新手常踩的「引用传递误区」,我来给你拆解明白~
首先咱们先还原下大概率的代码场景(原代码没提供,但核心逻辑基本都是这个路数):假设我们有一个带int属性的类,通过构造函数给属性赋值,写了一个swap方法试图交换两个对象的引用,最后连续输出第一个对象的属性、第二个对象的属性、第一个对象的属性,得到了131713这个结果。
预期输出应该是多少?
预期输出大概率是171317——这是很多刚接触Java引用机制的开发者会默认的结果,因为大家直觉上觉得调用swap方法后,两个对象的引用就完成了交换,原来指向13的变量会转而指向17,反之亦然。
为什么实际输出是131713?
核心原因就是Java的参数传递本质是值传递——哪怕传递的是对象引用,传递的也是引用的「副本」,具体过程可以拆解成这几步:
- 当在
main方法里调用swap(a, b)时,Java会把a的引用复制一份给方法参数x,把b的引用复制一份给参数y。此时x和a指向同一个value=13的对象,y和b指向同一个value=17的对象。 - 在
swap方法内部交换x和y的指向,只是让x转而指向y原来的17对象,y转而指向x原来的13对象——但这一切都只发生在swap方法的局部变量里,和外部的a、b没有任何关系! - 当
swap方法执行完毕,局部变量x和y就被销毁了,main方法里的a依然指向原来的13对象,b依然指向原来的17对象。所以输出a.value、b.value、a.value自然就是13、17、13,拼接起来就是131713。
如果真的想实现外部引用交换的效果,要么直接在main方法里手动交换(比如MyClass temp = a; a = b; b = temp;),要么用一个包装类(比如数组、自定义容器类)来传递引用,这样修改包装类内部的引用才会影响外部变量。
内容的提问来源于stack exchange,提问作者sjk
相关产品推荐
相关产品推荐

