Java學習筆記 覆蓋equals時請遵守通用約定

2021-08-26 19:41:27 字數 1003 閱讀 6476

不覆蓋equals的情況

1)類的每個例項本質上是唯一的;

2)不關心類是否提供了「邏輯想等」的測試功能;

3)超類已經覆蓋了equals,從超類繼承過來的行為對於子類也是合適的;

4)類是私有的或包級私有的,可以確定他的equals方法永遠不會被呼叫。

應該覆蓋equals的情況

如果類具有自己特有的「邏輯想等」概念,而且超類還沒有覆蓋equals以實現期望的行為,這時我們就需要覆蓋equals方法。這通常屬於「值類」的情形。

equals 方法在非空物件引用上實現相等關係

l自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。

l對稱性:對於任何非空引用值 x 和y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。

l傳遞性:對於任何非空引用值 x、y 和z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true。

l一致性:對於任何非空引用值 x 和y,多次呼叫 x.equals(y) 始終返回 true 或始終返回 false,前提是物件上 equals 比較中所用的資訊沒有被修改。

l對於任何非空引用值 x,x.equals(null) 都應返回 false。

實現高質量equals方法的訣竅

1)使用==操作符檢查「引數是否為這個物件的引用」;

2)使用instanceof操作符檢查「引數是否為正確的型別」;

3)把引數轉換成正確的型別;

4)對於該類中的每個「關鍵」域,檢查引數中的域是否與該物件中對應的域相匹配(為了獲得最佳效能,應該先比較最有可能不一致的域,或者開銷最低的域,最理想的情況是兩個條件同時滿足的域);

5)當編寫完equals方法後,應該問自己三個問題:它是否是對稱的、傳遞的和一致的?

java中 和 equal區別

明確概念 物件的引用 當用類建立乙個物件時,類中的成員變數被分配記憶體空間,這些記憶體空間稱為該物件的實體,而物件中存放著引用 位址 以確保該實體由該物件操作使用。一 比較物件為基本資料型別 byte,short,char,int,long,float,double,boolean 比較兩個基本資料...

Java學習之Object類的equals 方法

喵喵喵 小北今天想把object類中的equals 方法想給大家更詳細的解釋一下下咯 首先equals 方法在預設的情況下比較的是物件的引用是否相同 源 public boolean equals object obj 其實呢string這個時候已經被重寫過了 因此輸出的結果就是 true 那麼如何...

JAVA學習筆記 隱藏和覆蓋 續

1 屬性的隱藏 子類中宣告了與父類中相同的成員變數名,則從父類繼承的變數將被隱藏 子類擁有了兩個相同名字的變數,乙個繼承自父類,另乙個由自己宣告 當子類執行繼承自父類的操作時,處理的是繼承自父類的變數,而當子類執行它自己宣告的方法時,所操作的就是它自己宣告的變數 2 如何訪問被隱藏的父類屬性 呼叫從...