java代码块执行顺序由jvm严格分两阶段:类加载时执行静态初始化(父类静态变量→父类静态块→子类静态变量→子类静态块),对象创建时执行实例初始化(父类实例变量默认值→父类实例块/显式初始化→父类构造器→子类实例变量默认值→子类实例块/显式初始化→子类构造器)。

Java 中代码块执行顺序不是靠猜,而是由 JVM 严格按两个阶段控制:类加载时的静态初始化,和对象创建时的实例初始化。理解关键不在“谁先写”,而在“谁属于哪个阶段、谁触发谁”。
分清静态和实例两个层级
静态代码块(static {})和静态变量初始化,只在类首次被主动使用时执行一次,比如 new、调用静态方法、访问静态字段。这个阶段不创建对象,只确保类“准备好”。
实例代码块({} ,无 static)和非静态字段初始化,则每次 new 对象都走一遍,属于对象诞生流程的一部分。
两者完全隔离:静态部分跑完,才可能触发实例部分;实例部分运行时,静态部分早已结束且不再重复。
执行顺序有固定链条
类加载阶段(仅一次):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 父类静态变量赋值(按源码声明顺序)
- 父类静态代码块(按书写顺序)
- 子类静态变量赋值
- 子类静态代码块
对象实例化阶段(每次 new):
- 父类实例变量设默认值(如 int→0,Object→null)
- 父类实例代码块 + 实例变量显式初始化(如
String name = "Tom";,编译器自动插在这里) - 父类构造方法(含隐式或显式
super()) - 子类实例变量设默认值
- 子类实例代码块 + 实例变量显式初始化
- 子类构造方法体
用日志+断点快速验证
在每个关键位置加唯一标识输出,例如:
- 父类静态块:
System.out.println("P-static"); - 父类实例块:
System.out.println("P-init"); - 子类构造方法:
System.out.println("C-ctor");
运行后看打印顺序,就是真实执行流。配合 IDE 在这些行设断点,单步进入,能清楚看到调用栈跳转路径——比如从父类构造器里 super() 进入 Object 初始化,再逐级返回。
警惕三类典型陷阱
容易误判顺序的地方往往不是顺序本身错了,而是观察点选错了:
- 父类静态块里访问子类静态字段(如
Child.NAME),会强制触发子类初始化,但此时子类自己的静态变量还没走到赋值语句,拿到的是默认值(null或0) - 父类构造器中调用被子类重写的方法,该方法实际执行子类版本,但子类实例字段尚未初始化(仍是默认值)
- 把局部代码块(方法内
{...})当成实例代码块,它不参与对象初始化,只是作用域控制,纯按自然顺序执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










