java代码块分三类:普通代码块在方法内执行、限局部作用域;构造代码块每次创建对象时、构造器前执行,用于实例通用初始化;静态代码块在类加载时仅执行一次,用于类级资源初始化。

Java里的代码块看着都是大括号 {},但位置和关键字一变,作用和执行时机就完全不同。搞不清它们,容易在初始化顺序、变量访问、类加载逻辑上踩坑。
普通代码块:方法内的临时作用域
写在方法内部的 {} 就是普通代码块。它不参与对象或类的生命周期管理,纯粹用来控制变量作用域和组织局部逻辑。
- 每次调用该方法时都会执行,执行顺序按代码中出现的位置决定(先写先执行)
- 块内定义的变量只在该块内有效,出了大括号就不可见,能避免命名冲突
- 不能脱离方法存在——不允许直接写在类体最外层
- 常见用途:临时计算、限制资源生命周期、配合 try-catch 做精细作用域控制
构造代码块:每个对象诞生时的统一初始化
写在类里、方法外,没加 static 的 {} 就是构造代码块。它不属于某个方法,也不属于类本身,而是属于“每一次实例化”。
- 每次
new一个对象时自动执行,且在构造方法体执行之前运行 - 多个构造代码块按从上到下的顺序依次执行,可用来提取多个构造器共用的初始化逻辑
- 可以访问实例变量和实例方法(此时对象内存已分配,但构造方法还没开始执行)
- 注意:它不是构造方法,不接收参数,也不能重载,只是初始化流程中的固定环节
静态代码块:类加载时的唯一一次准备动作
用 static{} 定义,同样位于类中、方法外。它是 JVM 加载类时触发的,与任何对象无关。
- 整个程序运行期间只执行一次,在类第一次被主动使用(如 new、调用静态方法、访问静态字段等)前完成
- 多个静态代码块按定义顺序执行,常用于初始化
static字段、读取配置、建立连接池等类级资源 - 只能访问静态成员,不能直接访问实例变量或方法(因为此时还没有对象)
- 不能写在任何方法内部,否则编译报错
执行顺序一目了然
当首次用到某个类(比如执行 main 方法里 new X()),整体执行流程是:
- JVM 加载类 → 执行所有静态代码块(仅一次)
- 进入
main或其他方法 → 执行其中的普通代码块 - 执行
new X()→ 分配内存 → 执行所有构造代码块(按顺序)→ 执行对应构造方法
这个链条决定了初始化逻辑的依赖关系,也是排查“变量未初始化”“空指针”等问题的关键线索。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











