java代码块执行顺序由类加载和对象创建机制决定:静态部分(变量、代码块)在类首次主动使用时按声明顺序执行一次,实例部分(变量、代码块、构造方法)每次new时按“父类优先、块先于构造”顺序执行。

Java代码块的执行顺序不是靠死记,而是由类加载机制和对象创建流程决定的。掌握它,能避免初始化错乱、静态资源重复加载、子父类协作异常等问题。
单个类内部的执行顺序
在一个没有继承的普通类中,代码实际执行顺序是:
- 静态变量赋值(按声明顺序)
- 静态代码块(按出现顺序,只执行一次)
- 实例变量赋值(按声明顺序)
- 实例代码块(每次 new 时执行,按出现顺序)
- 构造方法(在所有实例代码块之后)
注意:静态部分只在类首次被主动使用(如 new、调用静态方法、访问静态字段)时触发;而实例部分每次 new 都会完整走一遍。
含继承关系时的完整链条
当存在父子类继承时,执行顺序严格遵循“静态优先、父类优先、块先于构造”的原则:
- 父类静态变量 → 父类静态代码块(多个则按序)
- 子类静态变量 → 子类静态代码块
- 父类实例变量 → 父类实例代码块
- 父类构造方法(此时 super() 已隐式或显式调用)
- 子类实例变量 → 子类实例代码块
- 子类构造方法
这个顺序不可跳过或颠倒。比如子类构造方法第一行一定是 super() 或 this(),这就锁定了父类初始化必须先完成。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
静态代码块与实例代码块的典型用途
二者分工明确,用错场景容易埋坑:
- 静态代码块适合做一次性全局准备:加载 JDBC 驱动、读取配置文件、初始化单例缓存、注册回调监听器
- 实例代码块适合提取共用初始化逻辑:统一设置默认状态、校验必填字段、预填充集合、记录创建时间戳
- 避免在静态块里 new 大量对象或做耗时 I/O;避免在实例块里访问未初始化的 final 字段
例如多个构造器都要给 List 赋初值并 add 一个默认元素,用实例块比在每个构造器里重复写更安全清晰。
调试与验证技巧
光看理论容易混淆,实战中建议这样验证:
- 在每类的静态块、实例块、构造器开头加带类名的打印语句,比如 "[Parent static]"
- 运行 new Child() 两次,观察静态部分是否只输出一次
- 把父类构造器里加 super() 显式调用,再删掉,对比输出变化
- 用 javap -c 编译后反编译,能看到实例块代码实际被编译器插入到每个构造器开头
这种“打印+观察+反编译”三步法,比背口诀更能建立真实感知。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










