2013-07-21 68 views
1

行,所以讓我們說,你有兩個類:ClassAClassB重寫Object類平等法

  • ClassA延伸ObjectClassB延伸ClassA
  • ClassA無參數的構造函數
  • ClassB有整數變量x和帶初始化整數參數的構造函數x
  • ClassA不會覆蓋equals,它的從Object
  • ClassB覆蓋equals inhering,這樣的ClassB兩個對象被認爲是相同的,當整數x有兩個對象相同的值。

    //In Class B you have this method: 
        public boolean equals (Object obj) { 
         if (obj == null) { 
          return false; 
         } 
         if (obj.getClass() != this.getClass()) { 
          return false; 
         } 
         if (!super.equals(obj)) { 
          return false; 
         } 
    
         B b = (B) obj; 
    
         return this.x == b.x; 
        } 
    

在主如果你運行該代碼

B b1 = new B(1); 
    B b2 = new B(1); 
    System.out.println(b1.equals(b2)); 

我相信「假」將被打印,但我想知道爲什麼。也許我沒有完全理解重寫的概念,但我只是想從B應該重寫Object.equals方法,所以它可以確保x字段是相同的。

什麼似乎是我錯過的「錯誤」?

+2

如果你正在返回'super.equals()'返回的值,重寫'equals'有什麼意義? –

+0

1)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

6

你應該忽略

if (!super.equals(obj)) 
{ 
return false; 
} 

,因爲這將使用默認的equals()方法(其中檢查對象標識)

2

您的代碼永遠不會讓過去的super.equals檢查,因爲(因爲Object.equals正在比較對象引用),所以任何兩個不同的對象總是要測試false是否相等。 Object.equals正在比較引用,它返回true的唯一時間就是它是否將引用與自身進行比較。

通常情況下,如果您覆蓋等於它是因爲您想通過值比較對象(如String或BigInteger),所以在這種情況下,沒有理由引用超類的equals方法(通過引用進行比較)。