选静态代码块还是构造代码块,核心看初始化目标是“类级别”还是“对象级别”:静态代码块用于类加载时一次性的类级初始化,构造代码块用于每次实例化时的对象级通用初始化。

选静态代码块还是构造代码块,核心就看初始化目标是“类级别”还是“对象级别”。
静态代码块:只做一次的类级准备
用 static {} 定义,类第一次被加载时自动运行,且仅一次。它不依赖对象创建,哪怕你从没 new 过实例,只要触发类加载(比如调用静态方法、访问静态字段、反射加载),它就执行。
- 只能操作静态成员,不能访问 this、实例变量或普通方法
- 多个静态块按书写顺序依次执行
- 适合场景:加载 JDBC 驱动、读取全局配置文件、初始化 static final 常量、注册框架服务
构造代码块:每次 new 都走一遍的对象通用初始化
直接写 {},放在类体里、方法外。每次调用任意构造器前,它都会先执行,且可访问实例变量和静态成员。
- 多个构造块也按定义顺序执行,总在构造方法体之前
- 能避免在多个构造器中重复写相同逻辑(比如默认状态赋值、日志埋点、资源预分配)
- 适合场景:统一设置对象初始状态、记录创建日志、为所有子类型提供共性初始化
别把普通代码块混进来
写在方法内部的 {} 是普通代码块,作用域仅限该方法,生命周期最短。它不会在 new 对象时自动触发,也不能替代前两者。
立即学习“Java免费学习笔记(深入)”;
- 不能访问 static 成员(除非显式用类名调用)
- 主要用于限制局部变量作用域或组织逻辑段,比如临时计算、异常分支处理
- 和类/对象初始化完全无关
继承时的执行顺序要心里有数
父子类同时存在时,初始化严格分两阶段:
- 类加载阶段:父类静态块 → 子类静态块(各只一次)
- 实例化阶段:父类构造块 → 父类构造方法 → 子类构造块 → 子类构造方法(每 new 一次全走一遍)
这意味着:若子类静态初始化依赖父类静态资源,得确保父类静态块已先执行;若某逻辑必须随每个对象重置(如计数器、缓存清理),就必须用构造块,而不是静态块。


















