Menu
CoddyTech

Khối tĩnh

Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 17 trên 87.

Đôi khi, bạn cần khởi tạo các biến tĩnh bằng logic phức tạp hơn một phép gán đơn giản. Khối tĩnh (còn gọi là bộ khởi tạo tĩnh) chạy một lần khi lớp được tải lần đầu, trước khi bất kỳ đối tượng nào được tạo hoặc phương thức tĩnh nào được gọi.

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // Logic khởi tạo phức tạp
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

Khối static (static block) tự động chạy khi lớp được tải vào bộ nhớ. Việc này chỉ xảy ra một lần, bất kể bạn tạo bao nhiêu đối tượng. Khối này rất phù hợp để khởi tạo khi cần nhiều câu lệnh, phép tính hoặc logic điều kiện.

Bạn có thể có nhiều khối static trong một lớp, và chúng chạy theo thứ tự xuất hiện:

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;
        }
    }
}

Các khối lệnh tĩnh thường được dùng để khởi tạo mảng hoặc tập hợp tĩnh, thiết lập các giá trị cấu hình cần tính toán và thực hiện các tác vụ thiết lập một lần ở cấp lớp.

challenge icon

Thử thách

Dễ

Hãy tạo một hệ thống GameConfig dùng các khối static để khởi tạo cài đặt trò chơi khi lớp được tải lần đầu. Cách này rất phù hợp với cấu hình cần được tính toán hoặc thiết lập một lần trước khi tạo bất kỳ đối tượng trò chơi nào.

Bạn sẽ tạo hai tệp để sắp xếp code:

  • GameConfig.java: Tạo một lớp cấu hình khởi tạo các cài đặt bằng các khối static:
    • Một mảng static riêng tư levelThresholds (int[]) lưu số điểm cần thiết để đạt từng cấp độ
    • Một biến static riêng tư maxLevel (int) lưu tổng số cấp độ
    • Một biến static riêng tư configLoaded (boolean) để theo dõi việc khởi tạo đã diễn ra hay chưa
    • Dùng một khối static để khởi tạo maxLevel thành 5 và in ra "Initializing game configuration..."
    • Dùng khối static thứ hai để tạo mảng levelThresholds có kích thước bằng maxLevel, rồi điền vào mảng sao cho mỗi cấp độ cần level * 100 điểm (cấp độ 1 cần 100 điểm, cấp độ 2 cần 200 điểm, v.v.), rồi đặt configLoaded thành true
    • Một phương thức static getThreshold(int level) trả về ngưỡng điểm của cấp độ đó (cấp độ được đánh số bắt đầu từ 1)
    • Một phương thức static getMaxLevel() trả về cấp độ tối đa
    • Một phương thức static isConfigLoaded() trả về trạng thái cấu hình đã được tải hay chưa
  • Main.java: Minh họa rằng các khối static tự động chạy khi lớp được truy cập. Bạn sẽ nhận một đầu vào: số cấp độ cần truy vấn. In ra bốn dòng:
    • Config loaded: true hoặc Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (luôn hiển thị cả cấp độ 1)

Bạn sẽ nhận một đầu vào: số cấp độ (int) cần truy vấn.

Hãy chú ý thông báo khởi tạo được in ra trước khi bất kỳ code nào trong Main chạy. Đó là vì khối static thực thi khi lớp được tải lần đầu!

Tự làm thử

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Truy cập GameConfig để minh họa cách khối lệnh tĩnh chạy
        // Các khối lệnh tĩnh trong GameConfig sẽ tự động chạy khi bạn truy cập lớp này lần đầu
        
        // TODO: In ra trạng thái tải config
        // Định dạng: "Config loaded: true" hoặc "Config loaded: false"
        
        // TODO: In ra cấp độ tối đa
        // Định dạng: "Max level: [maxLevel]"
        
        // TODO: In ra ngưỡng của cấp độ đầu vào
        // Định dạng: "Level [level] threshold: [threshold]"
        
        // TODO: In ra ngưỡng của cấp độ 1
        // Định dạng: "Level 1 threshold: [threshold]"
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Java online