Skip to content
第 23 / 250 章后端⏱ 10 分钟阅读

第 23 章:Object 类 — 所有类的祖先

学习目标

  • 掌握 Object 类的核心方法
  • 理解 equals / hashCode 的契约
  • 学会正确重写 toString / equals / hashCode

一、Object 是所有类的根

java
public class User {
    // 没有显式继承,但默认 extends Object
}

User u = new User();
System.out.println(u.getClass());   // class User(Object 继承)
System.out.println(u.toString());   // User@1540e19d(默认实现)
System.out.println(u instanceof Object);  // true

二、equals 默认行为

java
public boolean equals(Object obj) {
    return (this == obj);  // 默认就是 == 比较
}

必须重写 equals 的场景:业务上需要"值相等"而非"对象相同"。

java
public class User {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;                          // ① 优化:同一对象
        if (!(o instanceof User)) return false;              // ② 类型检查
        User other = (User) o;
        return age == other.age && Objects.equals(name, other.name);  // ③ 比较字段
    }
}

三、hashCode 契约

契约

  1. 两个对象 equals 相等 → hashCode 必须相等
  2. hashCode 相等 → equals 不一定相等(哈希冲突)
java
@Override
public int hashCode() {
    return Objects.hash(name, age);    // 自动基于字段生成
}

⚠️ 重写 equals 必须重写 hashCode!否则 HashMap 等会出错。

四、toString 调试友好

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

User u = new User("张三", 18);
System.out.println(u);   // User{name='张三', age=18}

五、其他 Object 方法

方法作用
getClass()返回运行时类(final)
clone()浅拷贝
finalize()GC 前调用(已废弃)
wait() / notify()线程协作(第 38 章)
toString()默认 类名@哈希码

六、本章小结

要点关键
Object所有类的根
equals默认 == ,需要重写为值比较
hashCodeequals 相等 → hashCode 必须相等
toString调试友好,默认输出无意义

动手练习

练习 1:基础题

实现一个 Money 类(amount + currency),正确重写 equals、hashCode、toString。


下一章第 24 章:String 不可变性

本站基于 VitePress 构建 · 由 Codebook 团队维护