概述
前天碰到了一道做错的题,可是对解析始终不是很明白,总是觉得没有说到正点上,一时半会儿也想不明白,直到今天才终于明白过来。题目是这样的:
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对象作为参数传递时和值传递的效果的是一样的,函数执行完成以后,对实参没有影响了。
最后
以上就是眯眯眼发箍为你收集整理的关于引用传递的一个值得思考的问题的全部内容,希望文章能够帮你解决关于引用传递的一个值得思考的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复