public class SwapTest {
public void swap(int x,int y) {
int temp=x;
x=y;
y=temp;
System.out.println("x="+x+",y="+y);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=1;
int b=2;
SwapTest one=new SwapTest();
one.swap(a, b);
System.out.println("a="+a+",b="+b);
}
}
如上面代码所示,当两个对象使用交互数据的方法时,会出现什么结果呢?
答案似乎并不是我们想要的,a和b的数据并没有成功交互。
这是因为java这门语言总是采用按值调用,而非按引用调用,那么,什么是又按值调用?
专业术语中是这样解释按值调用的:按值调用表示方法接收的是调用者提供的值。 我将举一个形象一点的例子来解释一下值,对象和方法三者之间的关系。
- 首先,想象一个空的杯子,如果你手边有的话就更好了,这个杯子就相当于一个实例域,例如int类型的数值范围是-2147483648到2147483647,我们假设一个较小的范围,并去掉负数,0到100。当杯子的状态为空时,数值就是0,当杯子的状态是满的时候,数值就为100。
- 而对象就想象成一个吸管,对象指向值域的方式就相当于吸管插进杯子里,通过这根吸管(对象)来加水或者抽水,就可以完成改变数值的操作。
- 而在java中,当方法操作对象(即对象调用方法)时,方法操作的并不是调用方法的对象,而是这个对象的拷贝,你可以想象成一根一摸一样的吸管也插入这个杯子中,方法正是通过第二根吸管注水或者抽水,当方法执行完毕后,第二根吸管就会被扔掉,重新回到一根吸管一个杯子的状态,但是这时杯中的水量已经发生了改变。
- 文章开篇中的代码就是将杯子A中的第二根吸管和杯子B中的第二根吸管进行了交换,但是当方法结束时,这两根吸管就会被扔掉,相当于什么都没有发生过,这就造成了无法实现交互数据的效果。
解决方法可以利用反射机制。