java继承初始化顺序取决于类加载和对象创建两阶段:静态代码块按继承链自上而下执行;new对象时先父后子,普通代码块早于构造器执行;this()/super()须为构造器首句。

Java继承中初始化的执行顺序不是靠“记住规则”就能写对的,而是必须理解类加载、对象创建两个阶段各自触发哪些动作。关键在于:静态代码块属于类,普通代码块和构造器属于对象;父类总在子类之前完成其对应阶段的初始化。
类加载阶段:静态代码块按继承链自上而下执行
当首次主动使用某个类(如 new 子类、调用子类静态方法、访问子类静态字段等)时,JVM开始加载该类及其所有父类。此时:
- 从最顶层父类(如 Object)开始,逐级向下,每个类的 static{} 块仅执行一次
- 父类静态块先于子类静态块执行,哪怕你只 new 子类对象
- 静态成员变量的显式赋值(static String s = "x";)与静态代码块按源码顺序混合执行
对象创建阶段:先父后子,普通代码块早于构造器
执行 new Child() 时,实际发生的是一个嵌套初始化过程:
- 先调用父类构造器(隐式或显式 super()),进入父类构造流程
- 在父类构造器执行前,父类的 {} 普通代码块 + 成员变量显式赋值(int x = 5;)按源码顺序依次执行
- 父类构造器体内的语句最后执行
- 回到子类,重复上述三步:子类普通代码块/显式赋值 → 子类构造器体
构造器之间协作:this() 和 super() 的位置决定执行流
一个类内部多个构造器重载时,常通过 this() 调用本类其他构造器;子类则通过 super() 调用父类构造器。注意:
- this() 或 super() 必须是构造器的第一条语句
- 如果子类构造器没写 super(),编译器自动插入 super(),即默认调用父类无参构造器
- 若父类没有无参构造器,子类必须显式调用 super(…) ,否则编译失败
- this() 内部又可能含 super(),形成调用链,但最终都会落到某个父类构造器上
实战建议:什么时候用代码块?什么时候用构造器?
别把所有初始化逻辑都塞进构造器。合理分工更清晰:
- 用 静态代码块 做一次性类级准备:加载 JDBC 驱动、读取配置文件、初始化全局缓存
- 用 普通代码块 做对象级通用初始化:统一的日志打点、资源预分配、字段默认值设置(尤其多构造器共用时)
- 用 构造器 处理差异化逻辑:接收参数、校验输入、根据参数分支初始化、调用外部服务
- 避免在普通代码块里调用可能被子类重写的方法(存在 this 引用逸出风险)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











