JVM中类的加载、链接和初始化是顺序发生的三个阶段:加载由类加载器读取字节码并创建Class对象;链接包括验证、准备(设静态变量默认值)和解析(符号引用转直接引用);初始化执行静态代码块和赋值语句,且仅首次主动使用时发生。

JVM 中类的加载、链接和初始化是三个逻辑清晰、职责分明的阶段,它们按顺序发生(但解析可能延迟),共同完成一个 `.class` 文件到可执行 Java 类对象的转化。区分的关键在于“做什么”和“谁负责什么数据状态”。
加载:把字节码读进来,生成 Class 对象骨架
这是整个流程的起点,由类加载器(ClassLoader)主导。它不关心字节码对不对、变量值是多少,只做三件事:
- 通过类的全限定名定位 `.class` 文件(从磁盘、网络、内存等来源)
- 读取二进制字节流,转换为方法区中的运行时数据结构
- 在堆中创建一个 java.lang.Class 实例,作为该类在 JVM 中的运行时代表
此时类还不能用——没有校验、没有分配静态变量内存、更没有执行任何赋值逻辑。Class 对象只是个“空壳”,指向尚未验证的原始数据。
链接:校验 + 预备 + 解析,让类“站得住、连得上”
链接是承上启下的安全加固与结构补全阶段,分三步,全部由 JVM 自动完成,开发者不可干预:
- 验证:检查字节码是否符合 JVM 规范(比如方法调用是否越界、类型是否匹配)。防止恶意或错误 class 文件危害虚拟机
- 准备:为类的 static 变量分配内存,并设为默认值(如 int 设为 0,引用设为 null)。注意:不是代码里写的初始值,而是类型默认值
- 解析:把常量池中的符号引用(如 “#23 指向某方法名”)替换成直接引用(如“内存地址 + 偏移量”)。这是实现方法调用、字段访问的基础
经过链接,类在结构上已完整、合法、可寻址,但所有 static 初始化逻辑(比如 static { ... } 或 static int x = 5; 的 5)仍未执行。
初始化:真正执行 Java 代码,赋予类“生命”
这是唯一由 Java 字节码指令驱动的阶段,触发条件明确(如 new 实例、调用 static 方法、访问 static 字段等)。它只做一件事:
- 执行类的 初始化语句和静态代码块,按源码顺序,且仅执行一次
例如:private static int count = 10; 在准备阶段被设为 0;到初始化阶段,才真正把 10 赋给 count。父类会先于子类初始化,确保继承链基础就绪。
不复杂但容易忽略:加载可以提前(预加载),解析可以推迟(支持动态绑定),但初始化一定发生在首次主动使用时,且严格单次。


















