静态代码块和声明处赋值按源码顺序执行,合并入<clinit>方法;父类先于子类初始化;异常导致类初始化失败并抛NoClassDefFoundError。
静态代码块和声明处赋值都属于类初始化阶段,它们的执行顺序严格按源码中出现的先后位置决定——谁写在上面,谁就先执行。
Java 把所有静态变量显式初始化(如 static int x = getValue();)和静态代码块(static { ... })合并进同一个 <clinit> 方法,JVM 按文件从上到下扫描并依次插入指令:
static int y;),也在“准备阶段”被设为默认值(0 / null / false),但显式初始化动作仍按代码位置触发。字段名在整个类体中都处于作用域内,所以静态块里可以提前给尚未声明的静态字段赋值(编译通过),但最终值由执行顺序决定:
例如:static { a = 2; } 写在 static int a = 1; 前,a 最终是 1,不是 2。
立即学习“Java免费学习笔记(深入)”;
子类首次被主动使用时,JVM 保证父类静态部分全部完成后再执行子类静态部分:
静态变量初始化或静态块中抛出未捕获异常(如 NullPointerException),会导致:
<clinit> 执行立即终止;NoClassDefFoundError;