Почему это компилируется???
class A {
static {
i = 8;
}
static int i = 6;
}
А вот это - нет.
class A {
static {
i = 8;
System.out.println(i);
}
static int i = 6;
}
Ответ
Пожалуй, переведу эту статью с англоязычного so
При компиляции вашего кода вылетает (наверняка) ошибка illegal forward reference. Дело в том, что при инициализации полей на их использование в данном случае накладываются некоторые ограничения.
Вы не можете использовать имя вашей переменной с правой стороны выражения, т.е. читать ее значение, однако вполне можете что-то в нее записывать.
Обойти это можно двумя способами:
Поместить объявление переменной до статического блока
class A {
static int i = 6;
static {
i = 8;
System.out.println(i);
}
}
Или использовать полное имя переменной
class A {
static {
i = 8;
System.out.println(A.i);
}
static int i = 6;
}
Ограничения связаны с тем, что блоки инициализации и инициализация переменных при объявлении производятся друг за другом, в том порядке, в котором они встречаются в коде. Но (если я не ошибаюсь) когда вы пытаетесь записать в переменную значение в блоке инициализации, который встречается до объявления самой переменной, то Java делает вид, что переменная уже объявлена, и после выполняет с переменной все необходимые действия. В этом можно убедиться, выполнив такой код:
public class A {
static {
i = 8;
System.out.println(A.i);
}
static int i = 6;
public static void main(String args[]) {}
}
На выходе вы увидите 8
Комментариев нет:
Отправить комментарий