Object解析-cnblog

Object 类全部 11 个方法详解

java.lang.Object 是所有类的根父类,所有对象都继承它的全部方法,分 native 本地方法、普通Java方法两大类。

全部方法清单

// 1. native 本地方法
public native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
private static native void registerNatives();

// 2. 普通Java实现方法
public boolean equals(Object obj);
public String toString();
protected void finalize() throws Throwable;
public void wait() throws InterruptedException;
public void wait(long timeout) throws InterruptedException;
public void wait(long timeout, int nanos) throws InterruptedException;
public void notify();
public void notifyAll();

逐个讲解

1. registerNatives()

  • private static native
  • JVM自动调用,用来注册本类中所有native方法,开发者不用管。

2. getClass()

public native Class<?> getClass()
  • 作用:运行时返回对象的运行时Class字节码对象(反射入口)
  • 特点:native方法;final不可重写
User u = new User();
Class<?> clazz = u.getClass();

3. hashCode()

public native int hashCode()
  • 返回对象哈希值,native底层实现
  • 契约:
    1. 同一对象多次调用,哈希值不变;
    2. equals() 相等的两个对象,hashCode必须相等;
    3. hashCode相等,equals不一定相等(哈希碰撞)。
  • 用途:HashMap、HashSet 哈希表存储。
  • 默认:根据对象内存地址生成哈希。

4. equals(Object obj)

public boolean equals(Object obj)

默认实现:直接 == 判断地址是否相同

public boolean equals(Object obj) {
    return (this == obj);
}
  • ==:基础类型比值,引用类型比内存地址
  • 重写场景:String、Integer、实体类,比较内容相等
    例:String重写equals,只对比字符内容。
  • 规范:重写equals必须重写hashCode,否则哈希集合出错。

5. clone()

protected native Object clone() throws CloneNotSupportedException
  • native本地方法,内存二进制拷贝,默认浅拷贝
  • 使用前提:类实现 Cloneable 空标记接口,否则抛异常
  • 返回新对象,不调用构造方法,直接复制内存字段。

6. toString()

public String toString()

默认实现:类名@十六进制哈希值

return getClass().getName() + "@" + Integer.toHexString(hashCode());

业务中几乎都会重写,输出对象属性方便打印日志。

7. finalize()

protected void finalize() throws Throwable
  • 对象被GC回收前执行一次,纯Java方法
  • 不推荐使用:执行时机不确定,JVM不保证一定执行;Java9标记废弃。
  • 作用:释放资源(文件流、连接,现在用try-with-resources替代)。

8/9/10 wait() 三个重载(线程等待,锁机制)

public final void wait() throws InterruptedException
public final void wait(long timeout)
public final void wait(long timeout, int nanos)

作用:释放当前锁,线程进入等待队列,被notify唤醒或超时自动唤醒。

  • 必须在 synchronized 同步代码块/同步方法中调用,否则抛 IllegalMonitorStateException
  • final 不能重写。

11. notify()

public final void notify()

随机唤醒一个正在此对象锁上等待的线程。

12. notifyAll()

public final void notifyAll()

唤醒所有在此对象锁上等待的线程。

分组记忆(面试背诵)

  1. 反射/克隆相关:getClass()、clone()
  2. 哈希相等判断:hashCode()、equals()、toString()
  3. GC回收:finalize()
  4. 线程同步锁(等待唤醒):wait() 三版本、notify()、notifyAll()
  5. 底层初始化:registerNatives()

高频面试考点

  1. equals 和 == 的区别;重写equals为什么必须重写hashCode?
  2. clone() 浅拷贝、深拷贝实现;Cloneable接口作用;
  3. wait和sleep区别:wait释放锁,sleep不释放;wait属于Object,sleep属于Thread;
  4. notify与notifyAll区别;
  5. finalize方法为什么废弃。
posted @ 2026-07-17 22:38  alij  阅读(5)  评论(0)    收藏  举报