准备阶段为类变量赋零值是jvm保障内存安全与确定性的必要机制,通过物理清零防止读取垃圾数据,仅编译期常量例外;业务值依赖运行时环境,必须延至初始化阶段执行。

准备阶段给类变量赋零值,不是疏忽或设计缺陷,而是 JVM 为保障安全、确定性和可预测性所采取的底层机制。它不执行任何 Java 代码,只做内存占位和清零,本质是“先铺路、后通车”。
零值是内存安全的强制起点
JVM 必须确保每次访问一个静态变量时,读到的绝不是操作系统内存页中残留的随机垃圾数据(比如前一个对象释放后留下的 0xCAFEBABE)。通过在准备阶段对每个字段槽位执行物理清零(如用 memset),JVM 统一将 int 设为 0、引用设为 null、boolean 设为 false——这个行为跨平台一致,与底层硬件无关。
业务值依赖执行环境,不能提前写入
你写的 static int port = Config.get("port"); 或 static List
编译期常量是唯一例外,因为它根本不需要运行时
只有 public static final String NAME = "app"; 或 static final int MAX = 100 + 2; 这类能在编译时完全确定的值,才会跳过零值阶段,直接写入。因为它们的值已固化在字节码的 ConstantValue 属性 中,不依赖任何运行期计算——这恰恰反向印证了“零值是默认兜底,真实值需条件成熟”的设计逻辑。
顺序与隔离性靠分阶段来保证
如果所有赋值都在同一阶段完成,就无法定义“谁先谁后”。而准备阶段统一设零,初始化阶段再按源码顺序执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











