Java静态代码块按类加载机制执行:先父类后子类、先静态后实例、按声明顺序;在类首次主动使用时由JVM于方法中执行一次。
Java静态代码块的执行顺序由类加载机制决定,核心原则是:先父类后子类、先静态后实例、按声明顺序执行。它不依赖对象创建,而是在类首次被主动使用时,由JVM在类初始化阶段(方法中)统一执行一次。
静态代码块属于“类初始化”阶段(Initialization),发生在以下任一情况首次发生时:
new MyClass())Class.forName("MyClass"))注意:子类引用父类的静态字段(且该字段不是编译期常量),只会触发父类初始化,不会触发子类初始化。
在同一类中,所有静态代码块和静态变量赋值语句,按它们在源码中出现的自上而下顺序合并进方法:
static int a = 10;)等价于一个隐式静态块static { ... } 块之间严格按书写顺序执行static int x = initX();,再有 static { y = 20; },则 initX() 先执行当子类首次被主动使用时,JVM会确保父类已初始化,因此完整顺序为:
这个链条保证了子类能安全使用已初始化完成的父类静

容易混淆的点:
System.out.println("Loading: X"),配合类加载日志验证基本上就这些。理解静态块本质是的一部分,就能自然理清所有顺序问题。