java中方法的传递总是值传递,也就是传递的是实际参数的拷贝。
定义一个方法
void swap(int x,int j){
int z = x;
x = j;
j = z;
}
这是一个交换函数,熟悉C语言的朋友肯定能一眼就看出这个程序有问题:
x 和 j 传递进入方法中后,方法中使用的是实际参数的两个拷贝,交换的也是拷贝的对象,方法执行完毕后,对象都会销毁,而外部的实际参数没有改变。在Java中也是这样。
但上面的例子形式参数是java的基本类型,有些朋友认为如果对象类型作为参数,传递的是对象的引用,也就是引用调用。实际上,这种理解方式是不对的,而且这种理解还具有普遍性。所以下面给出了Java核心技术卷里面的一个例子来详细的阐述一下这个问题。
void swap(Employee x,Employee y){
Employee z = x;
x = y;
y = z;
}
这里Employee只是普通的Java对象
如果对象作为参数传递的是引用,那么结果会是x与y交换了,但是实际上的输出结果也没有发生变化。
其实这个例子和上面的例子一样,进入方法时候,x,y是实际参数的拷贝,x,y在方法内部交换,并不会对外面的实际参数产生影响,而且方法执行完毕后,x与y就会销毁。这里画一张图可以很好的说明:

交换的是执行时栈里面的引用,执行完后会被销毁,实际参数没有变化。
网友评论