静态代码块在类初始化阶段执行且仅一次,用于类级一次性初始化;普通代码块仅随方法调用执行,属局部作用域控制,与类加载无关。

静态代码块在类加载时执行,普通代码块根本不参与类加载过程——它压根不会在这个阶段运行。
静态代码块:类初始化阶段唯一触发
静态代码块(static {})在 JVM 执行「类初始化」阶段运行,且仅一次。这个阶段由首次主动使用类触发,比如:
- 调用该类的 public static 方法
- 访问非编译期常量的 public static 字段(如
public static int PORT = 8080;) -
new该类的实例 - 反射调用
Class.forName("X")
多个静态代码块按源码从上到下顺序执行,合并进 JVM 的 <clinit></clinit> 方法中。它不能访问实例成员,只用于类级一次性初始化,例如加载配置、注册驱动、预热缓存。
普通代码块:纯方法内语句,与类加载无关
普通代码块(方法内部的 {})完全不涉及类加载或对象初始化机制。它的执行时机只取决于:
- 所在方法是否被调用
- 执行流是否到达该代码块位置
它只是局部作用域控制手段,变量出了大括号就失效。哪怕类从未被初始化(比如一直没 new、也没调用任何 static 成员),只要方法被执行到这块,它就运行。它和静态代码块之间没有固定先后关系,因为两者根本不在同一个执行维度上。
关键区别一句话说清
静态代码块属于类生命周期的起点,在类首次初始化时强制运行;普通代码块属于方法执行流的一部分,是临时的语法结构,只随方法调用而动态出现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











