在Java中重新分配对象引用

在Java中重新分配对象引用,java,object,reference,Java,Object,Reference,我只是想澄清一下。为什么person1和person2仍然指向同一个对象 class Person{ private String name; Person(String newName) { name = newName; } public String getName() { return name; } public void setName(String val) { name = val; } } class Test { public static void swap(Person

我只是想澄清一下。为什么person1和person2仍然指向同一个对象

class Person{
private String name;
Person(String newName) {
name = newName;
}
public String getName() {
return name;
}
public void setName(String val) {
name = val;
}
}

class Test {
public static void swap(Person p1, Person p2) {
Person temp = p1;
p1 = p2;
p2 = temp;
}
public static void main(String args[]) {
Person person1 = new Person("John");
Person person2 = new Person("Paul");
System.out.println(person1.getName()+ ":" + person2.getName());

swap(person1, person2);

System.out.println(person1.getName()+ ":" + person2.getName());

}
}
产出将是:

John:Paul
John:Paul

我想知道为什么约翰和保罗没有交换

Java不是按引用传递的

这意味着无法从方法中交换调用者作用域中变量的内容

您所做的一切就是在
交换
方法内部交换本地变量
p1
p2
的内容。这对
main
中的变量没有影响


请注意,这个“问题”只存在于(局部)变量。当然,您可以交换周围对象的实例字段,这对碰巧有同一对象实例引用的任何其他人都是可见的。

对象引用是按值传递的。当你交换
p1
p2
的值时,
person1
person2
不会改变。那么你是说person1将永远保留值“John”和person2“Paul”,除非我改变它?是的。“您”(作为
main
方法)是唯一可以访问本地变量
person1
person2
的人。只有您可以重新分配它们。但是一个方法可以把John的名字改成其他的名字,所以如果是这样的话,方法交换实际上没有做任何事情,因为Java不是按引用传递的。我说的对吗?是的,它对外部代码没有任何可见的影响。