Java只有值传递
关于这个问题被困惑的原因在于对于定义没有理解
程序中的值传递和引用传递的定义
值传递: 调用函数时将实参赋值一份到形参中,函数中对形参的操作,不会改变实参的值。
引用传递:将实参的地址传递给形参,函数中对引用地址的修改会改变实参的引用地址。
案例分析
误解案例:
public void haveTry(){
Student s1 = new Student();
Student s2 = new Student();
s1.setName("PM");
s2.setName("AM");
swap(s1, s2);
System.out.println(s1.getName()); // pm
System.out.println(s2.getName()); // am
}
public void swap(Student x1, Student x2) {
x1.setName("pm");
x2.setName("am");
}
有人会说,改变了对象s1和对象s2的成员变量值,swap方法传递的是引用地址,所以是引用传递。这个想法就对引用传递的定义产生了误解。
正确理解应该为:swap方法的调用将对象s1和s2的引用地址值拷贝到了swap方法中,所以对对象的成员变量操作产生了作用,没有违背值传递定义。
不符合引用传递定义的案例
@Test
public void haveTry(){
Student s1 = new Student();
Student s2 = new Student();
s1.setName("PM");
s2.setName("AM");
swap2(s1, s2);
System.out.println(s1.getName()); // PM
System.out.println(s2.getName()); // AM
}
public void swap2(Student x1, Student x2) {
Student temp = x1;
x1 = x2;
x2 = temp;
}
如果Java有引用传递,那么在swap2方法中对象s1和对象s2的引用地址指向进行的调换,此时实参的s1和s2应该同样发生了引用地址的改变,两行输出语句应该为AM和PM。
实际上调用swap2方法仅仅只是将两个引用地址的值赋给了swap2方法作为形式参数,swap2中可以根据引用的地址调用getName方法修改对象内成员变量的值,但无法改变haveTry方法中s1和s2对象的地址。