1.结论
其实无需纠结答案是值传递还是引用传递,关键是理解它们的含义。如果一定要记住一个答案,那就认为是值传递(一切传引用其实本质上是传值)。
-
我的理解:
传递基本类型参数:改变形参(赋值操作)不影响实参
传递对象(引用)类型参数:形参指向新的对象,则实参不改变;形参调用内部方法,实参改变 -
解释:
基本类型:变量中存储的是具体的值
引用类型:变量中存储的是对象的地址,形参是变量的拷贝,指向同一个对象;此时若调用赋值操作,则指向新的对象,故实参对象不会改变;若调用内部方法,则改变的是同一个对象,即改变了参数对象。
public class TestParams {
int a = 1;
String str = "a";
User user = new User("wei.zheng");
public void test() {
System.out.println("Before: a=" + a + ", str=" + str + ", user=" + user.toString());
changeInt(a); // 不改变
changeString(str); // 不改变
changeUser(user); // 是修改对象属性,所以改变;若new新对象则不改变
System.out.println("After: a=" + a + ", str=" + str + ", user=" + user.toString());
}
private void changeInt(int i) {
i = 2;
}
private void changeString(String s) {
s = "b";
}
private void changeUser(User u) {
u.setName("justin"); // 修改属性,user实参会改变; 若 u = new ("justin")则user实参不改变
}
class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
}
运行结果:
2020-03-01 11:05:37.803 29935-29935/? I/System.out: Before: a=1, str=a, user=User{name='wei.zheng'}
2020-03-01 11:05:37.803 29935-29935/? I/System.out: After: a=1, str=a, user=User{name='justin'}
- 基本类型传递,改变形参不影响实参;
- 对象类型传递,形参若指向新的对象(changeString方法),则实参不改变;形参若调用内部修改方法(changeUser方法),则实参改变。