Страницы

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

понедельник, 6 января 2020 г.

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

#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.

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

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