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发现值发生了改变。

原文地址:https://www.cnblogs.com/universal/p/10452554.html