Из -за того, что я знаю, когда JVM загружает и генерирует код для Clinit A, если он столкнется с неразрешенным классом B, компилятор сначала излучит метод вызов в JVM Internal для инициализации B, а затем компилируйте вызов метода/поле B обычно. Таким образом, во время выполнения B обеспечивается инициализировано до использования его поле или метода. < /p>
Пожалуйста, поправьте меня, если я совершил какую -либо ошибку в вышеизложенном. < /p>
Тогда я не понимаю, как JVM справляется с ситуацией, как ниже. < /p>
Код: Выделить всё
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) {}
}
Может ли кто-нибудь объяснить, как инициализируются эти два класса, поскольку им обоим сначала нужно инициализировать другую часть? И почему основной метод в A возвращает false, поскольку статическое поле a должно быть установлено в null в конструкторе A?
Подробнее здесь:
https://stackoverflow.com/questions/158 ... oke-clinit