值传递和引用传递概念
在方法调用时,在方法内部对参数修改,如果影响到参数的原始值,那么就是引用传递;如果修改后,参数原始值不变,那么就是值传递。
这也是判断值传递和引用传递的最根本原则。
代码实验
下面是对针对基础类型、String 类型、复杂类型的测试
public class ParamTransTest {
public static void main(String[] args) {
ParamTransTest paramTransTest = new ParamTransTest();
// 修改整数
int i = 1;
paramTransTest.changeInt(i);
System.out.println(i +"\n");
// 修改字符串
String str = "str";
paramTransTest.changeStr(str);
System.out.println(str + "\n");
// 修改复杂对象
User user = new User("xiao ming");
paramTransTest.changeUser(user);
System.out.println(user);
}
public void changeInt(int i) {
i = i + 1;
System.out.println(i);
}
public void changeStr(String str) {
str = "string";
System.out.println(str);
}
public void changeUser(User user) {
// 这里有同学会有疑问了,为什么要 new 一个对象出来,其实这样做恰恰是为了看能否改变形参的值,因为这里传的参数是『对象的引用』,目的就是改变它,而不是它在堆区的内容。
// 很多同学在这里会有一个思维误区,需要纠正。
user = new User("xiao ming is 10 years old.");
System.out.println(user);
}
}
class User {
private String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
从实验结果可见,Java中对集中类型的参数传递后修改,都没影响参数原始值。
网友评论