静态代码块
本课属于 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;
}
}
}静态代码块通常用于初始化静态数组或集合、设置需要计算的配置值,以及在类级别执行一次性设置任务。
挑战
简单我们来构建一个 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: falseMax 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]"
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器