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.
Aufgabe
EinfachErstellen wir ein GameConfig-System, das statische Blöcke verwendet, um Spieleinstellungen zu initialisieren, sobald die Klasse zum ersten Mal geladen wird. Dies ist ideal für eine Konfiguration, die berechnet oder einmalig eingerichtet werden muss, bevor Spielobjekte erstellt werden.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
GameConfig.java: Erstelle eine Konfigurationsklasse, die ihre Einstellungen mithilfe statischer Blöcke initialisiert:- Ein privates statisches Array
levelThresholds(int[]), das die zum Erreichen jeder Stufe erforderliche Punktzahl speichert - Eine private statische Variable
maxLevel(int), die die Gesamtzahl der Stufen speichert - Eine private statische Variable
configLoaded(boolean), um zu verfolgen, ob die Initialisierung erfolgt ist - Verwende einen statischen Block, um
maxLevelauf 5 zu initialisieren und"Initializing game configuration..."auszugeben - Verwende einen zweiten statischen Block, um das Array
levelThresholdsmit einer Größe gleichmaxLevelzu erstellen, es anschließend so zu füllen, dass jede Stufelevel * 100Punkte erfordert (Stufe 1 benötigt 100, Stufe 2 benötigt 200 usw.), undconfigLoadedauftruezu setzen - Eine statische Methode
getThreshold(int level), die den Schwellenwert für diese Stufe zurückgibt (Stufen beginnen bei 1) - Eine statische Methode
getMaxLevel(), die die maximale Stufe zurückgibt - Eine statische Methode
isConfigLoaded(), die zurückgibt, ob die Konfiguration geladen wurde
- Ein privates statisches Array
Main.java: Zeige, dass die statischen Blöcke automatisch ausgeführt werden, wenn auf die Klasse zugegriffen wird. Du erhältst eine Eingabe: eine abzufragende Stufennummer. Gib vier Zeilen aus:Config loaded: trueoderConfig loaded: falseMax level: [maxLevel]Level [level] threshold: [threshold]Level 1 threshold: [threshold](zeige zusätzlich immer Stufe 1 an)
Du erhältst eine Eingabe: die abzufragende Stufennummer (int).
Beachte, wie die Initialisierungsnachricht ausgegeben wird, bevor irgendein Code deiner Main-Klasse ausgeführt wird – das ist der statische Block, der beim ersten Laden der Klasse ausgeführt wird!
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]"
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler