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

Java Object 類核心方法深度解析:toString、equals、hashCode、clone、finalize

     編輯:Java 相關知識

Object:所有類的根父類

Java 中所有類隱含繼承 java.lang.Object。掌握其 11 個方法(含 wait/notify 族群)是理解物件行為的基石。

核心非 final 方法 (可/須覆寫)

方法預設行為覆寫契約/最佳實踐
toString()類名@雜湊碼 (如 User@15db9742)回傳「物件有意義的文字描述」,建議格式:ClassName[field=value, ...]
equals(Object)參考比較 (this == obj)自反性、對稱性、傳遞性、一致性、非空性。覆寫 equals 必須覆寫 hashCode
hashCode()記憶體地址衍生 (Native)相等物件必有相同 hashCode;不變性;盡量分佈均勻。常用 Objects.hash(fields...)
clone()拋 CloneNotSupportedException實作 Cloneable、覆寫為 public、決定淺/深拷貝、考慮可變欄位防禦性複製
finalize()無操作已棄用 (JDK 9),不可靠、效能差。改用 try-with-resources、Cleaner、PhantomReference

final 方法 (不可覆寫)

  • getClass():回傳執行時類物件 Class<?>。
  • wait()/notify()/notifyAll():監視器鎖協作,必須在 synchronized 區塊內呼叫。

實戰範例:正確覆寫 equals/hashCode/toString

import java.util.Objects;

public final class Employee {
    private final String id;
    private final String name;
    private final int age;

    public Employee(String id, String name, int age) {
        this.id = Objects.requireNonNull(id);
        this.name = Objects.requireNonNull(name);
        this.age = age;
    }

    // Getter 略

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee that = (Employee) o;
        return age == that.age && id.equals(that.id) && name.equals(that.name);
    }

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

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

常見錯誤

  1. equals 參數型別寫成具體類:public boolean equals(Employee e) → 這是**多載**而非覆寫,集合查找失效。
  2. 只覆寫 equals 不覆寫 hashCode:違反契約,導致 HashMap/HashSet 行為異常。
  3. 可變欄位參與 equals/hashCode:物件放入 Set 後修改欄位 → 找不回來。
  4. clone 僅做淺拷貝:內部可變物件 (List, Date, 自定義) 被共享,修改副本影響原物件。

現代替代方案

  • 資料類別:JDK 14+ record Employee(String id, String name, int age) {} 自動產生正確的 equals/hashCode/toString/建構子/存取子,且不可變。
  • Lombok:@Data / @Value / @EqualsAndHashCode 編譯期生成。
  • IDE 產生:Alt+Insert → Generate equals/hashCode/toString,勾選使用 Objects 工具類。

總結

Object 方法定義了物件的身份、相等性、文字表現與生命週期協議。深刻理解 equals/hashCode 契約與 toString 診斷價值,是寫出正確集合操作、除錯友善、可維護代碼的前提。現代開發優先使用 record 或工具生成,避免手寫錯誤。

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