Java代码块执行顺序为:静态代码块→实例代码块→构造方法;静态块类加载时执行一次,实例块每次new对象时在构造方法前执行,普通块(方法内)不参与初始化流程。

Java 中代码块的执行顺序是有严格规则的,理解这个顺序对分析对象初始化过程、调试类加载问题非常关键。核心顺序是:静态块 → 构造块 → 构造方法 → 普通块(注意:普通块实际属于构造块范畴,但为区分常被单独强调;更准确分类应为“静态代码块”和“实例代码块”,后者在每次创建对象时执行,且优先于构造方法)。
静态代码块(static {})最先执行,且只执行一次
静态代码块随类加载而执行,JVM 加载类时触发,不依赖对象创建。同一类中多个静态块按定义顺序依次执行,且整个生命周期仅运行一次。
- 适合初始化静态变量、加载驱动、读取配置等一次性操作
- 即使没创建对象,只要类被主动引用(如调用静态方法、访问静态字段),就会触发
- 子类加载时,会先加载并执行父类的静态块,再执行子类的
实例代码块({},即常说的“构造块”)在每次 new 对象时执行
实例代码块属于对象级别,在每次调用构造方法前自动执行(在构造方法体之前),且按定义顺序执行。它会被“插入”到每个构造方法的开头(编译器处理)。
- 可用于抽取多个构造方法共有的初始化逻辑(比重复写在每个构造方法里更清晰)
- 执行时机在父类构造方法调用之后(即 super() 执行完)、本类构造方法体开始之前
- 父类的实例代码块先于子类的执行
构造方法在实例代码块之后执行
构造方法负责对象的具体初始化工作。它的执行前提是:父类构造已开始(super() 已调用)、父类实例块已执行、本类实例块已执行完毕。
立即学习“Java免费学习笔记(深入)”;
- 若未显式调用 super() 或 this(),编译器默认插入 super()
- 构造方法中可包含业务逻辑、参数校验、资源分配等
- 子类构造方法一定在父类构造方法完全返回后才继续执行后续语句
普通代码块(方法内 {})不参与对象初始化流程
所谓“普通块”,指定义在方法内部的局部代码块(如 void foo() { int x = 1; { System.out.println(x); } })。它不属于类结构的一部分,不参与类加载或对象创建流程,只在对应方法执行到该位置时运行,作用域受限,与初始化顺序无关。
- 主要用于限制变量作用域、提升可读性或配合 try-with-resources
- 不会影响静态块、实例块、构造方法的执行时机
- 容易与实例代码块混淆,注意区分是否在类体中直接定义(无修饰、无名称、无分号)


















