对于这个知识点懵了挺久的。今天经高人指点明白了很多。
下面直接用例题来解释。
public class Main {
public static void main(String[] args) {
Person p = new Person();
int n = 15; // n的值为15
p.setAge(n); // 传入n的值
System.out.println(p.getAge()); // 15
n = 20; // n的值改为20
System.out.println(p.getAge()); // 15还是20?
}
}
class Person {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
15
15
结果输出是两个15。
对于传入的n是用户定义的一个常量15。在p.setAge(n)
的时候相当于是把常量n=15传入了方法中。
在第二次输出p.getAge(n)
的时候并为改变n的值也没有重新传入新的值进入。所以还是输出15。
结论:基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。
public class Main {
public static void main(String[] args) {
Person p = new Person();
String[] fullname = new String[] { "Homer", "Simpson" };
p.setName(fullname); // 传入fullname数组
System.out.println(p.getName()); // "Homer Simpson"
fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"?
}
}
class Person {
private String[] name;
public String getName() {
return this.name[0] + " " + this.name[1];
}
public void setName(String[] name) {
this.name = name;
}
}
Homer Simpson
Bart Simpson
fullname是类中new的对象,在p.setName(fullname)
的时候对象fullname传入到了方法setName中。所以p.getName(fullname)会随着fullname的改变而改变。
结论:引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。
有了上面的结论,我们再看一个例子:
public class Main {
public static void main(String[] args) {
Person p = new Person();
String bob = "Bob";
p.setName(bob); // 传入bob变量
System.out.println(p.getName()); // "Bob"
bob = "Alice"; // bob改名为Alice
System.out.println(p.getName()); // "Bob"还是"Alice"?
}
}
class Person {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Bob
Bob
从这个例子就可以解释了。bob只是一个常量而不是对象。p.getName()
并不会随着bob常量的改变而改变。
转载了廖雪峰老师的例子。加上了自己的分析解释。