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底层实现
- 契约:
- 同一对象多次调用,哈希值不变;
equals()相等的两个对象,hashCode必须相等;- 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()
唤醒所有在此对象锁上等待的线程。
分组记忆(面试背诵)
- 反射/克隆相关:getClass()、clone()
- 哈希相等判断:hashCode()、equals()、toString()
- GC回收:finalize()
- 线程同步锁(等待唤醒):wait() 三版本、notify()、notifyAll()
- 底层初始化:registerNatives()
高频面试考点
- equals 和 == 的区别;重写equals为什么必须重写hashCode?
- clone() 浅拷贝、深拷贝实现;Cloneable接口作用;
- wait和sleep区别:wait释放锁,sleep不释放;wait属于Object,sleep属于Thread;
- notify与notifyAll区别;
- finalize方法为什么废弃。

浙公网安备 33010602011771号