第 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 契约
契约:
- 两个对象
equals相等 →hashCode必须相等 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 | 默认 == ,需要重写为值比较 |
| hashCode | equals 相等 → hashCode 必须相等 |
| toString | 调试友好,默认输出无意义 |
动手练习
练习 1:基础题
实现一个 Money 类(amount + currency),正确重写 equals、hashCode、toString。
下一章:第 24 章:String 不可变性 →