静态代码块在类初始化阶段执行且仅一次,由jvm自动调用方法;classloader.loadclass不触发,class.forname默认触发;执行顺序按源码自上而下,父类优先于子类;多线程安全,异常导致noclassdeffounderror。

Java 类加载的初始化阶段执行静态代码块,不是一加载就跑,而是在类首次被 JVM 主动使用、进入「初始化」这一步时才运行,且只执行一次。
初始化阶段才真正触发静态代码块
类加载分五步:加载 → 验证 → 准备 → 解析 → 初始化。静态代码块属于「初始化阶段」的内容,被编译器合成进一个叫
- ClassLoader.loadClass("X") 只走到加载阶段,不执行 静态代码块
- Class.forName("X") 默认 initialize=true,会触发初始化,执行 静态代码块
- 仅声明变量、import 类、访问 public static final String MSG = "ok"; 这类编译期常量,不会触发 初始化
执行顺序严格按源码书写位置
静态代码块和静态变量赋值语句(如 static int x = init();)混合在一起,JVM 按它们在类中从上到下的文本顺序统一执行:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先出现的 static {} 先执行
- 先声明的 static int a = getValue(); 也先求值
- 若 getValue() 中访问了后面才声明的 static String s,此时 s 还是 null(默认值),不是编译错误,但逻辑可能出错
继承关系下父类优先完成
当子类被初始化(比如 new Child() 或调用 Child.staticMethod()),JVM 强制先完成父类初始化:
- 父类所有静态变量赋值 → 父类所有静态代码块(按源码顺序)
- 子类所有静态变量赋值 → 子类所有静态代码块(按源码顺序)
- 该过程只发生一次;后续再用子类,不会再重复执行
线程安全与异常后果
JVM 保证
- 多个线程同时首次触发初始化,JVM 用类对象的 monitor 锁住,仅一个线程执行,其余等待
- 若静态代码块中抛出未捕获异常(如 NullPointerException、IOException),类进入“初始化失败”状态
- 此后任何对该类的主动使用(new、调用静态方法等)都会直接抛出 NoClassDefFoundError
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










