首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Object 類核心方法深度解析:clone、equals、hashCode、toString 契約與最佳實踐

     編輯:Java 程式設計入門

Object 類:所有類別的共同祖先

  • 位於 java.lang 套件,無需顯式匯入
  • 類別繼承體系根節點,唯一無父類別的類別
  • 所有類別(含陣列)隱含繼承其方法

核心方法詳解

1. protected Object clone()

protected Object clone() throws CloneNotSupportedException

使用條件:

  1. 類別必須實作 Cloneable 標記介面,否則拋出異常
  2. 覆寫時需改為 public 供外部呼叫

淺拷貝 vs 深拷貝:預設為淺拷貝(引用型別欄位共享同一物件),深拷貝需手動遞歸拷貝引用欄位。

2. boolean equals(Object obj)

Object 預設實作:

public boolean equals(Object obj) { return (this == obj); }

即預設等同於 == 比較記憶體位址。

覆寫契約(五大特性):

特性規定
自反性x.equals(x) == true
對稱性x.equals(y) ⇔ y.equals(x)
傳遞性x.equals(y) ∧ y.equals(z) ⇒ x.equals(z)
一致性多次呼叫結果一致(前提:比較欄位未變)
非空性x.equals(null) == false

鐵律:覆寫 equals 必須同步覆寫 hashCode,反之亦然。

3. int hashCode()

契約:

  1. 同一物件多次呼叫返回相同值(單次 JVM 運行期)
  2. equals 判定相等 → hashCode 必須相等
  3. equals 不相等 → hashCode 可相同也可不同(但不同能提升雜湊表效能)

Object 預設實作基於記憶體位址計算,適合身份比較;業務比較需依據業務鍵值計算。

4. String toString()

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

用途:System.out.println(obj) 自動呼叫。建議覆寫返回業務可讀資訊(如 "User{id=1, name='Tom'}"),利於除錯與日誌。

實戰覆寫範本

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return id == user.id && Objects.equals(name, user.name);
}

@Override
public int hashCode() {
    return Objects.hash(id, name);
}

@Override
public String toString() {
    return "User{id=" + id + ", name='" + name + "'}";
}

參考資源

官方 JavaDoc 與 JDK 原始碼(src.zip)是最權威教材。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved