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? Führt es auch alle statischen Blöcke aus? Vor der Methode?
Die statische Initialisierung einer Klasse erfolgt normalerweise unmittelbar vor dem ersten Auftreten eines der folgenden Ereignisse:
- eine Instanz der Klasse wird erstellt,
- eine statische Methode der Klasse wird aufgerufen,
- ein statisches Feld der Klasse zugewiesen wird,
- ein nicht konstantes statisches Feld verwendet wird, oder
für eine Top-Level-Klasse wird eine Assert-Anweisung ausgeführt, die lexikalisch innerhalb der Klasse verschachtelt ist1.
Sehen JLS 12.4.1.
Es ist auch möglich, eine Klasse zur Initialisierung zu zwingen (falls sie noch nicht initialisiert wurde), indem Sie verwenden Class.forName(fqn, true, classLoader)
oder die Kurzform Class.forName(fqn)
Wann findet die statische Klasseninitialisierung statt?
Siehe oben.
Wann werden statische Felder initialisiert?
Als Teil der statischen Klasseninitialisierung; siehe oben.
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?
Ja. (Modulo, dass nichts wirklich augenblicklich ist.)
Was ist, wenn ich eine statische Methode aufrufe? Führt es auch alle statischen Blöcke aus? Vor der Methode?
Ja und ja.
Beachten Sie, dass es möglich ist, Code zu erstellen, in dem Sie die beobachten können standardmäßig initialisiert Wert eines statischen Feldes.
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 im Java 9 JLS korrigiert: siehe Quelle.
Statische Felder werden während des initialisiert Initialisierung “Phase” des Klassenladens (Laden, Verknüpfen und Initialisieren), 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:
public class Test {
static String sayHello() {
return a;
}
static String b = sayHello(); // a static method is called to assign value to b.
// but its a has not been initialized yet.
static String a = "hello";
static String c = sayHello(); // assignes "hello" to variable c
public static void main(String[] arg) throws Throwable {
System.out.println(Test.b); // prints null
System.out.println(Test.sayHello()); // prints "hello"
}
}
Das Test.b wird gedruckt null
denn wenn die sayHello
Im statischen Bereich wurde die statische Variable aufgerufen a
wurde nicht initialisiert.
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 Bug nennen.
Ähnlich für statische Initialisierungsblöcke: stackoverflow.com/questions/2007666/…
– Ciro Santilli OurBigBook.com
23. März 2015 um 9:04 Uhr