本帖最后由 乔青山 于 2014-2-27 23:07 编辑
是的
这个问题我也就纠结了好久,不过看过一个帖子,写的很通俗易懂,然后就明白了。大概意思是这样的:
说到引用传递呢,看一下下面这个代码:
class Demo{
int a;
public Demo(int a){
this.a=a;
}
}
public class TestQuote{
public static void main(String args[]){
Demo d1=new Demo(1);
Demo d2=new Demo(2);
System.out.println(d1.a);
System.out.println(d2.a);
function(d1,d2);
System.out.println(d1.a);
System.out.println(d2.a);
}
private static void function(Demo d1,Demo d2){
int a;
a=d1.a;
d1.a=d2.a;
d2.a=a;
}
}
运行结果是:
1
2
2
1
可以看出a,b的值发生了交换,所以有的人说这是引用传递。对于这种说法呢,我们可以再看一下下面这段代码:
class Demo{ int a;
public Demo(int a){
this.a=a;
}
}
public class TestQuote{
public static void main(String args[]){
Demo d1=new Demo(1);
Demo d2=new Demo(2);
System.out.println(d1.a);
System.out.println(d2.a);
function(d1,d2);
System.out.println(d1.a);
System.out.println(d2.a);
}
private static void function(Demo d1,Demo d2){
Demo temp;
temp=d1;
d1=d2;
d2=temp;
}
}
这次运行的结果呢:
1
2
1
2
那这次为什么没有改变?因为d1和d2是值传递,function函数中的d1和d2是main中d1和d2的副本
所以,function中的改变完全不会对main中的d1和d2产生影响。
但是,上面的程序为什么a和b发生了交换呢,因为function函数中是对d1和d2所指向内存中的值(!)进行了改变
实际上d1和d2并没有改变,仍然指向调用前堆中的对象,
function函数的参数是栈中的d1和d2,而不是堆中所指向的d1对象和d2对象
虽然,在函数中改变了堆中对象的值,但是并没有改变对象的引用。
|