Java继承初始化顺序为静态优先、父类优先:先自顶向下执行所有类的静态变量和静态块(仅一次),再自顶向下执行实例变量、构造块和构造方法(每次new时)。

Java继承关系下的初始化顺序,核心就两条:静态优先、父类优先。不是看写了几个类,而是看执行时JVM怎么一层层往下推。
静态部分只执行一次,从顶层父类开始
类第一次被主动使用(比如 new、调用静态方法、访问静态字段)时触发。JVM会沿着继承链向上找到 Object,但实际执行起点是你定义的最顶层父类。
- 按源码声明顺序,先执行该类所有静态变量赋值语句
- 遇到 static {} 块,立刻执行
- 完成顶层父类后,再执行其直接子类的静态变量和静态块
- 逐层向下,直到最底层子类的静态内容全部跑完
- 整个过程仅发生一次,后续无论创建多少对象都不再重复
每次 new 时才走实例初始化,仍从父类起步
堆内存分配完成后,并不直接进子类构造方法,而是从 Object() 构造器入口启动调用链。
- 进入某一层类的构造流程前,先完成它的所有实例变量赋值 + {} 构造块(二者按源码顺序混合执行)
- 再执行该层类的构造方法体
- 返回上一层,对子类重复相同动作:实例变量/构造块 → 构造方法
- Object 类虽无显式代码,但它有默认无参构造器,是整个链条的起点
同一层级内,字段和构造块地位等同
编译后,非静态字段初始化语句和 {} 构造块都会被合并到每个构造方法开头(super() 调用之后),谁写在上面谁先执行。
立即学习“Java免费学习笔记(深入)”;
- 例如父类中先写 int a = 1;,再写 { System.out.println("block"); },则先赋值 a 再打印 block
- 子类的实例初始化一定晚于父类全部实例初始化步骤
- 静态和实例阶段严格隔离:所有静态内容执行完毕,才开始任何实例初始化
完整链条示例(GrandFather → Father → Son)
执行 new Son() 时,真实顺序如下:
- GrandFather 静态变量 → GrandFather 静态块
- Father 静态变量 → Father 静态块
- Son 静态变量 → Son 静态块
- GrandFather 实例变量 → GrandFather 构造块 → GrandFather 构造方法
- Father 实例变量 → Father 构造块 → Father 构造方法
- Son 实例变量 → Son 构造块 → Son 构造方法


















