java初始化顺序为:父类静态→子类静态→父类实例→父类构造器→子类实例→子类构造器;静态部分仅执行一次,实例部分每次new均完整执行,构造器总在对应层级所有初始化完成后最后执行。

Java 初始化块的执行顺序,核心在于区分“类级别”和“实例级别”的初始化行为。类变量(静态)相关操作只发生一次,在类加载时完成;实例变量相关操作每次创建对象都执行一遍。两者不仅时机不同,作用域、内存位置和依赖逻辑也完全不同。
静态初始化块与类变量按源码顺序交错执行
静态变量声明和 static{} 块在类初始化阶段按从上到下的文本顺序依次执行。JVM 会把所有静态赋值语句和静态代码块收集起来,严格遵循它们在源文件中出现的位置来运行。
- 即使某个静态变量定义在静态块之后,该块仍可对其赋值(但不能读取——编译报错)
- final static 变量若在编译期能确定值,会在准备阶段直接写入常量池,不参与后续初始化流程
- 父类的静态部分一定先于子类执行,且整个过程仅触发一次,与是否 new 对象无关
实例初始化块与实例变量同步穿插执行
每次调用 new 创建对象时,JVM 在分配堆内存后、进入构造器体之前,会按源码顺序逐个处理实例变量显式初始化和 {} 实例初始化块。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先为所有实例字段设默认值(0、false、null),再执行定义处的初始化表达式或实例块
- 实例块不是独立阶段,而是嵌入在实例变量初始化序列中的一个环节,位置决定执行时机
- 若初始化表达式中调用了普通方法,该方法内访问的其他实例字段可能仍是默认值(尚未轮到其初始化)
构造器永远是最后执行的初始化环节
无论是父类还是子类,构造器总是在对应层级的所有静态和实例初始化完成后才开始执行。特别要注意的是:
- 父类构造器在子类任何实例初始化动作之前就已运行完毕
- 在构造器中调用可被重写的方法,实际执行的是子类版本——此时子类的实例字段可能还未初始化(仍为默认值)
- 不建议在构造器中调用非 final 方法,尤其当子类有字段依赖该方法返回值时,容易引发空指针或逻辑错误
继承场景下的完整执行链条
当存在父子类关系时,初始化顺序固定为:父类静态 → 子类静态 → 父类实例 → 父类构造器 → 子类实例 → 子类构造器。其中“父类实例”包含父类的实例变量初始化和实例块,“子类实例”同理。
- 静态部分只走一遍,哪怕多次 new 子类对象,父/子静态块都不会重复执行
- 每 new 一次,就会完整走一遍“父实例 → 父构造 → 子实例 → 子构造”流程
- 如果子类构造器第一行没显式写 super(...),编译器会自动插入无参 super(),确保父构造器必然早于子构造器执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










