Java对象初始化执行流严格遵循静态代码块→构造代码块→构造方法的顺序,且按继承链自上而下、同级从上到下执行;静态块仅执行一次,构造块每次new时运行并可访问实例成员,构造方法负责参数化定制初始化。

静态代码块:负责类级别的一次性准备
用 static {} 定义,在类首次被主动使用时执行且仅一次。适合加载驱动、初始化单例、读取配置等不依赖对象的全局操作。
- 多个静态块按源码从上到下顺序执行
- 只能访问 static 成员,不能用 this 或实例字段
- 父类静态块一定先于子类执行——哪怕只 new 子类,父类也会被提前加载
构造代码块:统一所有对象的共性初始化
用 {} 定义(无 static、无参数、无返回值),写在类体中、方法外。每次 new 对象时自动执行,位置在父类构造完成之后、本类构造方法体之前。
- 可访问实例字段和 this,能做集合预创建、状态设默认值、日志打点等通用操作
- 多个构造块按声明顺序依次执行,就像普通语句一样逐行运行
- 不能访问构造方法参数,也不能抛出受检异常(需 try-catch 自行处理)
- 可为非 static final 字段赋值,但后续构造方法不能再重复赋值
构造方法:完成差异化与参数驱动的定制初始化
构造方法是初始化流程的终点,负责接收外部输入、校验参数、设置业务相关字段,并协调父类初始化(通过 super() 或 this())。
- super() 或 this() 必须是第一行语句(显式或隐式)
- 若定义了任意构造器,编译器不再自动生成无参默认构造器
- 适合做参数校验、角色设定、线程启动等依赖传入值的逻辑
继承场景下的完整执行顺序
执行 new Child() 时,JVM 按固定链条推进:
立即学习“Java免费学习笔记(深入)”;
- 父类静态变量默认值 → 父类静态赋值与静态块(从上到下)
- 子类静态变量默认值 → 子类静态赋值与静态块(从上到下)
- 父类实例变量默认值 → 父类实例赋值与构造块(从上到下)→ 父类构造方法
- 子类实例变量默认值 → 子类实例赋值与构造块(从上到下)→ 子类构造方法
这个顺序不可跳过,也不受构造器重载或 this() 调用影响——构造块始终被编译器“插入”到每个构造方法开头(super() 或 this() 之后)。


















