Статическая круговая зависимость в 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

PS: фрагмент кода взят с JavaCamp.org

3 ответа

Решение

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

  1. Учебный класс B содержит метод main, поэтому он загружается загрузчиком классов.

  2. Инициализация B Рекомендации Aтак класс A загружен.

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

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

  4. Сейчас A завершил загрузку и инициализацию B.Y может иметь место

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

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

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

Спецификация языка Java, §12.4.1, когда происходит инициализация

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

  1. Учебный класс B загружен, потому что он содержит main которую вы просили выполнить.
  2. Загрузчик классов обнаруживает, что B требует A работать (он использует A путем доступа к его статическому полю)
  3. Учебный класс B загружен.
  4. Учебный класс A требует класс B который уже загружен, но еще не инициализирован
  5. A небрежно грузит B.Y (к тому времени по умолчанию инициализируется 0), поскольку класс выглядит загруженным (недостаток языкового дизайна?)
  6. A.X = 0 + 1
  7. A теперь загружен, загрузчик классов может продолжать загружать и инициализировать B
  8. B.Y = 1 + 1,

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

Видит AX = BY +1 ==, который равен 0 для начала (значение объекта int по умолчанию), следовательно, 1;

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

отсюда и ответ.

Другие вопросы по тегам