静态块在类加载时执行一次,用于类级初始化;构造块在每次创建对象时执行,用于对象级通用初始化。二者按书写顺序执行,且遵循父类先于子类的规则。

写好静态块和构造块,核心是分清“类初始化”和“对象初始化”的边界——该一次性做的事别重复做,该每次新建都做的事别漏掉。
静态代码块:只跑一次的类级准备
用 static {} 定义,在类第一次被 JVM 加载时执行,且仅一次。它不依赖对象创建,哪怕你只调用一个静态方法,它也会触发。
- 只能访问静态成员(静态变量、静态方法),不能用 this 或实例字段
- 多个静态块按书写顺序依次执行,适合拆分复杂初始化逻辑
- 典型用途:加载 JDBC 驱动、读取全局配置文件、初始化单例缓存、设置系统属性
- 异常必须显式处理,不能抛出未检查异常以外的异常
构造代码块:每次 new 都自动执行的对象通用初始化
用普通 {} 定义,写在类体中、方法外。它在每次调用任意构造方法前执行,位置在构造方法体之前,但晚于静态块。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可访问实例变量、静态成员,也能调用实例方法和静态方法
- 多个构造块也按定义顺序执行,适合抽取所有构造器共用的初始化逻辑
- 避免在每个构造方法里重复写默认赋值、日志埋点、资源预分配等代码
- 不能有返回值,也不能加访问修饰符或 static 关键字
别踩这些常见坑
静态块和构造块容易混淆,关键区别不在语法多一个 static,而在生命周期归属。
- 普通方法里的 {} 是局部代码块,不属于初始化机制,不会自动触发
- 静态块里写 return 会编译报错;构造块里写 return 也不合法
- 父类的静态块先于子类执行;父类构造块在子类构造块之前、但在父类构造方法体之前运行
- 不要在静态块里初始化依赖 Spring 容器的 Bean,此时上下文尚未启动
一个清晰的执行顺序示例
当执行 new Child() 时,实际执行流是:
- 父类静态块 → 子类静态块(类加载阶段,只首次触发)
- 父类构造块 → 父类构造方法体 → 子类构造块 → 子类构造方法体(每次 new 都走一遍)
这个顺序稳定可靠,是 JVM 规范保证的,可作为设计初始化逻辑的依据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










