Im folgenden Java-Code wird die Insect-Klasse von der Beetle-Klasse geerbt.Java - Was ist die Reihenfolge der Initialisierung in diesem Code?
class Insect {
private int i = 9;
protected int j;
Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1
= printInit("static Insect.x1 initialized");
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2
= printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
}
}
Der Ausgang ist irgendwie kompliziert.
statischen Insect.x1 initialisiert
statischen Beetle.x2
initialisiertBeetle Konstruktor
i = 9, j = 0
Beetle.k
initialisiertk = 47 j = 39
Wie lautet die Reihenfolge der Initialisierung in diesem speziellen Beispiel?
Warum wird x2 sofort nach x1 initialisiert? Und warum ist die erste Zeile der Hauptmethode (System.out.println("Beetle constructor");
), nach x1 und x2 Initialisierung ausgeführt. So verwirrend.
Ich weiß, dass der abgeleitete Klassenkonstruktor den Basisklassenkonstruktor automatisch aufruft (es sei denn, es hat Parameter und Sie würden das Schlüsselwort super verwenden). Ich weiß, dass Variablen vor dem Konstruktor initialisiert werden und dass statische Variablen vor anderen Variablen initialisiert werden.
Ich könnte also sagen, als allgemeine Regel, dass: 1. Statische Elemente in der Basisklasse zuerst initialisiert werden, 2. Statische Mitglieder in der abgeleiteten Klasse als nächstes, 3. Basisklasse nicht statisch initialisiert Elemente (Primitive und Referenzen) werden initialisiert. 4. Basisklassenkonstruktor wird aufgerufen. 5. Nicht statische Member der abgeleiteten Klasse werden initialisiert. 6. Schließlich habe ich alles, was ich brauche, um das Objekt zu erstellen, also wird der abgeleitete Klassenkonstruktor aufgerufen. Bin ich richtig? –
@HelloLili in diesem einfachen Fall ja, aber ich wäre vorsichtig mit der Verwendung als allgemeine Regel. Java arbeitet nach einer Reihe von Regeln, die in der Java-Sprachspezifikation definiert sind. Ich denke, Sie sollten besser lernen, wie bestimmte Aktionen ausgelöst werden. Anstelle von "statischen Mitgliedern zuerst" erinnere dich daran, dass "das Laden einer Klasse die Initialisierung der statischen Mitglieder auslöst" und so weiter. –