构造代码块在每次创建对象时自动执行,时机早于构造方法但晚于字段初始化,按书写顺序执行且被所有构造方法共享,用于避免重复初始化逻辑。

构造代码块(Instance Initialization Block)在每次创建Java对象时自动执行,它的触发时机早于构造方法,但晚于字段初始化,且与构造方法一样,属于实例级别——只要 new 一个对象,它就运行一次。
构造代码块的执行顺序很明确
当执行 new MyClass() 时,JVM 按如下顺序处理:
- 为对象分配内存空间,并将所有实例字段设为默认值(如 0、null、false)
- 按源码中出现的顺序,逐个执行实例变量的显式初始化(如 int x = 5;)
- 接着执行构造代码块(按书写顺序,多个块依次执行)
- 最后才调用构造方法体中的代码
它和构造方法的区别在于复用性与灵活性
构造代码块不依赖构造方法签名,也不需要显式调用。只要类中定义了它,所有构造方法都会“隐式共享”这段初始化逻辑:
- 避免在多个构造方法里重复写相同的初始化语句(比如日志、资源预设、状态校验)
- 不能接收参数,也不能直接抛出受检异常(除非用 try-catch 包裹)
- 无法像构造方法那样做重载或选择性跳过——只要实例化,它必执行
注意:静态代码块是另一回事
别把构造代码块和 static { ... } 混淆。后者只在类首次加载时执行一次,属于类级别;而构造代码块每次 new 都执行,属于对象级别。两者生命周期完全不同。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
一个典型使用场景
比如某个类有多个构造方法,都需要设置默认时间戳并记录创建次数:
{ System.out.println("正在初始化实例..."); createTime = System.currentTimeMillis(); instanceCount++; }这段代码放在构造代码块里,比分散写在每个构造方法里更干净、不易遗漏。

















