2015-05-29 66 views
0

我只是想澄清一些事情。爲什麼person1和person2仍然指向同一個對象?在Java中重新分配對象引用

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 

我想知道爲什麼約翰和保羅並沒有掉?

+1

對象引用是按值傳遞的。當你交換'p1'和'p2'的值時,'person1'和'person2'不會改變。 – Radiodef

回答

0

Java不是通過引用傳遞的。

這意味着您無法從方法內調用調用程序範圍內的變量內容。

所有你一直在做的是交換你swap方法內部的局部變量p1p2的內容。這對main中的變量沒有影響。

請注意,此「問題」僅適用於(本地)變量。當然,您可以交換對象周圍的實例字段,並且對於碰巧對同一個對象實例有引用的其他人可以看到它。

+0

那麼你是說,除非我改變它,否則這個人1將永遠持有「約翰」和人2「保羅」的價值? – Dex

+0

是的。 「你」(作爲'main'方法)是唯一可以訪問你的本地變量'person1'和'person2'的人。只有你可以重新分配它們。但是一種方法可以將約翰的名字改爲別的。 – Thilo

+0

所以如果是這樣的話,方法交換並沒有真正做任何事情,因爲Java不是通過引用傳遞的。我說的對嗎? – Dex