JAVA里面方法调用时传对象参数的陷阱

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

类似的问题,又被人问到了几次,决定还是简单总结一下吧。这个问题,一些老手已经很清楚了,但有时也会很不小心的被XX了一把。

其实问题的核心,就是参数虽然是传的引用,但参数就是参数,他自身是一个本地的局部引用而已,只不过在这个时刻和调用者指向了同一个对象。但并不代表这个局部引用在整个方法调用期间内能始终和调用者保持一致。

下面是2个测试,分别测试可修改的Object和不可修改的

/*** JAVA里面对象参数的陷阱** @author 老紫竹的家(laozizhu.com)**/public class Test {public static void main(String[] args) {TestValue tv = new TestValue();tv.first();TestInteger ti = new TestInteger();ti.first();}}class TestValue {class Value {public int i = 15;}// 初始化Value v = new Value();public void first() {// 当然是15System.out.println(v.i);// 第一次调用second(v);System.out.println(v.i);third(v);System.out.println(v.i);}public void second(Value v) {// 此时这里的v是一个局部变量// 和类属性的v相等System.out.println(v == this.v);v.i = 20;}public void third(Value v) {// 重新设置一个对象v = new Value();// 此时这里的v也是一个局部变量// 但和类属性的v已经不相等了// 修改这个v指向对象的数值,已经不影响类里面的属性v了。System.out.println(v == this.v);v.i = 25;}}class TestInteger {// 初始化Integer v = new Integer(15);public void first() {// 当然是15System.out.println(v);// 第一次调用second(v);System.out.println(v);third(v);System.out.println(v);}public void second(Integer v) {// 此时这里的v是一个局部变量// 和类属性的v相等System.out.println(v == this.v);// 但这一句和前面的不同,虽然也是给引用赋值,但因为Integer是不可修改的// 所以这里会生成一个新的对象。v = 20;// 当然,他们也不再相等System.out.println(v == this.v);}public void third(Integer v) {// 重新设置一个对象v = new Integer(25);// 此时这里的v也是一个局部变量// 但和类属性的v已经不相等了// 修改这个v指向对象的数值,已经不影响类里面的属性v了。System.out.println(v == this.v);}}

运行结果

15true20false2015truefalse15false15

希望这个例子能解开一些初学者的疑问。

而只有在充满了艰辛的人生旅途中,

JAVA里面方法调用时传对象参数的陷阱

相关文章:

你感兴趣的文章:

标签云: