关于引用传递的一个值得思考的问题

xiaoxiao2021-02-28  55

    前天碰到了一道做错的题,可是对解析始终不是很明白,总是觉得没有说到正点上,一时半会儿也想不明白,直到今天才终于明白过来。题目是这样的:

class Value{ public int i = 15; } public class RefTestDemo { public static void main(String[] agrs){ Value v = new Value(); v.i = 10; change(v); System.out.println(v.i); } public static void change(Value v){ v.i = 20; Value value = new Value(); v = value; } }

    相信有不少人和我一样,认为最终输出结果是15,但是最终结果却让我大吃一惊,输出的是20。

    这里其实想考的是Java中的引用传递(原题目即考值传递,也考了引用传递,值传递的部分被我省去了),引用传递传递的到底是啥?当然是地址啊,确实,引用传递传递确实是地址,但是就是在这一点上,我不明白了,既然传递的是对象的地址,那么在change()函数中,改变了对象v的指向,让其指向了一个新的对象,这样输出的结果就应该是15啊。但是事实却打脸了。

    通常我们所说的引用传递,传递的其实是原来对象地址的一份拷贝,并不是直接传递原来对象的地址,在这一点上,引用传递本质上也是值传递。在函数中,我们可以通过这个地址来修改对象的内容,但是一旦修改这个地址的值,也就是改变这个地址指向的对象的时候,这个地址就和原来的对象断开了联系,之后所做的任何操作都和原来的对象没有任何关系,也就对原来的对象不产生任何影响。

    这时候,我们就能明白,为什么以前老是说String对象作为参数传递时和值传递的效果的是一样的,函数执行完成以后,对实参没有影响了。

转载请注明原文地址: https://www.6miu.com/read-2619451.html

最新回复(0)