Подтвердить что ты не робот

Статическая циклическая зависимость в Java

для следующего кода:

class A
{
    public static int X;
    static { X = B.Y + 1;}
}
public class B
{
    public static int Y = A.X + 1;
    static {}
    public static void main(String[] args) {
        System.out.println("X = "+A.X+", Y = "+B.Y);
    }
}

вывод:  X = 1, Y = 2

Почему? и как???

-Ivar

P.S: фрагмент кода, взятый из JavaCamp.org

4b9b3361

Ответ 1

Вот что происходит в хронологическом порядке:

  • Класс B содержит основной метод, поэтому он загружается загрузчиком классов.

  • Инициализация B ссылок A, поэтому загружается класс A.

  • A имеет статическую переменную X, инициализированную до B.Y + 1.

    Инициализация B.Y еще не выполнена, поэтому B.Y оценивается как 0, и поэтому 1 присваивается A.X

  • Теперь A завершил загрузку, и может произойти инициализация B.Y.

    Значение A.X + 1 (1 + 1) присваивается B.Y.

  • Значения A.X и B.Y печатаются как 1 и 2 соответственно.

Дальнейшее чтение:

Спецификация языка Java, §12.4.1 При возникновении инициализации

Ответ 2

Это только мое предположение:

  • Загружается класс B, поскольку он содержит main, который вы запросили для выполнения.
  • Погрузчик класса обнаруживает, что B требует A для работы (он использует A путем доступа к его статическому полю)
  • Загружается класс B.
  • Класс A требует класса B, который уже загружен, но еще не инициализирован
  • A небрежно загружает B.Y (по умолчанию по умолчанию инициализируется 0), так как класс выглядит как загруженный (недостаток языкового дизайна?)
  • A.X = 0 + 1
  • A теперь загружается, загрузчик классов может продолжить загрузку и инициализировать B
  • B.Y = 1 + 1.

Ответ 3

B становится публичным, начинает загружать себя.

Sees A.X = B.Y +1 ==, который начинается с нуля (значение объекта int по умолчанию), следовательно, 1;

инициализирует B = 1 + 1 = 2;

следовательно, ответ.