在 Java 的世界裡,java.lang.Object 類是所有類的始祖,也是整個類層次結構的根節點。根據官方文檔定義:「Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.」(Object 類是類層次結構的根。每個類都以 Object 為超類。所有對象,包括數組,都實現了這個類的方法。)
這意味著 Java 中的任何類,無論是否顯式聲明 extends Object,都隱式繼承了 Object 類的所有非私有方法。掌握這些方法的契約與重寫規範,是編寫健壯、高效 Java 代碼的基礎。
重寫 equals() 時,必須嚴格遵守以下規約,否則會導致集合框架(如 HashSet、HashMap)行為異常:
x,x.equals(x) 必須返回 true。x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才返回 true。x.equals(y) 為 true 且 y.equals(z) 為 true,則 x.equals(z) 必須為 true。x.equals(y) 結果一致,前提是比較所用字段未被修改。x,x.equals(null) 必須返回 false。Object 默認實現僅比較引用地址(即 x == y)。業務邏輯中通常需要比較「關鍵字段」,例如用戶 ID、訂單號等。
hashCode() 的存在是為了讓對象能高效地存放在哈希表中。其協定如下:
hashCode() 必須返回相同整數(前提是 equals 比較用到的字段未變)。不同執行間允許不同。x.equals(y) == true,則 x.hashCode() == y.hashCode() 必須成立。這是重寫 equals 時必須同步重寫 hashCode 的核心原因。實戰建議:使用 Objects.hash(field1, field2...)(Java 7+)或 Apache Commons Lang 的 HashCodeBuilder 生成高質量哈希碼,字段選取應與 equals() 保持一致。
getClass() 返回表示對象運行時類的 Class 對象。該 Class 對象由該類的 static synchronized 方法鎖定。它是反射機制的入口,常用於:
obj.getClass().getName()obj.getClass() == String.class(比 instanceof 更嚴格,不考慮繼承)clone() 受保護,需實現 Cloneable 標記接口才能調用,否則拋出 CloneNotSupportedException。Object 默認實現為淺拷貝:
深拷貝實現策略:
clone() 手動遞歸拷貝引用字段new User(user))注意:數組默認實現 Cloneable,arr.clone() 為淺拷貝;多維數組僅第一維深拷貝。
equals() 時必須重寫 hashCode(),字段集合保持一致。Objects.equals() 和 Objects.hash() 簡化代碼並處理空值。clone(),優先選擇拷貝構造函數或工廠方法。toString() 應返回清晰、可讀的對象信息,便於日誌調試。finalize() 已棄用(Java 9),資源釋放請用 try-with-resources 或 Cleaner API。掌握 Object 類契約,不僅是面試必考點,更是編寫正確、高性能 Java 代碼的內功心法。