Java继承中初始化严格遵循“静态优先、父类先行、实例紧随”:静态部分在类首次主动使用时父类→子类执行一次;实例部分每次new时父类实例块→父构造器→子类实例块→子构造器;所有初始化均按源码声明顺序执行。

Java继承中初始化块的执行不是杂乱无章的,而是严格遵循“静态优先、父类先行、实例紧随”的三层分步逻辑。关键不在于记住顺序本身,而在于理解每一步发生的时机和触发条件——静态部分只在类首次主动使用时跑一次;实例部分则每次 new 对象都重走一遍,且必须等父类完成才能轮到子类。
静态初始化:父类→子类,仅一次
当 JVM 第一次需要某个类(比如 new 子类对象、调用子类静态方法),就会触发类加载与静态初始化。此时:
- 先加载并初始化父类的全部静态内容:按代码从上到下,依次执行父类的静态变量赋值、静态代码块
- 再加载并初始化子类的全部静态内容:同样按声明顺序执行子类的静态变量赋值、静态代码块
- 这个过程不会因多次创建对象而重复,哪怕后续只访问子类静态字段,父类静态块也早已执行完毕
实例初始化:父类实例块→父构造器→子类实例块→子构造器
每次 new 一个子类对象时,JVM 为该实例分配内存后,立即开始实例初始化流程:
- 先初始化父类的普通成员:按代码顺序执行父类的实例变量赋值、实例代码块(非 static)
- 紧接着调用父类构造器(隐式或显式 super())
- 父类构造器返回后,才开始子类的普通成员初始化:执行子类的实例变量赋值、实例代码块
- 最后执行子类自己的构造器体
注意:实例代码块总在对应构造器之前执行,且每个 new 都会完整走完这一整套链路。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
代码块与变量的内部顺序:声明即执行顺序
无论是静态还是实例上下文,Java 都严格按源码中出现的先后顺序执行初始化动作:
- 静态变量 A 声明在静态块 B 之前 → A 初始化先于 B 执行
- 实例变量 X 在实例块 Y 之前声明 → X 赋值先于 Y 中的语句
- 哪怕某个静态变量初始化过程中 new 了本类对象(如单例模式),也会触发当前类的实例初始化流程,但静态部分不会再重复执行
常见陷阱与验证要点
实际编码中容易误判的地方集中在“首次触发”和“隐式 super”上:
- 子类构造器没写 super()?编译器自动插入 super(),仍会强制先走父类构造流程
- 只调用子类静态方法,父类静态块也会执行——因为父类是子类的直接超类,加载子类前必须先确保父类已初始化
- 多个实例代码块?它们按书写顺序依次执行,与是否带 return 或 throw 无关
- 静态块里访问尚未声明的静态变量?编译报错;但访问已声明但未赋值的变量,会得到默认值(如 int 是 0)

















