Я попытался понять поведение порядка инициализации, когда статические поля инициализируются ссылкой на один и тот же объект окружающего класса.
public class Test {
static final Test t=new Test();
static int a=5;
Test(){
System.out.println("a="+a);
}
public static void main(String[] args) {
new Test();
}
}
Вывод приведенного выше фрагмента кода:
a=0
a=5
Если я изменю переменную a
на что-нибудь другое, кроме простого static
:
static final a=5;
a=5;
final a=5;
Результат:
a=5
a=5
Почему такое поведение?
Обратите внимание, что вывод равен a=5 & a=5
, даже если оба t & a
объявлены как static final
, и в этом случае t
предшествует объявлению a
.
t
также должен быть инициализирован перед выполнением конструктора? Разве это не похоже на циклическую зависимость? Есть ли определенное поведение, когда Java сталкивается с циклическими зависимостями...? 09.01.2015t
приводит к созданию нового экземпляра. Когда создается новый экземпляр, выполняется конструктор. Операторы инициализации переменных экземпляра выполняются до выполнения конструктора. Поэтому, когдаa
не является статическим, он инициализируется значением 5 перед оператором println. 09.01.2015a=5 & a-5
, даже еслиt
объявлен какstatic final
, что предшествует объявлениюa
11.01.2015