java中构造代码块执行顺序为:父类静态代码块→子类静态代码块→父类构造代码块→父类构造方法→子类构造代码块→子类构造方法;构造代码块被编译器自动插入到对应构造方法开头(super()之后),依附于构造方法执行,确保父类初始化完成后再执行子类初始化逻辑。

父类构造方法先执行,子类构造代码块后执行。
执行顺序的关键逻辑
Java 中对象初始化严格遵循“先父后子、先静态后实例”的原则。构造代码块(即非静态代码块)属于实例初始化阶段,它被编译器自动插入到每个构造方法的**开头位置,但在 super() 调用之后**(即使你没显式写 super(),编译器也会默认插入)。
这意味着:父类构造方法必须先完成(包括其内部已插入的父类构造代码块),子类构造方法才真正开始执行——此时才会运行子类自己的构造代码块。
完整初始化链条(以 new Child() 为例)
- 父类静态代码块(仅首次加载类时执行一次)
- 子类静态代码块(仅首次加载类时执行一次)
- 父类成员变量默认初始化 & 构造代码块(按声明顺序)
- 父类构造方法(此时父类实例已初步成型)
- 子类成员变量默认初始化 & 构造代码块(按声明顺序)
- 子类构造方法主体
为什么不是“子类构造代码块在父类构造方法之前”?
构造代码块本质是“实例初始化逻辑”,它依附于构造方法存在。JVM 规定子类构造方法第一句必须是 super()(显式或隐式),而 super() 的执行会完整走完父类的整个实例初始化流程(含父类构造代码块 + 父类构造方法)。只有 super() 返回后,控制权回到子类构造方法,才轮到子类构造代码块执行。
一个典型验证示例
若父类 A 和子类 B 都定义了构造代码块和构造方法,执行 new B() 时输出顺序必为:
A 构造代码块 → A 构造方法 → B 构造代码块 → B 构造方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











