父类静态代码块在子类首次主动使用时(如new child()、调用子类静态方法等)即执行,且仅一次:jvm先加载并初始化父类(按源码顺序执行静态变量赋值和静态代码块),再初始化子类,该过程属类加载阶段,与对象实例化无关。

父类的静态代码块在子类对象实例化前就已执行完毕,且只执行一次——它不依赖于 new,而是由类加载机制触发。
父类静态代码块何时执行
当 JVM 第一次主动使用子类(例如执行 new Child()、调用子类 static 方法、访问子类 static 字段等)时,会启动类加载流程。由于继承关系,JVM 必须先确保父类已加载并初始化,因此:
- 先加载父类,执行其静态变量赋值(按源码顺序)
- 再执行父类中所有静态代码块(同样按源码顺序)
- 之后才加载并初始化子类的静态部分
这个过程与是否创建对象无关,哪怕你只写 Child.staticMethod(),也会触发父类静态代码块执行。
为什么不是“实例化时才执行”
静态代码块属于类级别,归类加载阶段管理;而“实例化”属于对象创建阶段,发生在类加载完成之后。两者分属不同生命周期:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 类加载阶段:仅一次,决定“类是否准备好”
- 实例化阶段:每次
new都发生,决定“每个对象是否安全可用”
所以准确说:父类静态代码块不是在子类实例化“时”执行,而是在实例化“之前”、且“仅第一次”被触发。
常见误区提醒
以下情况不会重复执行父类静态代码块:
- 多次
new Child()—— 只有第一次触发类加载 - 子类中有多个静态代码块 —— 它们按书写顺序执行,但父类的早已跑完
-
main方法写在子类里 —— 程序启动即加载子类,进而强制加载并初始化父类
若想验证,可在父类静态块中加日志,比如 System.out.println("[S] Parent static");,运行后只会输出一次。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










