Играя со специальным случаем внутренних классов, в которых вместо лексически заключенного экземпляра есть включающий блок (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? Спасибо.