2014-02-20 31 views
0

我有一個超類Order,它有一個子類OrderBook。 方法在OrderBook中被覆蓋。該方法的具體實現如下: -重寫Java中的equals(...)方法時遇到問題

public boolean equals(Order o) 
    { 
     if(o==null){ 
      System.out.println("object is null."); 
      return false; 
     } 
     if(o==this){ 
      System.out.println("The object is itself."); 
      return true; 
     } 
     if(o instanceof OrderBook) 
     { 
      OrderBook o1 = (OrderBook)o; 
      if(!(o1.productId.equals(productId))){ 
       System.out.println("productId mismatch."); 
       return false; 
      } 
      if(!(o1.customerId.equals(customerId))){ 
       System.out.println("customerId mismatch."); 
       return false; 
      } 
      if(o1.book!=book){ 
       System.out.println("book mismatch."); 
       return false; 
      } 
     } 
     return true; 
    } 

我遇到了一個意外的輸出,如果我給下面的語句: -

Order order1 = new OrderBook("Algorithms","Kunal",false); 
Order order2 = new OrderBook("Algorithms","Kunal",false); 
System.out.println(order1.equals(order2)); 

應該顯示true但其顯示false。另外,如果我將equals(...)中的參數更改爲Object o,那麼整個程序運行沒有任何問題。

我的疑問是,爲什麼我們在使用Object時應該使用Order

+2

你實際上不重寫'equals'。因爲Object類中的'equals'具有不同的簽名。 '公共布爾等於(對象o)' – ferrerverck

+0

如果您正在覆蓋,你overring父類的方法。這是重載你正在嘗試做的方法。 – Zeus

回答

4
public boolean equals(Order o) 

應該是

public boolean equals(Object o) 

Ex平面

這是因爲你試圖重寫一個方法。當你重寫一個方法時,你需要匹配的簽名。簽名是由:

  • 方法
  • 類型的參數
  • 的參數
  • 的返回類型的數名。

原始方法簽名中參數的類型爲Object,但您提供了Order類型的對象。因此,運行時將處理這些是兩種不同的方法。

+0

謝謝。但是當我聲明 'Order order1 = new OrderBook(「Algorithms」,「Kunal」,false);' 'Order order2 = order1;' 'System.out.println(order1.equals(order2)); ' 爲什麼我得到真正的? – kusur

+0

你是否改變了方法簽名以匹配'equals(Object o)'?如果你有,你傳遞同一個對象到'equals'方法,並在你的代碼,你的狀態,如果對象是相同的,打印出「同一個對象」,並返回TRUE;。 – christopher

+0

不需要。這是在將參數更改爲「Object o」之前。 – kusur

1

嘗試把這個而不是在你的書比較塊部分

if(!o1.book.equals(book)){ 
     System.out.println("book mismatch."); 
     return false; 
} 

,並改變它應該是平等的(對象o) 另外不要忘了@Override註釋簽名

1

要重寫Java中的方法,您必須完全匹配其簽名。的Object#equals簽名是:

public boolean equals(Object o) 

比較規範的做法是壓倒一切等於是:

public boolean equals(Object o) { 
    if (obj == null) 
     return false; 
    if (obj == this) 
     return true; 
    if (!(obj instanceof Order)) 
     return false; 

    // specific comparisons for your Order object 
} 
0

每個人都做得很好地名釋義如何使其發揮作用。我想解釋爲什麼你的沒有工作:(密切關注equals()中的參數類型)

對象類有equals(Object ojb)。當JVM遇到「order1.equals(order2)」語句時,它自己說:嗯......訂單是Order類型的,並且引用了OrderBook。如果OrderBook有一個,我需要使用overriden equals()方法。黨!OrderBook不具有equals(Object),而是具有equals(Order)。所以我將使用Object類中的equals(Object)。

你有什麼叫做重載。不是壓倒一切。