静态代码块属于类、只在类加载时执行一次、只能访问静态成员;构造代码块属于实例、每次创建对象时执行、可访问实例成员和this。

静态代码块和构造代码块都写在类里、方法外,用大括号 {} 包裹,但加不加 static 关键字,决定了它们的归属、执行时机和作用范围。
看定义位置和关键字
静态代码块必须带 static 修饰符,如:static { ... };构造代码块不带任何修饰符,就是裸的 { ... }。两者都不能写在方法内部,否则编译报错。
- 静态代码块属于类本身,是“类级”的
- 构造代码块属于对象创建过程,是“实例级”的
看执行时机和次数
静态代码块在类第一次被 JVM 加载时执行,且仅一次;构造代码块在每次调用 new 创建对象时执行,每 new 一次就跑一遍。
- 哪怕你连续 new 100 个对象,静态代码块只执行第 1 次加载时那一次
- 而构造代码块会跟着每个对象诞生,严格在对应构造方法体执行之前运行
- 多个静态代码块按从上到下顺序执行;多个构造代码块也按定义顺序依次执行
看能访问什么成员
静态代码块只能访问静态变量和静态方法,不能直接使用 this 或实例成员——因为此时还没有任何对象。
构造代码块可以访问实例变量、实例方法和 this,对象内存已分配,只是构造方法还没开始执行。
- 比如在构造代码块里给
name = "default"是合法的 - 但在静态代码块里写
name = "default"会编译失败(除非name是 static 的)
看典型用途
静态代码块适合一次性准备动作:读配置文件、初始化连接池、注册驱动、设置全局常量。
构造代码块适合对象共性初始化:统一设置默认状态、记录创建时间、分配唯一 ID、重置内部计数器。
- 它能避免在多个构造方法里重复写相同初始化逻辑
- 但它不是构造方法,不能传参,也不能重载










