Menu
Coddy logo textTech

Statische Blöcke

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 17 von 87.

Manchmal müssen Sie statische Variablen mit einer Logik initialisieren, die komplexer ist als eine einfache Zuweisung. Ein statischer Block (auch statischer Initialisierer genannt) wird einmal ausgeführt, wenn die Klasse zum ersten Mal geladen wird, bevor Objekte erstellt oder statische Methoden aufgerufen werden.

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // Komplexe Initialisierungslogik
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

Der statische Block wird automatisch ausgeführt, wenn die Klasse in den Speicher geladen wird. Dies geschieht nur einmal, unabhängig davon, wie viele Objekte Sie erstellen. Er eignet sich perfekt für die Initialisierung, die mehrere Anweisungen, Berechnungen oder bedingte Logik erfordert.

Sie können mehrere statische Blöcke in einer Klasse haben, und sie werden in der Reihenfolge ausgeführt, in der sie erscheinen:

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

Statische Blöcke werden häufig für die Initialisierung statischer Arrays oder Sammlungen, das Einrichten von Konfigurationswerten, die Berechnungen erfordern, und das Ausführen einmaliger Setup-Aufgaben auf Klassenebene verwendet.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein GameConfig-System erstellen, das statische Blöcke verwendet, um Spieleinstellungen zu initialisieren, wenn die Klasse zum ersten Mal geladen wird. Dies ist ideal für Konfigurationen, die berechnet oder einmalig eingerichtet werden müssen, bevor Spielobjekte erstellt werden.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • GameConfig.java: Erstellen Sie eine Konfigurationsklasse, die ihre Einstellungen mithilfe statischer Blöcke initialisiert:
    • Ein privates statisches Array levelThresholds (int[]), das die Punktzahl speichert, die zum Erreichen jedes Levels erforderlich ist
    • Eine private statische Variable maxLevel (int), die die Gesamtzahl der Level speichert
    • Eine private statische Variable configLoaded (boolean), um zu verfolgen, ob die Initialisierung stattgefunden hat
    • Verwenden Sie einen statischen Block, um maxLevel auf 5 zu initialisieren und "Initializing game configuration..." auszugeben
    • Verwenden Sie einen zweiten statischen Block, um das levelThresholds-Array mit einer Größe gleich maxLevel zu erstellen, füllen Sie es dann so, dass jedes Level level * 100 Punkte benötigt (Level 1 benötigt 100, Level 2 benötigt 200 usw.), und setzen Sie configLoaded auf true
    • Eine statische Methode getThreshold(int level), die den Punkteschwellenwert für dieses Level zurückgibt (Level sind 1-indiziert)
    • Eine statische Methode getMaxLevel(), die das maximale Level zurückgibt
    • Eine statische Methode isConfigLoaded(), die zurückgibt, ob die Konfiguration geladen wurde
  • Main.java: Demonstrieren Sie, dass die statischen Blöcke automatisch ausgeführt werden, wenn auf die Klasse zugegriffen wird. Sie erhalten eine Eingabe: eine abzufragende Levelnummer. Geben Sie vier Zeilen aus:
    • Config loaded: true oder Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (zeigen Sie auch immer Level 1 an)

Sie erhalten eine Eingabe: die Levelnummer (int), die abgefragt werden soll.

Beachten Sie, wie die Initialisierungsmeldung ausgegeben wird, bevor Ihr Main-Code ausgeführt wird – das ist der statische Block, der ausgeführt wird, wenn die Klasse zum ersten Mal geladen wird!

Spickzettel

Ein statischer Block (oder statischer Initialisierer) wird einmal ausgeführt, wenn die Klasse zum ersten Mal geladen wird, bevor Objekte erstellt oder statische Methoden aufgerufen werden. Er wird für komplexe Initialisierungslogik verwendet, die mehrere Anweisungen erfordert.

public class Example {
    private static String value;
    
    static {
        // Initialisierungslogik
        value = "initialized";
        System.out.println("Static block executed");
    }
}

Statische Blöcke werden automatisch ausgeführt, wenn die Klasse in den Speicher geladen wird, und zwar nur einmal, unabhängig davon, wie viele Objekte erstellt werden.

Sie können mehrere statische Blöcke in einer Klasse haben. Sie werden in der Reihenfolge ausgeführt, in der sie erscheinen:

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

Häufige Verwendungszwecke sind das Initialisieren von statischen Arrays oder Collections, das Einrichten von Konfigurationswerten, die Berechnungen erfordern, und das Durchführen von einmaligen Setup-Aufgaben auf Klassenebene.

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Greife auf GameConfig zu, um die Ausführung des statischen Blocks zu demonstrieren
        // Die statischen Blöcke in GameConfig werden automatisch ausgeführt, wenn du zum ersten Mal auf die Klasse zugreifst
        
        // TODO: Gib aus, ob die Konfiguration geladen ist
        // Format: "Config loaded: true" oder "Config loaded: false"
        
        // TODO: Gib das maximale Level aus
        // Format: "Max level: [maxLevel]"
        
        // TODO: Gib den Schwellenwert für das eingegebene Level aus
        // Format: "Level [level] threshold: [threshold]"
        
        // TODO: Gib den Schwellenwert für Level 1 aus
        // Format: "Level 1 threshold: [threshold]"
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung