Die allgemeine Reihenfolge der Initialisierungsoperationen lautet (nach dem Laden der Klasse und vor der ersten Verwendung):
- Statische (Klassen-) Codeblöcke in der Reihenfolge, in der sie im Code erscheinen.
- Objektcode-Blöcke in der Reihenfolge, in der sie im Code angezeigt werden (Initialisierungsblöcke und Zuweisungen).
- Konstruktoren
Sicherlich bezeichne ich Konstruktoren und Funktionskörper oben nicht als Codeblock .
Ich weiß nicht wie über final staticFelder. Es sieht so aus, als ob sie den Regeln der staticFelder folgen und vor der Deklaration nicht referenziert werden können, obwohl zuvor kommentiert wurde, dass sie beim Kompilierungsschritt initialisiert wurden. Wenn auf sie verwiesen wird, bevor ein Kompilierungsfehler auftritt:
Example.java:8: illegal forward reference
System.err.println("1st static block j=" + j);
Möglicherweise können final staticFelder initialisiert und in die Klassendatei kompiliert werden, dies ist jedoch keine allgemeine Regel und kann vor der Deklaration immer noch nicht referenziert werden.
Beispielcode zur Überprüfung der Initialisierungsreihenfolge:
class Example {
final static int j = 5;
{
System.err.println("1st initializer j=" + j);
}
static {
System.err.println("1st static block j=" + j);
}
static {
System.err.println("2nd static block j=" + j);
}
final static java.math.BigInteger i = new java.math.BigInteger("1") {
{
System.err.println("final static anonymous class initializer");
}
};
Example() {
System.err.println("Constructor");
}
static {
System.err.println("3nd static block j=" + j);
}
{
System.err.println("2nd initializer");
}
public static void main(String[] args) {
System.err.println("The main beginning.");
Example ex = new Example();
System.err.println("The main end.");
}
}
Das obige Code-Snipset wird gedruckt:
1st static block j=5
2nd static block j=5
final static anonymous class initializer
3nd static block j=5
The main beginning.
1st initializer j=5
2nd initializer
Constructor
The main end.