static块在子类构造器之前执行,且属于类初始化阶段,先父类后子类,仅执行一次,早于任何对象创建,不可访问this或非静态成员。

是的,static 块在子类构造器之前执行——而且不仅“之前”,它甚至在任何子类对象被创建之前就已完成执行。
关键在于:static 块属于类初始化阶段,触发时机是类首次被主动使用(如 new 子类、调用子类静态方法、访问子类非编译期常量的 static 字段等),而这个阶段发生在任何构造器运行之前,且只执行一次。
具体来说:
- 父类 static 块先执行(类加载时最先触发)
- 然后是子类 static 块(子类被首次主动使用时触发,此时父类已初始化完毕)
- 此时整个类初始化完成,后续才可能进入对象创建流程
- 当执行
new Child()时,才会依次触发:父类实例块 → 父类构造器 → 子类实例块 → 子类构造器
所以 static 块和子类构造器之间隔着两个阶段:
① 类初始化(含所有 static 块)→ 完成后类才“准备好”
② 对象实例化(含实例块、构造器)→ 此时才开始调用构造器
常见误解是认为“static 块在 new 的那一刻才跑”,其实它可能早于 new 很久——比如你先调用了子类的静态方法,static 块就已执行;之后再 new,它不会再跑。
注意:多个 static 块按源码从上到下顺序执行;若某个 static 块抛出未捕获异常,整个类初始化失败,后续对该类的所有访问都会直接报 ExceptionInInitializerError。
- static 块不能访问 this 或非静态成员
- 它适合做一次性全局准备(如注册驱动、加载配置、校验静态常量)
- 即使子类从未被 new,只要被主动引用,static 块也会执行
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











