Статические поля инициализируются на основе порядка , они появляются в коде.
Итак, когда вы присваиваете значение переменной i
, вы просто говорите компилятору: «ЭйПарень, когда вы добьетесь инициализации этой переменной, установите ее значение в ... ".Но вы не можете использовать до тех пор, пока он не будет инициализирован, потому что он просто еще не существует.
ОБНОВЛЕНИЕ:
Как говорится в книге "Спецификация языка Java "Джеймса Гослинга, Билла Джоя, Гая Стила и Гилада Брача:
Эти ограничения предназначены для перехвата во время компиляции циклических или иным образом искаженных инициализаций.
Учтите это:
static {
i = 2;
j = i + 5; //should it be 7 or 15?
}
static int i = 10;
static int j;
Должна ли переменная j
быть 7 или 15?Если это 7, то мы дважды инициализировали переменную i
, что невозможно, так как поле является статическим.Если это 15, то что означает i = 2;
?
Этот код неоднозначен, поэтому спецификация Java не позволяет этого делать.