静态代码块先执行,构造代码块后执行;静态代码块在类加载时执行且仅一次,按源码顺序运行,不可访问实例成员;构造代码块在每次创建对象时执行,位于super()之后、构造方法体之前,可访问静态及已声明的实例成员。

静态代码块先执行,构造代码块后执行,且只在创建对象时触发。这个顺序不看代码书写位置,而是由 JVM 的类加载和对象初始化阶段决定。
静态代码块:类加载时执行,仅一次
当类第一次被主动使用(比如 new 实例、调用 static 方法、访问非 final static 字段),JVM 加载该类,立即执行所有 static{} 块,按源码从上到下顺序运行。它不能访问任何实例成员,因为此时还没有对象。
- 多个 static 块按定义顺序依次执行
- 若抛出未捕获异常,整个类初始化失败,后续访问都报 ExceptionInInitializerError
- 常见用途:初始化全局配置、注册驱动、预热缓存
构造代码块:每次 new 对象时执行,紧挨着父类构造调用之后
构造代码块(即 {},无 static)不属于类加载环节,而属于对象创建流程。它会被编译器“复制”到每个构造方法的开头,在 super() 返回后、构造方法体开始前执行。
- 无论有几个重载构造器,只要被调用,该块就执行一次
- 可访问静态成员和已声明的实例字段(声明需在块之前)
- 适合抽取多个构造器共用的初始化逻辑,比如默认赋值、日志记录
涉及继承时,完整执行链更清晰
以 new Child() 为例:
- 先触发 Parent 类加载 → 执行 Parent 所有 static 块
- 再触发 Child 类加载 → 执行 Child 所有 static 块
- 开始实例化:Parent 构造块 → Parent 构造方法
- 继续实例化:Child 构造块 → Child 构造方法
注意:静态部分全程只走一遍;后续再 new 多个对象,只重复构造块 + 构造方法。
变量初始化语句也参与执行流
静态变量赋值(public static int x = 1;)和静态代码块同级,按出现顺序执行;实例变量赋值(private String name = "Tom";)和构造代码块也同级,同样按定义顺序执行。它们不是语法糖,是真实影响执行节奏的初始化步骤。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











