java静态变量在初始化阶段才被显式赋值,准备阶段仅设默认值;final static基本类型或字符串字面量例外,编译期确定并在准备阶段赋值;非final static字段的初始化由方法按源码顺序执行,且仅在类首次主动使用时触发。

Java 中静态变量在类加载的初始化阶段被真正赋值,不是加载、准备或解析阶段。
准备阶段只设默认值,不执行你的代码
在准备阶段,JVM 仅为 static 变量分配内存,并赋予类型默认值:int 是 0、boolean 是 false、引用类型是 null。你写的 static int x = 10; 中的 = 10 这部分完全被跳过——此时 x 的值就是 0,不是 10。
- final static 基本类型或字符串字面量是例外,它们的值在编译期确定,准备阶段就直接写入内存
- 非 final 的 static 字段,哪怕写了初始值,也得等到初始化阶段才生效
初始化阶段才执行显式赋值和静态块
这个阶段由 JVM 自动生成并执行
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 比如 static int a = b + 1; 和 static int b = 5; 相邻声明,a 实际得到的是 0 + 1(因为 b 尚未执行赋值,仍为准备阶段的默认值 0)
- 父类的
总是先于子类执行 - 整个过程只发生一次,且仅当类被首次主动使用时触发
什么操作会走到初始化这一步
只有“主动使用”才会真正触发初始化阶段,包括:
- new 该类实例
- 访问或修改该类的非 final 静态字段
- 调用该类的静态方法
- 反射调用 Class.forName("Xxx")(第二个参数为 true 或省略)
- 初始化子类时,若父类未初始化,则先初始化父类
注意:访问 public static final int MAX = 100; 这类编译期常量,不会触发类初始化——它的值早已内联进调用方字节码里了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










