一、Object 类的全部方法(按常用度排序)
Object 类共有 11 个方法(含 2 个 wait 重载、1 个 finalize 已废弃),核心常用方法如下:
表格
| 方法签名 | 核心作用 | 是否可重写 |
|---|---|---|
public String toString() |
返回对象的字符串表示 | ✅ 推荐重写 |
public boolean equals(Object obj) |
判断两个对象是否 "相等" | ✅ 推荐重写 |
public int hashCode() |
返回对象的哈希码值 | ✅ 重写 equals 必须重写 |
public final Class<?> getClass() |
获取对象的运行时类 | ❌ 不可重写 |
public native int hashCode() |
返回对象哈希码(native 方法) | ✅ 需配合 equals 重写 |
public final void notify() |
唤醒等待该对象锁的一个线程 | ❌ 不可重写 |
public final void notifyAll() |
唤醒等待该对象锁的所有线程 | ❌ 不可重写 |
public final void wait() throws InterruptedException |
让当前线程等待,释放对象锁 | ❌ 不可重写 |
public final void wait(long timeout) throws InterruptedException |
带超时的等待 | ❌ 不可重写 |
public final void wait(long timeout, int nanos) throws InterruptedException |
高精度超时等待 | ❌ 不可重写 |
protected void finalize() throws Throwable |
垃圾回收前的清理操作 | ✅ 但已废弃(Java 9+) |
protected native Object clone() throws CloneNotSupportedException |
复制对象 | ✅ 需实现 Cloneable 接口 |
二、核心方法详解(附代码示例)
1. toString()
- 默认实现 :返回
类名@哈希码的十六进制(如com.example.User@15db9742),可读性差。 - 重写目的:返回包含对象核心属性的字符串,方便调试 / 日志输出。
- 示例:
java
运行
public class User {
private String name;
private int age;
// 重写 toString
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
// 构造器、getter/setter 省略
public static void main(String[] args) {
User user = new User("张三", 20);
System.out.println(user); // 直接打印对象,底层调用 toString()
// 输出:User{name='张三', age=20}
}
}
2. equals(Object obj)
- 默认实现 :比较两个对象的内存地址 (
this == obj),即 "是否是同一个对象"。 - 重写目的 :比较对象的内容 / 属性(如两个 User 的 name 和 age 都相同则认为相等)。
- 重写规则 :
- 自反性:
x.equals(x)必须返回 true; - 对称性:
x.equals(y)则y.equals(x); - 传递性:
x.equals(y)且y.equals(z)则x.equals(z); - 一致性:多次调用结果不变(对象属性未变时);
- 非空性:
x.equals(null)必须返回 false。
- 自反性:
- 示例:
java
运行
@Override
public boolean equals(Object obj) {
// 1. 地址相同,直接返回 true
if (this == obj) return true;
// 2. obj 为 null 或类型不同,返回 false
if (obj == null || getClass() != obj.getClass()) return false;
// 3. 强转后比较属性
User user = (User) obj;
return age == user.age && Objects.equals(name, user.name);
// 用 Objects.equals 避免空指针(name 为 null 时不会报错)
}
3. hashCode()
- 核心规则 :
- 同一对象多次调用
hashCode(),返回值必须相同(属性未变时); - 若
x.equals(y)为 true,则x.hashCode() == y.hashCode(); - 若
x.equals(y)为 false,hashCode()可以相同(但尽量不同,提升哈希表效率)。
- 同一对象多次调用
- 重写要求 :重写 equals 必须重写 hashCode(否则 HashMap/HashSet 等哈希容器会失效)。
- 示例:
java
运行
@Override
public int hashCode() {
// 用 Objects.hash 生成哈希码,自动处理 null
return Objects.hash(name, age);
}
4. getClass()
- 作用 :获取对象的运行时类(Class 对象),用于反射、判断对象类型。
- 特点:final 方法,不可重写;返回的是实际运行时的类(而非声明类型)。
- 示例:
java
运行
Object obj = new User("李四", 25);
Class<?> clazz = obj.getClass();
System.out.println(clazz.getName()); // 输出:com.example.User
System.out.println(clazz == User.class); // true
5. wait()/notify()/notifyAll()
- 核心场景:多线程通信(基于对象锁的等待 / 唤醒机制)。
- 使用前提 :必须在
synchronized同步代码块 / 方法中调用(否则抛IllegalMonitorStateException)。 - 核心逻辑 :
wait():当前线程释放对象锁,进入等待队列,直到被notify()/notifyAll()唤醒或超时;notify():随机唤醒一个等待该对象锁的线程;notifyAll():唤醒所有等待该对象锁的线程。
- 示例:
java
运行
public class WaitNotifyDemo {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
// 等待线程
new Thread(() -> {
synchronized (lock) {
try {
System.out.println("线程1:等待中...");
lock.wait(); // 释放锁,进入等待
System.out.println("线程1:被唤醒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Thread.sleep(1000); // 确保线程1先执行
// 唤醒线程
new Thread(() -> {
synchronized (lock) {
System.out.println("线程2:唤醒等待线程");
lock.notify(); // 唤醒一个等待线程
}
}).start();
}
}
6. clone()
- 作用 :创建对象的 "副本",默认是浅拷贝(基本类型复制值,引用类型复制地址)。
- 使用条件 :
- 类必须实现
Cloneable接口(否则抛CloneNotSupportedException); - 重写
clone()方法(并修改为 public)。
- 类必须实现
- 示例:
java
运行
public class User implements Cloneable {
private String name;
private int age;
// 重写 clone,改为 public
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone(); // 浅拷贝
}
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User("张三", 20);
User u2 = u1.clone();
System.out.println(u1 == u2); // false(不同对象)
System.out.println(u1.equals(u2)); // true(属性相同)
}
}
7. finalize()
- 现状:Java 9 标记为废弃(@Deprecated),Java 18 彻底移除。
- 原作用:垃圾回收器回收对象前调用,用于释放资源(如关闭文件、连接)。
- 问题 :执行时机不确定、可能导致内存泄漏,推荐用
try-with-resources或手动关闭资源替代。
三、Object 核心知识点
-
所有类的父类:
- 显式继承:
class A extends Object {}(可省略); - 隐式继承:
class A {}等价于class A extends Object; - 数组、枚举、接口的实现类都间接继承 Object。
- 显式继承:
-
null 与 Object:
null表示 "没有对象",不能调用 Object 的任何方法(否则抛NullPointerException);- 可以将
null赋值给 Object 类型变量:Object obj = null;。
-
equals 与 == 的区别:
==:基本类型比较值,引用类型比较内存地址;equals:默认等价于==,重写后可比较对象内容。
-
native 方法:
- Object 中的
hashCode()、clone()、wait()等是 native 方法(底层由 C/C++ 实现),用于提升性能。
- Object 中的
总结
- 核心方法 :
toString()(重写提升可读性)、equals()+hashCode()(成对重写,保证相等对象哈希码相同)是日常开发中最常重写的方法; - 线程相关 :
wait()/notify()/notifyAll()是多线程通信的基础,必须在 synchronized 块中使用; - 核心规则 :所有类继承 Object,重写
equals()必须重写hashCode(),finalize()已废弃,推荐手动管理资源。