构造块先于构造方法执行,为对象提供统一前置初始化;构造方法随后基于参数完成定制化设置。两者协作而非竞争,构造块在每次new时自动运行一次,被编译器插入每个构造方法首行(super()/this()之后),确保共性逻辑不重复。

构造方法和构造块不是竞争关系,而是前后衔接的协作关系:构造块先执行,为对象铺好基础状态;构造方法后执行,完成参数驱动的定制化设置。
构造块是每次 new 的“统一前置准备”
只要执行 new Demo(),无论调用哪个构造方法,构造块都会在该构造方法体开始前自动运行一次。它被编译器悄悄插入到每个构造方法的第一行(super() 或 this() 返回之后、方法体代码之前)。这意味着:
- 多个构造方法共用的初始化逻辑(如默认赋值、日志打印、资源检查)只需写一遍,避免重复
- 字段声明初始化(如 int x = 10;)和构造块按源码顺序合并执行,共同构成实例初始化阶段
- 即使构造方法内用了 this() 委托其他构造器,构造块也只执行一次,不会重复
构造方法是“按参数定制”的最终组装环节
构造方法负责接收外部输入,并基于参数决定对象的差异化状态。它不能绕过构造块,但可以在其基础上覆盖或补充:
- 构造块设了 name = "未知",有参构造可写 this.name = name 覆盖它
- 构造块无法访问构造方法的形参,所以依赖参数的逻辑(如校验非空、计算派生值)必须放在构造方法中
- 子类构造方法隐式或显式调用 super() 后,才轮到本类构造块和本类构造方法依次执行
三者实际执行链条很清晰
以 new Child() 为例,完整流程是:
- 父类静态块 → 子类静态块(仅首次类加载时执行)
- 父类构造块 → 父类构造方法
- 子类构造块 → 子类构造方法
这个顺序固定、不可跳过。构造块不是语法糖,而是 JVM 实例初始化规范中的正式一环——它让共性初始化脱离具体构造签名,真正实现“一次定义,处处生效”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











