2011-05-01 49 views
2

我有一個關於Java「equals」方法的問題。添加成員/設置器時,默認'equals'的行爲會發生變化嗎?

我創建了一個名爲Person類:

public class Person { 

} 

而且我比較喜歡這人兩個引用。

Person p1 = new Person(); 
Person p2 = new Person(); 
System.out.println(p1.equals(p2));  //returns false 

如果我添加了任何實例變量和setter方法來設置實例變量,那麼「equals」方法返回true。

有人可以解釋這種行爲嗎?

+2

你可以發佈你的代碼嗎?方法或字段的添加不應該影響equals方法,否則必須進行其他操作。 – Dev 2011-05-01 05:16:53

+3

添加setter方法和實例變量不會使Object相等。您還必須進行其他更改。發佈你的SSCCE(http://sscce.org),以證明這種行爲。 – camickr 2011-05-01 05:18:35

+0

(查看Dev的回答以及我對此的評論。) – 2011-05-01 05:19:33

回答

14

如果您不重寫Object.equals(Object),那麼默認實現使用對象標識進行比較。 (即如果對象在內存中是同一個對象,則equals僅返回true)。

相關的JavaDoc:Object.equals

摘錄:

的等於Object類的方法實現對象上差別可能性最大的相等關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

Object a = new Object(); 
Object b = new Object(); 
System.out.println(a.equals(b)); // Prints 'false' 
b = a; 
System.out.println(a.equals(b)); // Prints 'true' 

正如我在我的意見之一提到的方法或字段的添加應該不會影響equals方法的默認實現,別的東西必須繼續。

+1

+1投稿者:此答案是正確的。被觀察的行爲*不會偏離這個,除非'equals'被覆蓋*。也許在「奇怪的情況」中還有其他不妥之處,比如'p2 = p1; p1.equals(p2)',對於非空p1(它不會錯誤地覆蓋equals)應該始終爲真。 – 2011-05-01 05:18:24

+0

這是真的,但它並不完全回答OP的問題。爲什麼只添加一個字段和一個setter會改變equals()的行爲? – 2011-05-01 05:18:39

+3

@勞倫斯它沒有;-) – 2011-05-01 05:20:51

-2

p1p2是兩個不同的參考,這就是爲什麼。除非您有自己的equals方法,否則將返回false。不管你是否有實例變量。

+2

你可能想詳細解釋這個答案。目前還不清楚它與原始問題的關係。 – elekwent 2011-05-01 05:33:56

相關問題