在 Java 中,代码块是用{}包裹的一段代码逻辑,根据定义位置、修饰符和用途,可分为普通代码块构造代码块(实例代码块)静态代码块同步代码块四类,它们的执行时机、作用域和功能各有差异。

1. 普通代码块

  • 定义:直接声明在方法、循环或条件语句等局部作用域中的代码块,无特殊修饰符。
  • 作用:限定变量作用域(变量仅在代码块内有效),或组织局部逻辑,避免代码冗余。
  • 执行时机:调用所在方法 / 执行到代码块位置时执行。

示例:

public class NormalBlockDemo {
    public static void main(String[] args) {
        // 普通代码块
        {
            int num = 10;
            System.out.println("普通代码块内变量:" + num); // 输出10
        }
        // System.out.println(num); // 错误:num作用域仅限于代码块内
    }
}

2. 构造代码块(实例代码块)

  • 定义:直接声明在类中(方法外部)的代码块,无修饰符。
  • 作用:提取多个构造器的公共初始化逻辑(如初始化实例变量),避免构造器代码重复。
  • 执行时机每次创建对象时执行,且优先于构造器执行;多个构造代码块按定义顺序执行。

示例:

public class ConstructorBlockDemo {
    private String name;

    // 构造代码块
    {
        System.out.println("构造代码块执行");
        name = "默认名称"; // 初始化实例变量
    }

    public ConstructorBlockDemo() {
        System.out.println("无参构造器执行");
    }

    public static void main(String[] args) {
        new ConstructorBlockDemo();
        // 输出:构造代码块执行 → 无参构造器执行
    }
}

3. 静态代码块

  • 定义:用static修饰的代码块,直接声明在类中(方法外部)。
  • 作用:初始化静态变量、加载全局资源(如 JDBC 驱动)、执行类级别的初始化操作。
  • 执行时机类加载时执行且仅执行一次(优先于构造代码块和构造器);多个静态代码块按定义顺序执行。

示例:

public class StaticBlockDemo {
    public static String config;

    // 静态代码块
    static {
        System.out.println("静态代码块执行");
        config = "全局配置初始化"; // 初始化静态变量
    }

    public StaticBlockDemo() {
        System.out.println("构造器执行");
    }

    public static void main(String[] args) {
        new StaticBlockDemo();
        // 输出:静态代码块执行 → 构造器执行
    }
}

4. 同步代码块

  • 定义:用synchronized修饰的代码块,用于多线程环境。
  • 作用:保证同一时间只有一个线程执行代码块逻辑,解决多线程并发安全问题(如共享变量修改)。
  • 执行时机:线程获取指定对象的锁后执行,执行完毕释放锁。

示例:

public class SyncBlockDemo {
    private int count = 0;
    private final Object lock = new Object(); // 锁对象

    public void increment() {
        // 同步代码块
        synchronized (lock) {
            count++;
            System.out.println("count = " + count);
        }
    }

    public static void main(String[] args) {
        SyncBlockDemo demo = new SyncBlockDemo();
        new Thread(demo::increment).start();
        new Thread(demo::increment).start();
    }
}

代码块执行顺序总结

当类加载并创建对象时,执行优先级为:静态代码块(类加载时执行一次) → 构造代码块(每次创建对象执行) → 构造器(每次创建对象执行)

若存在继承关系:父类静态代码块 → 子类静态代码块 → 父类构造代码块 → 父类构造器 → 子类构造代码块 → 子类构造器

注意事项

  • 静态代码块不能访问实例变量 / 方法(仅能访问静态成员),因类加载时实例尚未创建。
  • 构造代码块用于实例初始化,静态资源初始化需用静态代码块。
  • 同步代码块的锁对象建议用final修饰,避免锁对象被修改导致锁失效。

合理使用代码块可提升代码可读性和执行效率,是 Java 组织逻辑的重要方式。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐