Aus meinem Wissen, wenn JVM Code für A's Clinit lädt und generiert, wird der Compiler zunächst einen Methodenaufruf an JVM Internal ausgibt, um B zu initialisieren B und dann die Methode -Aufruf/Feldnutzung von kompilieren B Normalerweise. Zur Laufzeit ist B so sichergestellt, dass B vor dem Feld oder der Methode initialisiert wird. < /p>
Bitte korrigieren Sie mich, wenn ich im obigen Fehler einen Fehler gemacht habe. < /p>
Dann verstehe ich nicht, wie JVM mit einer Situation wie unten umgeht. < /p>
Code: Select all
public class A {
public static A a = new A(B.b);
public A(B b) {
a = null;
}
public static void main(String[] args) {
System.out.println(a == null);
}
}
public class B {
public static B b = new B(A.a);
public B(A a) {}
}
Könnte jemand erklären, wie diese beiden Klassen initialisiert werden, da bei beiden zuerst der andere Teil initialisiert werden muss? Und warum gibt die Hauptmethode in A false zurück, da das statische Feld a im Konstruktor von A auf Null gesetzt werden sollte?