准备阶段为static变量分配内存并设零值(如int为0),赋值123发生在初始化阶段的方法中;该设计确保变量先有安全默认值,再按序执行显式赋值。

因为 static int a = 123; 的赋值动作(即把 123 写入变量)发生在初始化(Initialization)阶段,而不是准备(Preparation)阶段。
准备阶段只做两件事
准备阶段是类加载过程中的一个独立步骤,它的职责非常明确:
- 为 static 成员变量 分配内存空间(在方法区/元空间)
- 设置它们的默认初始值(不是你写的值,而是 JVM 规定的零值)
对于基本类型:
– int 的默认初始值就是 0
– long/double/float/short/byte/char/boolean 对应为 0L/0.0/0.0/0/0/’\u0000’/false
123 是在初始化阶段才真正赋上的
准备阶段结束后,JVM 才进入初始化阶段。此时才会执行类构造器
换句话说:
- 准备阶段:分配内存 + 写入 0
- 初始化阶段:执行 a = 123 → 把 0 覆盖为 123
为什么设计成这样?
这种分阶段机制保证了类加载的安全性和顺序性:
- 所有 static 变量先有确定内存位置和安全默认值(比如不会是随机垃圾值)
- 再按代码顺序、依赖关系统一执行显式赋值和静态代码块
- 避免因初始化顺序混乱导致读取未定义值
所以看到 static int a = 123;,不要误以为“声明即赋值”发生在准备阶段——那是语法糖带来的错觉。JVM 底层严格区分“分配+清零”和“执行赋值”两个动作。










