静态代码块作用于类、构造函数作用于对象;前者在类加载时执行一次,初始化静态资源;后者在new时每次执行,初始化实例状态;执行顺序为静态代码块→构造代码块→构造函数;二者均不可继承。

静态代码块(static{})和构造函数根本不是同一层级的概念:前者作用于类,后者作用于对象。它们执行时机、触发条件、用途和访问能力都不同。
执行时机与触发条件不同
静态代码块在类第一次被加载进 JVM 时执行,仅一次,和是否创建对象无关;哪怕只写 Class.forName("Xxx") 或引用其静态成员,就会触发。而构造函数只有在用 new 创建实例时才调用,每次 new 都会执行一次(对应选中的那个构造函数)。
- 静态代码块:类加载时自动运行,不依赖对象存在
- 构造函数:必须通过 new 实例化才触发,且只属于当前新建的对象
初始化目标和作用范围不同
静态代码块用来初始化类级别的资源,比如静态配置、单例实例、日志器、数据库连接池等;它不能访问任何 this、实例变量或普通方法。构造函数则负责给每个新对象设置初始状态,可以操作所有实例字段、调用实例方法,甚至用 this() 调用其他构造函数。
- 静态代码块只能操作
static成员(变量/方法) - 构造函数可操作全部成员(包括实例和静态),但主要面向实例初始化
执行顺序和复用逻辑不同
当一个类既有静态代码块、构造代码块({}),又有多个构造函数时,执行顺序固定为:静态代码块 → 构造代码块 → 构造函数。其中构造代码块虽非 static,但会在每次 new 时执行,且在构造函数体之前——它适合提取多个构造函数的公共初始化逻辑;而静态代码块无法做到这点,它只跑一次,也不接受参数。
- 多个构造函数共用的初始化代码,应放进构造代码块(
{}),不是 static 块 - 需要“一次性预热”的全局资源(如读取配置文件、注册驱动),才用 static 块
能否被继承或重写?
静态代码块不属于任何对象,不参与继承体系,子类加载时会单独执行自己的 static 块(父类的已执行过,不再重复)。构造函数也不能被继承,但子类可通过 super() 显式调用父类构造函数——这是对象初始化链条的关键环节。
- static 块是“类级独有”,父子类各自执行一次
- 构造函数体现“对象创建链”,子类构造默认隐式调用父类无参构造
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











