构造代码块先于构造函数执行,每次new对象时均运行一次,按声明顺序从上到下执行;构造函数在其后执行,负责特有初始化逻辑,且受继承链中super()隐式调用影响,完整顺序为:父类静态代码块→子类静态代码块→父类构造代码块→父类构造函数→子类构造代码块→子类构造函数。

构造代码块先于构造函数执行,且每次 new 一个对象时都会运行一次;构造函数则在构造代码块之后执行,负责完成该对象特有的初始化逻辑。
构造代码块的执行时机
构造代码块是用 {} 包裹、定义在类中但不在任何方法内的代码段。它属于实例初始化的一部分,只要创建对象(即调用 new),就会自动执行,且一定在对应构造函数体执行之前。
- 多个构造代码块按其在类中出现的顺序,从上到下依次执行
- 即使构造函数中通过 this() 调用了其他重载构造器,构造代码块也只执行一次——在最终选定的那个构造函数开始前完成
- 它可访问静态成员和实例成员(包括未显式初始化的字段),但不能引用尚未声明的变量(编译时报“非法向前引用”)
构造函数的执行位置
构造函数是对象创建的入口点,但它不是最先运行的部分。JVM 在进入构造函数体之前,已完成了:父类构造代码块 → 父类构造函数 → 子类构造代码块 的流程。
- 构造函数本身不参与继承链的“自动调用”,但每个构造函数第一行默认或显式含有 super() 或 this()
- 若子类构造函数未写 super(),编译器会自动插入 super(),从而触发父类构造流程
- 构造函数体中的代码,是整个初始化流程的最后一步(针对当前类而言)
完整初始化顺序(含继承)
以 new Child() 为例,整个对象创建过程的执行顺序严格如下:
- 父类静态代码块(仅首次加载类时执行)
- 子类静态代码块(仅首次加载类时执行)
- 父类构造代码块
- 父类构造函数
- 子类构造代码块
- 子类构造函数
为什么构造代码块总在构造函数前?
从字节码角度看,编译器会把每个构造代码块的内容复制插入到**每一个构造函数的开头**(在 super()/this() 调用之后、构造函数体之前)。所以它看似独立书写,实则被“内联”进所有构造路径,天然保证了统一前置执行。
- 这解释了为何它适合提取多个构造函数的共性初始化逻辑(如日志、资源预分配、状态重置等)
- 而构造函数更适合处理差异化参数绑定、条件分支初始化等专属逻辑
- 二者配合使用,能清晰分离“通用初始化”与“个性初始化”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











