java中三类代码块执行顺序为:静态代码块(类加载时执行一次)、构造代码块(每次new对象时执行)、局部代码块(所在方法执行到时执行);分别对应类初始化、对象创建、方法调用三个生命周期阶段。

Java中三类代码块的执行顺序,本质是类和对象生命周期的映射:谁属于类、谁属于对象、谁只属于某次方法调用,决定了它们何时跑、跑几次。
静态代码块:类一初始化就跑,只跑一次
它在JVM首次主动使用该类时触发——比如new对象、调用static方法、访问非final static字段,或通过Class.forName加载。此时JVM执行类的<clinit></clinit>方法,把所有静态变量赋值语句和static{}块按源码顺序依次执行。父类的静态部分一定先于子类;多个static块从上到下执行;一旦中途抛出未捕获异常,类初始化失败,后续再用直接报ExceptionInInitializerError。
- 不能访问实例变量或方法
- 适合做全局性初始化:注册驱动、加载配置、初始化静态缓存
- 哪怕没创建任何对象,只要类被主动引用,它就执行
构造代码块:每次new对象都跑,总在构造方法前
写在类里、没加static的大括号{},属于实例级别。编译器会把它“复制”到每个构造方法开头(super()调用之后、构造体之前)。所以不管有几个构造器,只要被调用,这块就执行一次。父类构造块先于子类构造块,且都在各自构造方法体之前。
- 可安全访问实例字段和方法
- 适合抽取多个构造器共有的初始化逻辑,避免重复代码
- 字段显式初始化(如
int x = 10;)和构造块按声明顺序交替执行
局部代码块:纯语法作用域,时机完全独立
写在方法、构造器甚至if语句里的{…},不参与类或对象初始化流程。它只是限制变量作用域、提前释放资源的语法手段。执行时机完全取决于方法是否被调用、执行流是否走到这里——哪怕类从未加载,只要方法运行到这一行,它就立刻执行。
- 变量只在块内可见,块结束即销毁
- 和静态块、构造块没有先后关系,也不影响对象状态
- 常见于临时计算、资源隔离、避免变量名冲突
完整时序示例(含父子类):父类静态块 → 子类静态块 → 父类构造块 → 父类构造方法 → 子类构造块 → 子类构造方法;而局部块只在它所在方法被调用且执行到时才运行,与其他两类不在同一维度。











