2012-10-15 77 views
0

假設我們有一個具有以下數據字段和函數的Employee類。該程序試圖看看2 Employees是通過比較其nameaddressJava類多態性

public class Employee{ 
    private String name; 
    private double hours; 
    private double rate; 
    private Address address; 
    @Override 
    public boolean equals(Object obj){ 
     if(obj == this) return true; 
     if(obj == null) return false; 
     if(this.getClass() == obj.getClass()){ 
      Employee other = (Employee) obj; 
      return name.equals(other.name) && address.equals(other.address); 
     }else{ 
      return false; 
     } 
    } 

爲什麼我們沒有做到這一點,而不是public boolean equals(Employee obj)(不同參數)一樣的嗎?

回答

5

(1)如果你做new Empolyee().equals(null) - 這會發生。

(2)由於Object類中聲明equals(Object) - 你不能把Employee作爲參數,以覆蓋此方法。重寫方法時只能擴展參數,而不能縮小參數。
會發生什麼,如果你那麼做:

Object o = new Employee(); 
o.equals(new Object()); 

該「辦法」將不知道如何處理這種情況,而這是完全有效的,並且不能在編譯時是已知的(一般情況下)。

爲了避免這種情況,重寫某個方法時不允許使用這種類型的差異,如果您嘗試這樣做,將會出現編譯錯誤。

+0

爲什麼我會故意將null傳遞給'new Empolyee()。​​equals(null)'。是'if(obj == null)return false;'寫入所有可能性? – user133466

+1

@ user133:與「故意」無關。由於它是公開的,因此無法控制該方法的使用方式。 –

+1

@ user133466:1st,HoverfraftFullOfEels是正確的。第二 - 這種情況是非常有可能的。想象一下你有一個Map '。現在你做'myEmployee.equals(myMap.get(5));'。如果'myMap'不包含5作爲鍵,它將返回'null'。 – amit