Статическая циклическая зависимость в 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
Ответы
Ответ 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;
следовательно, ответ.