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
EinfachLassen 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
maxLevelauf 5 zu initialisieren und"Initializing game configuration..."auszugeben - Verwenden Sie einen zweiten statischen Block, um das
levelThresholds-Array mit einer Größe gleichmaxLevelzu erstellen, füllen Sie es dann so, dass jedes Levellevel * 100Punkte benötigt (Level 1 benötigt 100, Level 2 benötigt 200 usw.), und setzen SieconfigLoadedauftrue - 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
- Ein privates statisches Array
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: trueoderConfig loaded: falseMax 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]"
}
}
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 this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem