静态代码块最先执行且仅一次,构造代码块每次new对象时在构造器前执行,局部块仅在方法调用且执行流到达时运行;三者分别对应类加载、对象创建和方法执行阶段。

Java对象的生命周期从类加载开始,到对象销毁结束。其中静态块和构造块的执行时机、顺序与作用各不相同,直接影响初始化逻辑的正确性。掌握它们不是背口诀,而是理解JVM在类加载和对象创建两个阶段分别做了什么。
静态代码块:类加载时只跑一次
静态代码块用 static {} 定义,在类被JVM首次主动使用(比如 new 对象、访问静态成员、反射加载)时触发。它属于“类级别”,和任何对象无关。
- 多个静态块按源码中出现顺序依次执行
- 可初始化静态变量,也可做一次性资源准备(如数据库连接池启动、配置读取)
- 只能访问静态成员,不能用 this 或实例变量
- 即使没创建任何对象,只要类被加载,它就执行
构造代码块:每次 new 都走一遍
构造代码块就是类中直接写的 {}(无 static)。它不属于方法,也不属于静态上下文,而是在每次调用构造方法前自动插入执行——本质上,编译器会把它“复制”进每个构造方法的开头。
- 执行时机晚于静态块,早于构造方法体
- 可以访问静态成员和实例成员(包括未显式初始化的字段)
- 适合抽取多个构造方法共用的初始化逻辑,避免重复代码
- 子类继承时,构造块仅在本类中生效,不继承也不覆盖父类的构造块
执行顺序实战:从父类到子类,从静态到实例
一个典型场景是创建子类对象:new Child()。完整流程如下:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先触发父类加载 → 执行父类所有静态块(按序)
- 再触发子类加载 → 执行子类所有静态块(按序)
- 开始实例化 → 先执行父类构造块,再调父类构造方法
- 回到子类 → 执行子类构造块,再调子类构造方法
注意:静态部分只在首次加载时走一遍;后续再 new 多个对象,只重复执行构造块 + 构造方法。
容易踩坑的细节
静态变量初始化语句和静态块混合时,顺序严格按代码书写位置来。例如:
static { System.out.println("A"); }static int x = getValue();
static { System.out.println("B"); }
输出一定是 A → “getValue内部打印” → B。构造块同理,它和实例变量初始化也按源码顺序交织执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










