這是因為要遵守 java.lang.Object 規範第二條:兩個根據 equals() 相等的對象,它們返回的 hashCode 值也必然相等。若你重寫了 equals() 方法,令兩個實際不是同一對象的兩個實例在邏輯上相等,但 hashCode 卻不等,會導致在 HashMap、Hashtable 等依賴 hashCode 的集合類中出現嚴重問題。如何寫好 hashCode 見仁見智,目前仍有科學家在研究優秀的雜湊演算法。
雖無嚴格規定,不像 hashCode 那樣會帶來災難性陷阱,但 Java 建議重寫 toString()。因為這能給我們更好的習慣和風格。若不重寫,調用 toString() 將得到一串難以理解的字串;重寫後可獲得具體清晰的資訊,利於除錯與日誌記錄。
專家級程式設計師從不重寫 clone 方法,也不調用它,除非為了低開銷拷貝陣列。為繼承設計的類,若未能實現行為良好的 protected clone 方法,其子類實現 Cloneable 介面是不可能的。
正確實踐:
Cloneable 的類應提供公有 clone 方法,首先調用 super.clone()Object.clone(),不會得到錯誤對象super.clone() 後,將所有複雜對象設為初始狀態,基本型別資料可直接複製反例: A 實例有一個堆疊 Stack,若 B.Stack = A.Stack,修改 A 的 stack 會同時影響 B,必須深層拷貝防止此問題。
compareTo 是 Comparable 介面唯一方法,Object 中未實現。寫值類時最好實現此介面,帶來極大便利。例如陣列實現此介面後,排序極簡單:Arrays.sort(a)。實現時也要遵循相關規範(自反性、對稱性、傳遞性等)。