静态代码块在类首次主动使用时执行一次,构造块每次new对象时在父类super()后、构造器体前执行;完整顺序为:父类静态块→子类静态块→父类构造块→父类构造方法→子类构造块→子类构造方法。

构造块和静态代码块在 Java 中属于不同生命周期阶段的初始化机制,它们结合使用时的执行流严格遵循 JVM 的类加载与对象创建规则,并非随意叠加,而是分阶段、有先后、不可逆的。
静态代码块:类加载阶段唯一触发
静态代码块(static {})在类被 JVM 首次主动使用时执行,仅一次。常见触发点包括:
• new 某个类的实例
• 调用该类的 public static 方法
• 访问非编译期常量的 public static 字段
• 反射调用 Class.forName("X")
多个静态块按源码从上到下顺序执行;若任一静态块抛出未捕获异常,整个类初始化失败,后续对该类的所有访问都会抛出 ExceptionInInitializerError。
构造块:每次 new 对象时自动插入构造器开头
构造块({},无 static)不参与类加载,只属于对象初始化环节。它会在每次调用构造方法前执行,准确位置是:
• 父类 super() 完成之后
• 本构造器方法体开始之前
编译器会将构造块内容“复制”到每个构造器的最开头,因此无论有多少重载构造器,只要被调用,该块就执行一次。
它可以访问静态成员和已声明的实例成员(声明需在块之前),适合抽取多个构造器共用的初始化逻辑。
两者结合的完整执行流(以 new Child() 为例)
当首次执行 new Child() 时,JVM 执行链如下:
立即学习“Java免费学习笔记(深入)”;
- 触发父类加载 → 执行父类所有静态块(按序)
- 触发子类加载 → 执行子类所有静态块(按序)
- 开始实例化 → 先执行父类构造块,再执行父类构造方法
- 回到子类 → 先执行子类构造块,再执行子类构造方法
注意:静态部分只走一遍;后续再 new 多个对象,只重复执行构造块 + 构造方法。
关键细节与常见误区
• 静态块不能访问 this 或任何实例变量/方法,只能操作静态成员
• 构造块虽可访问实例字段,但若字段尚未声明(前向引用),编译报错
• 若父类构造器中调用了可被子类重写的方法,此时子类构造块尚未执行,其字段仍为默认值(如 null、0),极易引发空指针或逻辑错误
• 静态块中初始化的资源(如连接池、配置缓存)应确保线程安全,因可能被多线程并发触发(虽然类初始化本身是同步的)


















