看到很多网站上(包括一些知名的培训网站)都说java有引用传递,其实这是不正确的,java中只有值传递,没有引用传递。我来分析一下吧,值传递很容易理解,举个简单的例子:
public static void main(String[] args) {
int a = 2;
calculate(a);
System.out.println(a);
}
public static void calculate(int param) {
param = 3;
}
输出结果是2,a的值根本就没有改变,因为把a值传递给函数calculate传递的只是
对所传递参数a进行一次副本拷贝param,对参数a的修改只是对副本param的修改,函数调用结束,副本丢弃,原来的变量a不变
(
即实参不变
)。
那为什么很多网站上会说有引用传递呢?他们给出了很强的例证:
class Ref1{
int temp = 10;
}
public class RefDemo01 {
public static void main(String args[]){
Ref1 r1 =new Ref1();
r1.temp = 20;
System.out.println(r1.temp);
tell(r1);
System.out.println(r1.temp);
}
public static void tell(Ref1 r2){
r2.temp = 30;
}
}
输出的结果是20,30,难道这就是引用传递吗,因为值改变了嘛!其实不是这样子的,这里只是把r1的指向改变了而已,本来r1指向堆中的值是20,现在只是将r1在堆中指向了内容为30的堆,而r1本身是没有变化的,不信?来看下这个例子吧:
class Ref1{
int temp = 10;
}
public class RefDemo01 {
public static void main(String args[]){
Ref1 r1 =new Ref1();
Ref1 r2 =new Ref2();
r1.temp = 20;
r2.temp = 30;
System.out.println(r1.temp);
System.out.println(r2.temp);
tell(r1,r2);
System.out.println(r1.temp);
System.out.println(r2.temp);
}
public static void tell(Ref1 r1,Ref1 r2){
Ref1 temp;
temp = r1;
r1 = r2;
r2 = temp;
}
}
输出的结果是20,30;20,30,和上面的例子差不错,唯一不同的是函数功能修改成了将r2赋值给r1,但是可以看出r1的值根本就没有发生改变,原因很简单,参数传递属于值传递,而不是引用传递。java中根本就没有引用传递!