父类静态代码块一定先于子类静态代码块执行,这是jvm强制保障的类加载规则;验证需通过独立测试类首次主动使用子类触发,输出严格为“parent static”→“child static”,且静态块仅执行一次。

父类静态代码块一定先于子类静态代码块执行,这个顺序不是靠猜或看代码位置,而是JVM强制保障的加载规则。验证的关键在于控制“首次主动使用”的时机,并观察输出顺序。
用最简打印语句直接观察
在父类和子类中各写一个带明确标识的静态块,例如:
- 父类:
static { System.out.println("Parent static"); } - 子类:
static { System.out.println("Child static"); }
然后在独立的测试类(非父类也非子类)中编写 main 方法,只调用一次 Child.doSomething() 或 new Child()。首次运行时,控制台会严格按 “Parent static” → “Child static” 输出,这就是最直观的验证结果。
区分触发源,避免干扰
不要把 main 方法写在子类里——否则 JVM 启动时就会加载子类,容易误以为是“子类先启动”。应另建一个 Test.java,确保类加载行为由你显式触发:
- 先调用
Parent.staticMethod():只输出父类静态块,子类不初始化 - 再调用
Child.staticMethod():立刻输出父类静态块(若未执行过),紧接着子类静态块 - 之后重复调用或 new 多个 Child 实例:静态块不再出现,说明只执行一次
注意编译期常量的例外情况
如果访问的是 public static final int VERSION = 1; 这类基本类型常量,JVM 不会触发任何类初始化,也就看不到静态块输出。要真正触发初始化,得用非常量表达式,比如:
-
public static final String CONF = loadConfig();(方法调用) - 或直接访问
Child.NON_FINAL_FIELD(非 final 静态字段)
否则可能误判“静态块没执行”,其实是根本没触发类加载。
多静态块在同一类中的执行逻辑
若父类或子类内部定义了多个静态块,它们按源码从上到下的顺序依次执行,与是否继承无关。例如:
- 父类中先写
static { a = 1; },再写static { System.out.println(a); },输出就是 1 - 但父类静态块不能引用子类的静态字段——编译报错或运行时报 NoClassDefFoundError
这种顺序可配合打印进一步拆解,确认每一块的实际执行点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











