2016-02-26 72 views
1

我有一個名爲「worker」的子類擴展了「Person」類。我正嘗試從「Worker」的子類中的「Person」重寫equals()方法。任何人都可以解釋,如果我的嘗試在基本覆蓋方面是正確的?如何使用繼承覆蓋equals()方法?

public class Person { 
    private String name; 
    public Person(String n) { 
     name = n; 
    } 
    public Person() { 
     this(""); 
    } 
    public String getName() { 
     return name; 
    } 
    public String toString() { 
     return getName() + " "; 
    } 
    public boolean equals(Object rhs) { 
     if (!(rhs instanceof Person)) { 
      return false; 
     } 
     Person other = (Person) rhs; 
     return this.getName().equals(other.getName()); 
    } 
    class Employee extends Person { 
     double salary; 
     public Employee(double b) { 
      salary = b; 
     } 
     Employee() { 
      salary = 150000; 
     } 
     public double getSalary() { 
      return salary; 
     } 
     @Override 
     public String toString() { 
      return super.toString(); 
     } 
     // my attempt 
     @Override 
     public boolean equals(Object rhs) { 
      if (rhs == null) { 
       return false; 
      } 
      if (getClass() != rhs.getClass()) { 
       return false; 
      } 
      if (!super.equals(rhs)) 
       return false; 
      else { 
      } 
      return false; 
     } 
    } 
} 
+0

它永遠不會返回「真」。 –

+0

我們無法真正瞭解您的實施是否正確,因爲您尚未向我們解釋它應該等同的內容。現在,您在'Employee'中的重寫完全沒有任何額外的,除了使用'getClass'而不是'instanceof',這可能會破壞對稱性。 ('aPerson.equals(anEmployee)'可以與'anEmployee.equals(aPerson)'有不同的結果。) – Radiodef

回答

2

您已經正確地機械地處理了覆蓋部分,但您的Employee類的equals方法永遠不會返回true。

首先因爲這樣:

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

你永遠落入到最後返回false,即使super.equals的結果是正確的。

一旦你解決了這個問題,你仍然有Person的equals方法的問題。如果您傳入Worker的實例,那麼equals方法將始終返回false。

可能還有其他的東西,但這兩個都是show stoppers。

2

NetBeans使用快捷鍵alt + insert,可以自動生成equals方法,構造函數,getters,setters,delegate方法等等。如果你想使用編碼混合(Hashtable,HashMap,HashSet)的集合來重新定義equals,你還必須重新定義hashCode()。