static块在类初始化阶段与静态变量赋值按源码顺序交错执行,属于JVM的<clinit>方法;父类静态部分先于子类执行;不可访问非静态成员或未声明的静态变量。

Java 中 static 块(静态代码块)处于类初始化阶段的最前端,且与静态变量显式赋值语句混合执行,严格按源码书写顺序从上到下运行。
它不是独立于静态变量之外的“第二步”,也不是统一放在所有静态变量之后——而是和 static int x = init(); 这类声明处赋值交错穿插、逐行触发。
static 块在类初始化中的实际位置
- 它属于 JVM 类加载生命周期中的 Initialization(初始化)阶段,由类首次主动使用触发(如
new、调用静态方法、访问非编译期常量的静态字段等)。 - 所有静态成员(含
static变量赋值语句和static{}块)被 JVM 合并进一个特殊方法<clinit>,按源码中出现的文本顺序依次执行。 - 举例说明:
static { System.out.println("A"); } // 第1行 → 先执行 static int x = getValue(); // 第2行 → 接着执行 getValue() static { System.out.println("B"); } // 第3行 → 再执行 static int y = 10; // 第4行 → 最后赋值输出顺序就是 A → getValue() 返回值 → B → y=10。
Java Maven Common下载Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
static 块在继承关系中的位置
- 父类静态部分必须先完成,子类静态部分才开始:
- 父类静态变量默认值(准备阶段)
- 父类静态变量显式赋值 + 静态块(按源码顺序)
- 子类静态变量默认值
- 子类静态变量显式赋值 + 静态块(按源码顺序)
⚠️ 注意:哪怕只
new子类对象,父类的static块也会先跑一遍,且仅一次。立即学习“Java免费学习笔记(深入)”;
static 块不能做的事
- 访问任何非静态成员(编译直接报错)
- 引用尚未声明的静态变量进行读取(“非法前向引用”错误)
- 在初始化失败时恢复——一旦抛出未捕获异常,整个类进入失败状态,后续访问抛
NoClassDefFoundError
不复杂但容易忽略

















