Wann werden statische Felder initialisiert? Wenn ich nie eine Klasse instanziiere, aber auf ein statisches Feld zugreife, werden ALLE statischen Blöcke und privaten statischen Methoden, die zum Instanziieren privater statischer Felder verwendet werden, zu diesem Zeitpunkt (in der Reihenfolge) aufgerufen?
Was ist, wenn ich eine statische Methode aufrufe? Läuft es auch alle statischen Blöcke? Vor der Methode?
java
static
initialization
Tony R.
quelle
quelle
Antworten:
Die statische Initialisierung einer Klasse erfolgt normalerweise unmittelbar vor dem ersten Auftreten eines der folgenden Ereignisse:
Für eine Klasse der obersten Ebene wird eine in der Klasse lexikalisch verschachtelte Assert-Anweisung ausgeführt1 .Siehe JLS 12.4.1 .
Es ist auch möglich, eine Klasse mithilfe
Class.forName(fqn, true, classLoader)
der Kurzform zur Initialisierung zu zwingen (sofern sie noch nicht initialisiert wurde)Class.forName(fqn)
1 - Der letzte Aufzählungspunkt war im JLS für Java 6 bis Java 8 vorhanden, aber es war anscheinend ein Fehler in der Spezifikation. Es wurde schließlich in Java 9 JLS korrigiert: siehe Quelle .
quelle
String
s werden ersetzt und nicht referenziert. Wenn Sie auf eineclass Other { public static final int VAL = 10; }
aus einer Klasse verweisenMyClass { private int = Other.VAL; }
, wird die KlasseOther
nicht geladen. Stattdessen ersetzt der Compiler einfach das letzte Feld zur Kompilierungszeit.String
Variablen, sondern nur für diejenigen, die durch einen konstanten Ausdruck initialisiert wurden.static
solange dies üblich ist.Statische Felder werden während der " Initialisierungsphase " des Ladens der Klasse (Laden, Verknüpfen und Initialisieren) initialisiert, die statische Initialisierer und Initialisierungen ihrer statischen Felder enthält. Die statischen Initialisierer werden in einer in der Klasse definierten Textreihenfolge ausgeführt.
Betrachten Sie das Beispiel:
Die Test.b wird gedruckt,
null
da beim AufrufensayHello
von im statischen Bereich die statische Variablea
nicht initialisiert wurde.quelle
Ja, alle statischen Initialisierer werden ausgeführt, bevor Sie zum ersten Mal auf die Klasse zugreifen. Wenn es anders wäre, würde ich es einen Fehler nennen.
quelle