JAVA中只存在值传递
值传递和引用传递:
- 值传递:在函数调用过程中,将实际参数拷贝一份传递到函数中
- 引用传递:在函数调用过程中,将实际参数的地址直接传递到函数中
两者的主要区别是在于是否将实参进行拷贝,也就是是否是复制一份传递给函数还是直接传给函数。
先说结论:JAVA中如果函数形参是引用类型,那么实参传入的是被复制了的引用类型的首地址 。
例一:
public class Main {
public static void main(String[] args) {
Person p1 = new Person("蔡徐坤");
Main.changeName(p1);
System.out.println("p1.name : "+p1.name);
}
public static void changeName(Person p) {
p.name = "肖战";
}
}
class Person{
String name;
public Person(String str) {
this.name = str;
}
}
“咦,不是说JAVA只有值传递嘛,这里传入Person对象都被改变了呀,这不是明显存在引用类型的嘛?”
记住,区分值传递和引用传递的主要依据是判断是否实参被复制,而不是对象数据是否发生改变。
这里传入的是对象p的首地址的复制品,通过这个地址复制品对其进行修改肯定也是能影响到对象p的数据的。
例二:
public class Main {
public static void main(String[] args) {
Person p1 = new Person("蔡徐坤");
Person p2 = new Person("易烊千玺");
Main.change(p1, p2);
System.out.println("p1.name : "+p1.name);
System.out.println("p2.name : "+p2.name);
}
public static void change(Person p1, Person p2) {
Person tmp = p1;
p1 = p2;
p2 = p1;
}
}
class Person{
String name;
public Person(String str) {
this.name = str;
}
}
可以看到,在调用change后,输出p1名字依旧是坤坤,p2依旧是四字。
因为change函数获得的是p1和p2被复制了的首地址,即使这两个地址交换,仍对main函数中的p1和p2所指的对象产生不了影响。