Java代码块是控制初始化逻辑和变量生命周期的核心机制,分为静态代码块(类加载时执行一次)、构造代码块(每次new时执行)、局部代码块(限制作业域)和同步代码块(精准线程同步)。

静态代码块:类加载时只跑一次
用 static { ... } 定义,随类加载而执行,且仅一次。适合做全局性、一次性初始化,比如注册JDBC驱动、读取配置文件、初始化静态常量。
注意三点:
- 不能访问非静态成员(因为此时实例还没诞生)
- 多个静态代码块按书写顺序执行
- 避免耗时操作(如网络请求、大文件读取),否则会拖慢整个类加载过程
构造代码块(实例初始化块):每次 new 都触发
不加 static,直接写在类体里:{ ... }。它在每个对象创建时、构造方法执行前运行,天然适配多构造器场景。
典型用途:
立即学习“Java免费学习笔记(深入)”;
- 抽取多个构造方法共有的初始化逻辑(如日志打印、资源预热)
- 给实例变量赋默认值(比字段直接赋值更灵活,可含复杂逻辑)
- 多个构造代码块按定义顺序依次执行
局部代码块:缩小变量作用域
写在方法、循环或条件语句内部的 { ... },最常见也最容易被忽略。它的核心价值是“限域”——让临时变量及时释放,减少内存占用和命名冲突。
例如:
- 在 for 循环内声明计数器,出块即失效,无法误用
- 在 if 分支中定义中间结果,避免污染外层作用域
- 配合 try-catch 使用,隔离异常处理中的临时对象
同步代码块:精准控制线程安全
用 synchronized(锁对象) { ... } 包裹临界区。它比同步方法粒度更细,能避免无谓的锁竞争。
关键细节:
- 锁对象要明确且稳定(常用 this、类名.class 或专用 private final Object lock)
- 不要锁 String、Integer 等可能被池化复用的对象,易引发意外死锁
- 块内只放真正需要保护的代码,越短越好


















