Java中静态代码块、构造块与构造方法的执行顺序为:先父类静态代码块→子类静态代码块(仅首次)→父类构造块→父类构造方法→子类构造块→子类构造方法;静态块只执行一次,构造块每次new时执行,普通方法内块不参与初始化流程。

Java 中静态代码块、构造块与构造方法的执行顺序由 JVM 类加载和对象创建机制严格决定,不是按书写位置随意执行的。掌握这个顺序,能避免字段未初始化、空指针、非法前向引用等问题,也便于设计清晰的初始化逻辑。
静态代码块:类首次主动使用时执行一次
静态代码块(static{})属于“类初始化阶段”,在类被首次主动使用时触发,不是类一加载就立刻执行。常见触发场景包括:
• 调用该类的 public static 方法
• new 某个类的实例
• 访问非编译期常量的 public static 字段(如 public static int PORT = 8080;;但 public static final String MSG = "ok"; 不会触发)
• 反射调用 Class.forName("X")
多个静态块按源码从上到下顺序执行。一旦抛出未捕获异常,整个类初始化失败,后续对该类的任何主动使用都会直接抛出 ExceptionInInitializerError。
构造块:每次 new 对象时,在父类 super() 后、本类构造方法体前执行
构造块({},无 static 修饰)属于对象初始化的一部分,与类加载无关。它会在每个构造器中被编译器“自动插入”到最开头,位置固定为:
• 父类构造器已通过 super() 完成调用之后
• 本类构造方法体开始之前
因此,无论有多少个重载构造器,只要被调用,该块就执行一次。它可以访问静态成员和已声明的实例成员,适合抽取多个构造器共有的初始化逻辑。
父子类完整初始化顺序:先父后子、先静后动
执行 new Child() 时,实际流程如下:
• 父类静态代码块 → 子类静态代码块(仅首次触发)
• 父类构造块 → 父类构造方法
• 子类构造块 → 子类构造方法
注意:静态块全程只执行一次;之后每次 new 都重复后四步。若父类构造器中调用了可被子类重写的方法,此时子类字段尚未初始化(因构造块还没执行),需特别谨慎。
普通块(方法内 {})不参与初始化流程
写在方法内部的 {}(如 void foo() { int x = 1; { System.out.println(x); } })纯属语法作用域结构,既不属于类加载,也不属于对象创建。
• 执行时机完全取决于方法是否被调用、执行流是否到达该位置
• 即使类从未初始化,只要方法被调用且走到此处,它就会运行
它的作用是限制变量作用域、提前释放资源或提升可读性,与初始化顺序无关。


















