静态代码块先于非静态代码块执行且仅执行一次,非静态代码块每次new对象时在构造方法前执行;前者属类级别、随类初始化触发,后者属实例级别、随对象创建触发,二者按父子类顺序及源码声明顺序严格执行。

静态代码块先于非静态代码块执行,且只执行一次;非静态代码块每次创建对象时都执行,且在构造方法之前运行。
静态代码块:类加载时触发,仅一次
静态代码块(static {})属于类级别,在JVM首次主动使用该类时触发——比如 new 对象、调用静态方法、访问静态字段或通过 Class.forName 加载。它随类加载而执行,整个程序生命周期中只运行一次。
- 多个静态块按源码书写顺序依次执行
- 可初始化静态变量,但不能访问实例成员(如普通字段或方法)
- 即使没创建任何对象,只要类被引用(如调用 main 方法),也会执行
- 父类静态块一定先于子类静态块执行
非静态代码块:每次 new 时执行,紧邻构造方法前
非静态代码块({},无 static 修饰)属于实例级别,每次调用构造方法前自动执行,编译器会将其“插入”到每个构造方法体的最开头。
- 可访问实例变量和方法,适合抽取多个构造器共有的初始化逻辑
- 父类非静态块在父类构造方法之前执行,子类非静态块在子类构造方法之前执行
- 字段显式初始化(如 int x = 1;)与非静态块按源码出现顺序交替执行
- 每 new 一个对象就执行一次,与构造方法调用次数一致
执行顺序总览(含父子类场景)
当创建子类对象时,完整执行链为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 父类静态代码块 → 子类静态代码块(类加载阶段,仅首次触发)
- 父类非静态代码块 → 父类构造方法
- 子类非静态代码块 → 子类构造方法(对象实例化阶段,每次 new 都走一遍)
注意:main 方法本身不决定代码块执行时机,它只是可能触发类首次使用的入口之一。
普通代码块:仅限方法内,按顺序执行
写在方法体内的 {} 属于普通代码块,和普通语句一样,只在方法被调用时按出现顺序执行,作用域受限、无特殊生命周期含义。
- 不能定义在类层级(否则语法错误)
- 不影响类或对象初始化流程
- 常用于限定局部变量作用域或临时逻辑分组

















