java中代码块执行顺序取决于类加载和对象创建两个阶段:类加载时按源码顺序执行静态变量赋值和静态代码块(仅一次);对象创建时按“父类实例→父类构造→子类实例→子类构造”顺序执行实例内容。

Java 中代码块执行顺序的关键,在于分清“类加载”和“对象创建”两个独立阶段。类加载时只涉及静态内容,且只发生一次;理解这一点,就能自然理清执行逻辑,不靠死记硬背。
静态内容:类加载时统一初始化
当类第一次被主动使用(比如 new 一个对象、调用静态方法、读取静态字段),JVM 就会触发类加载的初始化阶段。此时:
- 所有静态变量赋值语句(如 static int x = getValue();)和静态代码块(static { ... })按源码从上到下的顺序,被合并进一个叫
<clinit></clinit>的特殊方法里执行 - 注意:准备阶段只设默认值(0、null、false),真正赋值和运行代码都在初始化阶段
- 哪怕只访问一个静态字段,整个类的静态初始化都会完整跑一遍,不会“只加载用到的部分”
- public static final 基本类型常量(如 MAX = 100)是编译期常量,跳过类初始化,直接内联
实例内容:不在类加载阶段执行
实例变量赋值(如 String name = "Tom";)、实例代码块({ ... })、构造方法,全部属于对象级别,跟类加载无关。它们在每次 new 对象时才开始执行,且严格按顺序:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先执行父类的实例变量和实例代码块(按源码顺序)
- 再调用父类构造方法(隐式或显式 super())
- 然后才是子类的实例变量和实例代码块
- 最后执行子类构造方法
继承场景下,类加载和对象创建要分开看
有父子类时,容易混淆的点在于:类加载是一次性、分步完成的;而对象创建是多次、嵌套进行的。
- 类加载阶段:先父类静态 → 再子类静态(都只执行一次)
- 对象创建阶段:每次 new,都走一遍“父类实例 → 父类构造 → 子类实例 → 子类构造”
- 也就是说,子类的静态初始化必须等父类静态完成,但子类的实例初始化,永远发生在父类构造方法返回之后
普通方法内的代码块不参与初始化流程
写在方法体里的 { ... } 是局部代码块,仅在方法被调用时执行,跟类加载、对象创建完全无关。它既不是静态块,也不是实例块,只是语法上的作用域划分,不影响初始化顺序判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










