java中传参内幕

时间:2014-04-29 13:43:23   收藏:0   阅读:301

java中的参数传递传的其实是value。

先说一种现象,废话不多说,直接代码:

A类(作为参数传递):

public class A {
	 int i=1;

}
B类:
public class B {

	 B(A a){	
		a.i+=1;
		
	}
	
}

Test类(运行类):

public class Test {

	public static void main(String[] args) {
		
		A a = new A();
		
		B b = new B(a);
		B b1 = new B(a);
		B b2 = new B(a);

		System.out.println(a.i);
		
	}
}
结果是:4

另一种情况:

B类:

public class B {

	 B(Integer i){	
		i+=1;
		
	}
	
}
Test类:

public class Test {

	public static void main(String[] args) {
		
		Integer i = new Integer(1);
		
		B b = new B(i);
		B b1 = new B(i);
		B b2 = new B(i);

		System.out.println(i);
		
	}
}
结果是:1

为什么第一种情况会改变,第二种情况没变呢,想了一个晚上,个人觉得应该是这样的:

传参时传过去的是value,

对于第一种情况,我定义key为a的value名为va,如果是我想的那样,那么传过去的就是va,就算va如何变,他的索引,即key a一直对应的就是va。所以输出a时,就是输出va。


而第二种情况呢,

我定义key为i(Test的i)的value为vi1,同样将vi1传过去,vi1加一后将赋值给i(B的i),i的value定义为vi2,所以变的是vi2不是vi1,跳回Test,i(Test的i)对应的value还是vi1,所以没变。

如果要使它变,必须返回vi2赋值给i(Test的i)。

如果要使第一种情况不变,那就在方法里面new另外一个A类,那么改变的是新的A类,原来的key a对应的value就不会改变。这给第二种情况i不变的原因是一样的。

纯属个人观点,欢迎指导。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!