构造块先于构造方法执行,且每次创建对象时都运行;它位于类中非方法内、用{}包裹,按定义顺序从上到下执行,被编译器插入到每个构造方法开头(super()之后),用于统一初始化共性逻辑。

构造块先于构造方法执行,且每次创建对象时都运行;它不接收参数,但能统一处理多个构造方法共用的初始化逻辑。理解这一点,就抓住了Java对象初始化流程的关键节点。
构造块是“每次new都走一遍”的通用准备步骤
构造块(即用{}包围、写在类中但不在任何方法内的代码)属于实例初始化器,在每次调用构造方法前自动执行。它和成员变量的显式初始化(如int x = 10;)地位相同,都会被编译器合并进每个构造方法的开头——紧接在super()或this()调用之后、构造方法体之前。
- 只要执行new Demo(),构造块就一定执行一次
- 多个构造块按源码中从上到下的顺序依次执行
- 即使构造方法里用了this()委托其他构造器,构造块也只执行一次
构造方法是“按需定制”的对象初始化入口
构造方法负责根据传入参数完成差异化初始化,比如设置姓名、年龄、ID等特定状态。它不能被继承,也不能被重写,每个构造方法对应一种对象创建方式。
- 构造方法名必须与类名完全一致
- 没有返回类型(连void都不能写)
- 若未定义任何构造方法,编译器会提供默认无参构造;一旦自定义,该默认构造就不再存在
- 子类构造方法第一行默认或显式调用super(),确保父类初始化完成后再继续
三者协同构成完整的初始化流水线
静态代码块、构造块、构造方法不是孤立存在的,它们按固定顺序串联成一条不可跳步的初始化链:
立即学习“Java免费学习笔记(深入)”;
- 类首次使用时:父类静态块 → 子类静态块(只执行一次)
- 每次new时:父类构造块 → 父类构造方法 → 子类构造块 → 子类构造方法
- 成员变量初始化语句(如String name = "unknown";)插入在对应类的构造块位置,而非声明处立即执行
这条流水线是单向、确定、可复现的,也是JVM保障对象安全构造的底层机制。
实际编码中怎么选:构造块还是构造方法?
构造块适合放所有构造路径都必须执行的逻辑,比如日志记录、资源预检查、字段默认值赋值;而构造方法更适合做参数依赖型初始化或业务规则判断。
- 需要传参或做条件分支?用构造方法
- 多个构造方法都要打印“对象开始构建”?用构造块
- 想给final字段赋默认值,又不想每个构造方法都写一遍?构造块更简洁
- 涉及异常抛出?注意构造块里抛出的异常,所有构造方法都得处理


















