Java多层继承初始化严格遵循“静态优先、父类优先”规则:先自顶向下执行各层静态变量与静态块(仅一次),再每次new时自顶向下执行各层实例变量、构造块及构造方法。

Java 多层继承下的初始化,本质是沿着 Object → 祖先类 → 中间父类 → 子类 这条继承链,逐层向下完成静态和实例两阶段初始化。关键不是“有多少层”,而是每层都严格复用同一套规则:静态优先、父类优先。
静态部分:从 Object 开始,自顶向下只执行一次
类首次被主动使用(如 new、调用静态方法)时触发加载与静态初始化。JVM 沿继承链向上追溯到 java.lang.Object,但 Object 类没有用户定义的静态内容,所以实际起点是你的顶层父类。
- 按源码声明顺序,依次执行 顶层父类的静态变量赋值 → 静态代码块
- 然后是其直接子类的静态变量赋值 → 静态代码块
- 依此类推,直到最底层子类的静态部分全部执行完毕
- 整个过程只发生一次,与后续创建多少对象无关
实例部分:每次 new 时,从 Object 构造器入口开始向下推进
执行 new Child() 时,JVM 在堆中分配内存后,并不直接运行 Child 的构造方法,而是从 Object() 构造器开始启动调用链:
- 隐式调用
super()进入父类构造器前,先完成该类的实例变量赋值 + 构造块({})(二者按源码顺序混合执行) - 再执行该类的构造方法体
- 返回上一层,对子类重复相同动作:实例变量/构造块 → 构造方法
- 这个链条最终覆盖整条继承路径,包括 Object(它有默认无参构造器,但无显式构造块或字段初始化)
静态与实例之间不可交叉,层级内按声明顺序混排
静态内容全部跑完,才进入实例初始化;而同一层级(比如父类)中,字段初始化语句和构造块地位完全等同,编译后被合并进每个构造方法开头(super() 之后),谁写在上面就先执行谁。
- 例如父类中:先声明
int a = 1;,再写{ System.out.println("block"); },则输出 a=1 后再打印 block - 子类同理,且一定晚于父类所有实例初始化步骤
记住这个完整链条(以 GrandFather → Father → Son 为例)
执行 new Son() 时,真实顺序是:
- GrandFather 静态变量 → GrandFather 静态块
- Father 静态变量 → Father 静态块
- Son 静态变量 → Son 静态块
- GrandFather 实例变量 → GrandFather 构造块 → GrandFather 构造方法
- Father 实例变量 → Father 构造块 → Father 构造方法
- Son 实例变量 → Son 构造块 → Son 构造方法

















