Java沉思录之参数传递
Java中方法参数传递方式其实只有一种,就是按值传递。即传递变量所代表的值的副本
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
对于String类型
void change(String b) {
b = “b”;
}
main () {
String a = “a”;
change(a);
System.out.print(a);//a的值还是”a”;
}
传递的是String a 对象的地址值的一个拷贝给b,b也指向堆内存中的”a”。但是 b = “b”,由于String是final、immutable类型的,只是修改了b的指向,使b指向了堆内存的”b”。所以打印a对象的内容并没有改变。
对于自定义类型
class User{
String name;
}
void change1(User b) {
User u = new User();
u.name = “u”;
b = u;
}
void change2(User b) {
b.name = “b”;
}
main() {
User a = new User();
change1(a);
System.out.print(a.name);//输出"a"
change2(a);
System.out.print(a.name);//输出"b"
}
传递的是User a对象的地址值的一个拷贝,a、b同时指向堆内存的同一个地方。使用change1()方法改变的是拷贝的指向内容,不影响原来对象指向的内容。但是使用change2()方法,b.name = “b”,对堆内存中原来对象的内容进行了操作,改变了属性name的值。所以打印a.name发现值发生了改变。