#java #static
Почему это компилируется??? class A { static { i = 8; } static int i = 6; } А вот это - нет. class A { static { i = 8; System.out.println(i); } static int i = 6; }
Ответы
Ответ 1
Пожалуй, переведу эту статью с англоязычного 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.
Комментариев нет:
Отправить комментарий