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

构造代码块(Instance Initialization Block)在每次创建Java对象时自动执行,它的触发时机早于构造方法,但晚于字段初始化,且与构造方法一样,属于实例级别——只要 new 一个对象,它就运行一次。
构造代码块的执行顺序很明确
当执行 new MyClass() 时,JVM 按如下顺序处理:
- 为对象分配内存空间,并将所有实例字段设为默认值(如 0、null、false)
- 按源码中出现的顺序,逐个执行实例变量的显式初始化(如 int x = 5;)
- 接着执行构造代码块(按书写顺序,多个块依次执行)
- 最后才调用构造方法体中的代码
它和构造方法的区别在于复用性与灵活性
构造代码块不依赖构造方法签名,也不需要显式调用。只要类中定义了它,所有构造方法都会“隐式共享”这段初始化逻辑:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 避免在多个构造方法里重复写相同的初始化语句(比如日志、资源预设、状态校验)
- 不能接收参数,也不能直接抛出受检异常(除非用 try-catch 包裹)
- 无法像构造方法那样做重载或选择性跳过——只要实例化,它必执行
注意:静态代码块是另一回事
别把构造代码块和 static { ... } 混淆。后者只在类首次加载时执行一次,属于类级别;而构造代码块每次 new 都执行,属于对象级别。两者生命周期完全不同。
一个典型使用场景
比如某个类有多个构造方法,都需要设置默认时间戳并记录创建次数:
{ System.out.println("正在初始化实例..."); createTime = System.currentTimeMillis(); instanceCount++; }这段代码放在构造代码块里,比分散写在每个构造方法里更干净、不易遗漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










