构造代码块每次实例化对象时都执行,属于实例级别,在字段初始化后、构造方法体前按源码顺序运行,被自动插入每个构造方法开头,用于提取共用初始化逻辑。

Java构造代码块每次实例化对象都会执行,这是它最核心的特性——它属于实例级别,不依赖构造方法是否存在,也不受重载影响,只要 new 出一个新对象,它就运行一次。
执行时机很明确:在字段初始化之后、构造方法体之前
JVM 创建对象时按固定顺序处理初始化逻辑:
- 为对象分配内存,所有实例字段设为默认值(0、null、false)
- 按源码书写顺序,依次执行成员变量的显式初始化(如 String name = "default";)
- 紧接着,按相同顺序执行所有构造代码块(多个就依次执行)
- 最后才进入构造方法体内的代码
和构造方法共享,但更底层、更自动
构造代码块不是方法,没有名称、参数或返回值,但它被“悄悄插入”到每一个构造方法的开头(super() 或 this() 返回之后)。哪怕你没写任何构造器,编译器生成的默认构造器也会包含它。
- 适合提取多个构造器共用的初始化逻辑,比如设置时间戳、计数器、日志输出
- 可以访问实例变量和普通方法(对象内存已分配,但尚未完全初始化)
- 不能直接抛出受检异常,需用 try-catch 包裹
和静态代码块别混淆:生命周期完全不同
静态代码块(static { ... })只在类首次加载时执行一次,属于类级别;而构造代码块每次 new 都触发,属于对象级别。
- 同一个类 new 10 次 → 构造代码块执行 10 次,静态代码块仅执行 1 次
- 若在构造代码块中抛异常,每次 new 都会失败,这正印证了它深度参与每次实例化流程
- 两者可共存,但作用域、执行频次、访问权限都不同
多个构造代码块按顺序执行,和字段混写要留意
构造代码块与成员变量显式初始化处于同一执行阶段,且严格遵循源码顺序。例如:
String a = "A";{ System.out.println("Block 1"); }
int b = 10;
{ System.out.println("Block 2"); }
执行顺序就是:a 初始化 → Block 1 → b 初始化 → Block 2。
- 这种顺序性让初始化逻辑可控,也容易调试
- 若逻辑强依赖先后,建议把关联操作尽量写在同一个块里,避免跨块耦合
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











