构造代码块一定在构造函数体执行之前运行,且每次new对象时都触发;它按源码顺序被编译器注入每个构造方法开头(super()/this()之后)、与字段初始化交错执行,同一对象创建中仅执行一次。

构造代码块一定在构造函数体执行之前运行,且每次 new 对象时都触发——这是它最核心的行为特征。不是“可能先”,而是 JVM 字节码层面强制保证的执行时机。
构造代码块总在构造方法体开头前执行
编译器会把所有构造代码块按源码顺序,原封不动地“注入”到每个构造方法的第一行(super() 或 this() 调用之后、构造方法自身语句之前)。这意味着:
- 哪怕构造方法里第一行是 this("abc"),两个构造代码块也已在进入被调用的构造方法前执行完毕
- 哪怕构造方法里没写任何语句,只要 new 出来,构造代码块照样执行
- 反编译 class 文件可直接看到:构造代码块字节码出现在 aload_0 / invokespecial 等指令之后、构造方法逻辑之前
多个构造代码块严格按源码顺序执行
它们不是并行或随机执行,而是从上到下逐个运行,构成一个统一的前置初始化段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 上面的代码块先执行,下面的后执行
- 字段显式初始化(如 String name = "A";)和构造代码块处于同一层级,也按书写顺序交错执行:先遇到谁就先执行谁
- 若字段依赖构造代码块中计算的值,必须把字段声明放在代码块之后,否则读到的是默认值(null/0/false)
与 this() / super() 完全解耦,只认 new 次数
构造代码块的执行不取决于你进了哪个构造方法,而只取决于你调用了几次 new:
- new Demo("x") → 触发一次构造代码块(即使它内部 this() 调了另一个构造)
- new Demo() → 再触发一次,独立于上次
- 同一个对象创建过程中,无论 this() 链多长,构造代码块只执行一次
- 如果在构造代码块里 throw new RuntimeException(),那么每次 new 都会在此处中断,验证其真实参与每轮实例化
和静态代码块、字段初始化的完整位置关系
在一次 new 的完整流程中,它处在明确的中间层:
- 父类静态代码块(类加载时,仅首次)
- 子类静态代码块(类加载时,仅首次)
- 父类构造代码块 → 父类字段初始化(按顺序)→ 父类构造方法
- 子类构造代码块 → 子类字段初始化(按顺序)→ 子类构造方法
这个链条不可跳过、不可倒置,是 JVM 规范定义的对象实例化标准流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










