在Java中,代码块(Code Block) 是由大括号 {} 包裹的代码片段,主要用于控制变量的作用域和对象的初始化。根据位置和修饰符,可分为以下四类:
一、普通代码块(局部代码块)
位置:方法内部
作用:
- 限定变量生命周期
void demo() { int outer = 10; { // 普通代码块 int inner = 20; // 仅在此块内有效 System.out.println(inner); // ✅ } System.out.println(inner); // ❌ 编译错误(inner超出作用域) System.out.println(outer); // ✅ } - 划分逻辑作用域
避免变量名冲突,隔离临时变量。
二、构造代码块(实例初始化块)
位置:类内部,方法外部(无static修饰)
作用:
- 初始化对象成员
每次创建对象时自动执行(优先于构造函数)
输出:public class Person { private int id; { // 构造代码块 System.out.println("执行构造块"); id = generateId(); // 初始化逻辑 } public Person() { System.out.println("执行构造函数"); } }执行构造块
执行构造函数 - 多个块按顺序合并执行
编译器会将多个构造块合并。
三、静态代码块(类初始化块)
位置:类内部,方法外部(用static修饰)
作用:
- 初始化静态成员
类加载时执行一次(仅首次加载时)public class ConfigLoader { static String config; static { // 静态代码块 System.out.println("加载配置文件"); config = loadConfig(); // 初始化静态资源 } public static void main(String[] args) { System.out.println(config); // 直接使用已初始化的值 } } - 典型场景
- 加载JDBC驱动(
Class.forName()) - 初始化全局配置
- 加载JDBC驱动(
四、同步代码块(线程安全块)
位置:方法内部(用synchronized修饰)
作用:
- 多线程同步控制
确保同一时刻只有一个线程执行该代码块public class Counter { private int count; private final Object lock = new Object(); public void increment() { synchronized(lock) { // 同步代码块 count++; // 线程安全操作 } } } - 性能优化
比同步整个方法更细粒度的锁控制。
⚠️ 关键区别总结
| 类型 | 位置 | 执行时机 | 核心作用 |
|---|---|---|---|
| 普通代码块 | 方法内部 | 方法调用时 | 限制变量作用域 |
| 构造代码块 | 类内部(无static) | 每次new对象时(先于构造器) | 对象成员初始化 |
| 静态代码块 | 类内部(有static) | 类首次加载时(仅一次) | 静态资源初始化 |
| 同步代码块 | 方法内部 | 线程进入synchronized时 | 线程安全控制 |
使用建议
- 构造块 vs 构造函数
- 多个构造函数共享的初始化逻辑 → 用构造块
- 特定构造函数的定制逻辑 → 用构造函数
- 静态块注意事项
- 避免循环依赖(如:
static A=a; static B=b;若A依赖B会导致初始化失败)
- 避免循环依赖(如:
- 同步块锁对象
- 推荐使用私有锁(
private final Object lock)而非this,防止外部恶意加锁
- 推荐使用私有锁(
💡 本质:所有代码块都是JVM控制执行流程和内存分配的基础工具,合理使用可提升代码的健壮性和可维护性。

被折叠的 条评论
为什么被折叠?



