Object類的簡單介紹(#)
所有類的超類
- java類中
所有類
的始祖
//但在實現(xiàn)上不需要這樣寫
public class Employee extends Object{...}
//如果沒有明確的指出超類,那么Object就被認為是這個類的超類
public class Employee {...}
所有的數(shù)組類型肩杈,不管是對象數(shù)組還是基本類型的數(shù)組都擴展了 Object 類
equals()方法的使用情況(#)
Object類中的equals()實現(xiàn)(##)
Object類既然是所有類的超類,那么其中的一些方法就是所有類都可以使用的来累,比如說其中的equals方法泉褐,equals()方法在Object類中的實現(xiàn)如下:
public boolean equals(Object obj) {
return (this == obj);
}
其主要作用是用于檢測一個對象是否等于另外一個對象规哪。在該類中,這個方法通過判斷兩個對象是否具有相同的引用
來決定返回值:
- 如果具有相同的引用——返回true熄云,否則返回false
Object類中equals方法的適用問題(##)
但是對于多數(shù)類來說膨更, 這種判斷并沒有什么意義!缴允!
比如荚守,采用這種方式比較兩個 PrintStream 對象是否相等就完全沒有意義
經(jīng)常需要檢測兩個對象狀態(tài)的相等性
, 如果兩個對象的狀態(tài)相等练般, 就認為這兩個對象是相等的
對象狀態(tài)——對于每個特定的類實例(對象)都有一組特定的實例域值矗漾。這些值的集合就是這個對象的當前狀態(tài) ( state )。 例如一個Employee對象a{name: "張三"薄料,salary: 5000, gender : "male"}和另一個Employee對象b{name: "張三"敞贡,salary: 5000, gender : "male"},兩者雖然引用不同摄职,但是其中的值都是相等的誊役,那么這兩個對象狀態(tài)就是相等的
綜上所述获列,如果需要比較兩個對象的狀態(tài)是否相同,那么就需要重寫Object中的equals方法蛔垢。
總結其使用情況(##)
情況 1:類沒有覆蓋 equals() ?法击孩。則通過 equals() ?較該類的兩個對象時,調用超類Object中的equals()方法啦桌,比較的是兩個對象的引用是否相同。
情況 2:類覆蓋了 equals() ?法及皂。?般甫男,我們都覆蓋 equals() ?法來?較兩個對象的狀態(tài)是否相等;若它們的狀態(tài)相等验烧,則返回 true (即板驳,認為這兩個對象相等)。
equals()方法編寫注意(#)
Java 語言規(guī)范要求 equals 方法具有下面的特性:
1 ) 自反性碍拆;2 ) 對稱性若治;3 ) 傳遞性;4 ) 一致性感混;5 ) 對于任意非空引用 x, x.equals(null) 應該返回 false
這就很好的避免了類庫實現(xiàn)者在數(shù)據(jù)結構中定位一個元素時還要考慮調用 x.equals(y), 還是調用 y.equals(x) 的問題
此外端幼,注意方法重載時參數(shù)的問題,例如下面的例子
public class Employee
{
public boolean equals(Employee other) {
... ...
}
}
這個方法聲明的顯式參數(shù)類型是 Employee弧满。其結果并沒有覆蓋 Object 類的 equals 方法婆跑, 而是定義了一個完全無關的方法。