Menu
CoddyTech

静态代码块

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 17 课,共 87 课。

有时,你需要用比简单赋值更复杂的逻辑来初始化静态变量。静态代码块(也称为静态初始化器)会在类首次加载时运行一次,此时还没有创建任何对象,也没有调用任何静态方法。

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // 复杂的初始化逻辑
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

类加载到内存时,静态代码块会自动执行。无论你创建多少个对象,它都只会执行一次。它非常适合用于需要多条语句、计算或条件逻辑的初始化。

一个类中可以有多个静态块,它们会按照出现的顺序执行:

public class AppSettings {
    private static int[] values;
    
    static {
        values = new int[5];
    }
    
    static {
        for (int i = 0; i < values.length; i++) {
            values[i] = i * 10;
        }
    }
}

静态代码块通常用于初始化静态数组或集合、设置需要计算的配置值,以及在类级别执行一次性设置任务。

challenge icon

挑战

简单

我们来构建一个 GameConfig 系统,在类首次加载时使用静态块初始化游戏设置。这非常适合在创建任何游戏对象之前,只需计算或设置一次的配置。

你将创建两个文件来组织代码:

  • GameConfig.java:创建一个使用静态块初始化设置的配置类:
    • 一个私有静态数组 levelThresholds(int[]),用于存储达到每个等级所需的分数
    • 一个私有静态变量 maxLevel(int),用于存储等级总数
    • 一个私有静态变量 configLoaded(boolean),用于记录是否已完成初始化
    • 使用一个静态块将 maxLevel 初始化为 5,并打印 "Initializing game configuration..."
    • 使用第二个静态块创建大小等于 maxLevel 的 levelThresholds 数组,然后填入每个等级所需的分数,即等级号乘以 100(等级 1 需要 100 分,等级 2 需要 200 分,以此类推),并将 configLoaded 设为 true
    • 一个静态方法 getThreshold(int level),返回该等级所需的分数(等级从 1 开始计数)
    • 一个静态方法 getMaxLevel(),返回最高等级
    • 一个静态方法 isConfigLoaded(),返回配置是否已加载
  • Main.java:演示访问类时静态块会自动运行。你将收到一个输入:要查询的等级编号。打印四行:
    • Config loaded: true 或 Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold](始终也要显示等级 1)

你将收到一个输入:要查询的等级编号(int)。

注意,初始化消息会在你的任何 Main 代码运行之前打印,这是类首次加载时执行静态块的结果!

亲手试试

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: 访问 GameConfig,演示静态代码块的执行
        // 你首次访问 GameConfig 类时,其中的静态代码块会自动运行
        
        // TODO: 输出配置是否已加载
        // 格式:"Config loaded: true" 或 "Config loaded: false"
        
        // TODO: 输出最高等级
        // 格式:"Max level: [maxLevel]"
        
        // TODO: 输出输入等级对应的阈值
        // 格式:"Level [level] threshold: [threshold]"
        
        // TODO: 输出等级 1 对应的阈值
        // 格式:"Level 1 threshold: [threshold]"
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Java 在线编译器