以廖雪峰老师的示例来看,此时setName方法参数为数组,第一次输出时调用方和接收方指向的都是fullname对象,当调用方修改数组中元素后,因为接收方依然指向fullname,所以第二次输出结果变化了。这种情况比较好理解。
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;
}
}
看第二个例子,修改了bob的值,但是第二次输出依然是Bob。依然从第一次输出来看,因为字符串属于引用类型,第一次输出时接收方指向的对象是Bob。当第二次输出时,bob = “Alice”,虽然bob的指向对象变成了Alice,但是传入方法中对象指向依然是Bob,所以输出为Bob。
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"
}
}
class Person {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}