静态代码块优先执行且仅一次,父类先于子类;new对象时按父static→子static→父字段/普通块→父构造器→子字段/普通块→子构造器顺序执行。

静态代码块优先执行,且只执行一次
静态代码块在类加载时执行,与对象创建无关。父类静态代码块先于子类静态代码块执行,且整个 JVM 生命周期中每个类仅执行一次。即使多次 new 子类实例,静态代码块也不会重复运行。
示例逻辑顺序:
- 父类 static 块 →
- 子类 static 块 →
构造器调用链触发非静态初始化
当 new 子类对象时,JVM 自动插入 super()(显式或隐式)调用父类构造器。因此执行顺序严格遵循继承链自顶向下:
- 父类普通代码块(成员变量初始化之后、构造器主体之前)→
- 父类构造器主体 →
- 子类普通代码块 →
- 子类构造器主体
注意:普通代码块(即非 static 的 {} 块)每次实例化都会执行,位置在对应类构造器的最开头(在 super() 调用之后,但实际写法中它位于构造器外、类体内)。
立即学习“Java免费学习笔记(深入)”;
字段初始化与代码块的嵌入时机
类中定义的字段若含初始化表达式(如 private int x = getValue();),其执行时机等同于普通代码块:在对应类的构造器中,super() 返回后、构造器代码开始前插入。多个字段初始化和普通代码块按它们在源码中出现的**文本顺序**依次执行。
例如:
- int a = 1;(字段初始化)
- { System.out.println("block A"); }(普通代码块)
- int b = calc();(另一字段初始化)
三者将按 a → block A → b 的顺序执行。
完整执行流程图(从 new Sub() 开始)
以 new Sub() 为例,假设 Parent 和 Sub 均含 static 块、普通代码块、字段初始化和构造器:
- Parent.static 块(类首次加载)
- Sub.static 块(Sub 类首次加载)
- Parent.字段初始化 + Parent.普通代码块
- Parent.构造器主体
- Sub.字段初始化 + Sub.普通代码块
- Sub.构造器主体
该顺序稳定可靠,是理解 Java 对象构建生命周期的关键基础。


















