一、类概述
Object 是 Java 类型体系的 根类(Root Class),所有类的直接或间接父类。它定义了 Java 对象最基础的行为契约——身份标识、线程协作、生命周期、泛化表示。
- 继承体系:无父类(它是继承树的根)
- 实现接口:无
- 声明方式:
public class Object - 核心职责:提供每个对象都应具备的通用能力
💡 类比:如果把 Java 对象比作"公民",那
Object就是"宪法",定义了每个公民最基本的权利和义务——你是谁、怎么比较、怎么被唤醒、怎么被销毁。
二、关键字段与常量
Object 本身 没有任何字段和常量。这是刻意为之的设计——作为所有对象的基类,它必须保持零状态开销。任何字段都会增加每个对象实例的内存占用。
但 JVM 在对象头(Object Header)中为每个 Object 实例自动维护了三块元数据:
| 元数据 | 大小(64位JVM) | 作用 |
|---|---|---|
| Mark Word | 8 字节 | 哈希码、GC 分代年龄、锁状态标志、偏向线程ID |
| 类型指针(Klass Pointer) | 4 字节(开启压缩)/ 8 字节 | 指向方法区中该对象的 Class 元数据 |
| 数组长度(仅数组对象有) | 4 字节数组长度 | 数组特有 |
⚠️ 这就是为什么一个空
new Object()实际占用 16 字节(Mark Word 8 + Klass Pointer 8,开启指针压缩时 12 字节并补齐到 16
三、核心构造方法与实例获取
构造方法
// Object.java (JDK 17) private static native void registerNatives(); static { registerNatives(); } @IntrinsicCandidate public Object() {}逐行解析:
registerNatives():静态代码块中调用 JNI 注册本地方法。这个方法在类加载时就执行,将Object的 native 方法(如hashCode()、wait()等)链接到 JVM C++ 实现。@IntrinsicCandidate注解标记此构造方法可能被 JIT 编译器用内联 intrinsic 替代,避免普通方法调用开销。public Object():构造方法体完全为空。创建对象时,JVM 负责分配内存并初始化对象头,Java 层面无需额外操作。
🔑 如何获取实例:通过
new关键字或反射Object.class.getDeclaredConstructor().newInstance()。由于它是公共构造方法,任何人都能直接实例化——虽然单独创建一个裸Object没太大实际意义。
四、核心方法源码级解析
方法一:hashCode() —— 身份指纹
@IntrinsicCandidate public native int hashCode();这是一个 native 方法,由 JVM 实现。但它背后有一套完整的规范约束(Java SE 规范 §3.2):
- 一致性原则:同一个对象在程序执行期间,多次调用
hashCode()必须返回相同的整数(前提是对象上用于equals()比较的信息未被修改) - 等价等值原则:如果两个对象通过
equals()比较相等,则它们的hashCode()也必须相同 - 不等不要求:如果两个对象
equals()不等,它们的hashCode()可以相同(但哈希碰撞会影响性能)
JVM 默认实现策略(HotSpot):
- 首次调用:使用 Marsaglia's xor-shift 随机数生成器 生成一个值,