构造块在每个构造方法调用时执行一次,位于父类构造调用完成后、本方法体开始前;它被编译器复制到每个构造方法开头,与对象创建绑定,不依赖参数,且在this()链中仅执行一次。

构造块在每个构造方法调用时都会执行一次,且固定插在父类构造调用完成之后、本构造方法体开始之前。
构造块对所有构造方法一视同仁
只要类中定义了构造块(即不带 static 的 {}),编译器会把它“复制”到该类每一个构造方法的开头位置。无论你调用无参构造、有参构造,还是带 this() 重载调用的构造方法,只要这个构造方法被实际执行,构造块就一定会运行一次。
- 多个构造方法共享同一套构造块逻辑,避免重复写初始化代码
- 它不依赖构造方法参数,也不区分重载形式,只与对象创建动作绑定
- 即使某个构造方法内部通过 this(...) 调用另一个构造方法,构造块也只执行一次——在最终实际执行的那个构造方法中触发
执行位置严格固定:super() 后、方法体前
构造块不是在构造方法体内部随意插入,而是精确位于:
- 父类构造器(super() 或显式 super(...))成功返回之后
- 当前构造方法自己的语句(比如赋值、打印、逻辑判断)开始之前
这意味着构造块可以安全访问已由父类初始化完毕的继承字段,也能读取本类已声明的实例字段(即使字段声明在构造块之后,JVM 仍允许访问,但值可能为默认值)。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
与 this() 和 super() 共存时的行为
当构造方法中存在 this(...) 或 super(...) 调用时,构造块的执行时机不受影响,但需注意链式调用下的实际归属:
- this(...) 是本类内构造方法跳转,构造块只在最终落地的那个构造方法中执行一次
- super(...) 是向上委托,父类的构造块会在父类构造流程中独立执行,与子类构造块互不干扰
- 不存在“构造块跨构造方法复用”或“跳过构造块执行”的情况
不能替代构造方法,但能统一前置逻辑
构造块适合放那些所有对象都必须做的初始化操作,比如:
- 设置默认状态标志(status = Status.PENDING;)
- 预分配轻量级资源(buffer = new byte[1024];)
- 校验外部 final 变量并赋值(id = externalId;)
但它不能做需要参数参与的差异化初始化(如根据传入字符串选择不同策略),这类逻辑仍应保留在各构造方法体内。

















