☰
坚持看完这套 JDK 源码系列,彻底摆脱 CRUD 开发|专题:java.lang.Object 源码解读
2026/10/5 12:10:50 网站建设 项目流程

一、类概述

Object 是 Java 类型体系的 根类(Root Class),所有类的直接或间接父类。它定义了 Java 对象最基础的行为契约——身份标识、线程协作、生命周期、泛化表示。

  • 继承体系:无父类(它是继承树的根)
  • 实现接口:无
  • 声明方式:public class Object
  • 核心职责:提供每个对象都应具备的通用能力

💡 类比:如果把 Java 对象比作"公民",那 Object 就是"宪法",定义了每个公民最基本的权利和义务——你是谁、怎么比较、怎么被唤醒、怎么被销毁。

二、关键字段与常量

Object 本身 没有任何字段和常量。这是刻意为之的设计——作为所有对象的基类,它必须保持零状态开销。任何字段都会增加每个对象实例的内存占用。

但 JVM 在对象头(Object Header)中为每个 Object 实例自动维护了三块元数据:

元数据大小(64位JVM)作用
Mark Word8 字节哈希码、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() {}

逐行解析:

  1. registerNatives():静态代码块中调用 JNI 注册本地方法。这个方法在类加载时就执行,将 Object 的 native 方法(如 hashCode()、wait() 等)链接到 JVM C++ 实现。@IntrinsicCandidate 注解标记此构造方法可能被 JIT 编译器用内联 intrinsic 替代,避免普通方法调用开销。
  2. public Object():构造方法体完全为空。创建对象时,JVM 负责分配内存并初始化对象头,Java 层面无需额外操作。

🔑 如何获取实例:通过 new 关键字或反射 Object.class.getDeclaredConstructor().newInstance()。由于它是公共构造方法,任何人都能直接实例化——虽然单独创建一个裸 Object 没太大实际意义。


四、核心方法源码级解析

方法一:hashCode() —— 身份指纹

@IntrinsicCandidate public native int hashCode();

这是一个 native 方法,由 JVM 实现。但它背后有一套完整的规范约束(Java SE 规范 §3.2):

  1. 一致性原则:同一个对象在程序执行期间,多次调用 hashCode() 必须返回相同的整数(前提是对象上用于 equals() 比较的信息未被修改)
  2. 等价等值原则:如果两个对象通过 equals() 比较相等,则它们的 hashCode() 也必须相同
  3. 不等不要求:如果两个对象 equals() 不等,它们的 hashCode() 可以相同(但哈希碰撞会影响性能)

JVM 默认实现策略(HotSpot):

  • 首次调用:使用 Marsaglia's xor-shift 随机数生成器 生成一个值,

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询