构造代码块在每个构造方法中super()或this()调用之后、方法体执行之前执行,按源码顺序依次运行,属于对象级别初始化;父子类间通过super()链式调用确保父类先完成构造代码块与构造方法,再执行子类相应部分。

构造代码块在构造方法体开始前执行,且被编译器自动插入到每个构造方法的第一行(super() 或 this() 调用之后),二者不是并列关系,而是“块先于体”的嵌入式衔接。
构造代码块是构造方法的前置初始化环节
它不属于独立执行单元,而是被编译器悄悄“缝进”每个构造方法开头的位置。例如:
- 你写
public Child() { ... },编译后实际等效于:public Child() { super(); /*父类已走完*/ [Child的构造代码块内容]; ... } - 即使构造方法里写了
this(...),构造代码块也只执行一次——就在最终真正执行的那个构造方法中、this()或super()返回之后、方法体其余语句之前。 - 多个构造代码块按源码从上到下顺序执行,全部完成才进入构造方法体内的第一行代码。
父子类之间靠 super() 实现衔接链条
子类构造方法第一句必为 super()(显式或隐式),这强制把执行权交给父类完整初始化流程:
- 父类构造代码块 → 父类构造方法体 → 返回子类构造方法
- 此时才轮到子类自己的构造代码块执行,再继续子类构造方法体
- 这种“调用-返回”机制确保父类实例状态就绪后,子类才开始操作自身字段或调用可能被重写的方法
和静态代码块有本质区别,别混在一起
构造代码块属于对象级别,每次 new 都走一遍;它不能访问尚未声明的变量(编译时报错),但可以安全使用 this、实例字段和静态成员。而静态代码块只在类加载时跑一次,且不依赖任何对象上下文。
立即学习“Java免费学习笔记(深入)”;
验证方式很简单:加日志就能看清
在父类/子类的静态块、构造代码块、构造方法里分别打印带标识的语句,比如:
System.out.println("A 静态块");System.out.println("A 构造块");System.out.println("A 构造方法");System.out.println("B 构造块");System.out.println("B 构造方法");
运行 new B(),输出顺序就是最直接的衔接证据。


















