Страницы

Поиск по вопросам

пятница, 8 февраля 2019 г.

Почему это работает, а это - нет?

Почему это компилируется???
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

Комментариев нет:

Отправить комментарий