Успешный доступ к конечному полю экземпляра включающего экземпляра из контекста stati c - PullRequest
2 голосов
/ 12 января 2020

Играя со специальным случаем внутренних классов, в которых вместо лексически заключенного экземпляра есть включающий блок (Java Спецификация языка §8.1.3 ), я написал следующий пример:

public class Test {
    private static final Object o = new Object() {
        @Override
        public String toString() {
            return "" + Test.this.i; // Test.this does not exist
        }
    };

    public static void main(final String[] args) {
        System.out.println(Test.o);
    }

    final int i = 1;
}

Этот код компилируется и запускается, производя следующий вывод:

1

Странно то, что метод toString() для o ссылается на включающий экземпляр Test, который не существовать. В этом примере не создано ни одного экземпляра Test .

Я полагаю, это потому, что поле i, являющееся окончательным и имеющее инициализатор, рассматривается как stati c. Компилятор знает это и, вероятно, значение поля является встроенным.

Но объяснение этого поведения должно быть в Java Спецификации языка . Я думаю, что прочитал это однажды, но я не мог найти это больше.

Может кто-нибудь сказать, где это объясняется в JLS? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...