Спецификация языка Java (JLS), в контексте компилятора, разрешающего выражение вызова метода , состояния
Если форма super . [TypeArguments] Identifier
, то класс
поиск является суперклассом класса, объявление которого содержит
вызов метода.
Класс , в объявлении которого содержится вызов метода , в данном случае является анонимным подклассом Solution
, а его суперкласс - Solution
. JLS в контексте определения того, какой экземпляр будет использоваться для вызова метода , затем говорит:
Если форма super . [TypeArguments] Identifier
, то цель
ссылка является значением this
.
this
, в данном случае, относится к экземпляру анонимного подкласса Solution
. Поле name
этого экземпляра было инициализировано значением "sout"
, поэтому getName()
возвращает.
В исходном образце
new Solution("sout") {
void printName() {
System.out.println(getName());
}
}.printName();
вызов метода getName()
является неквалифицированным, и поэтому применяется другое правило. Это
Если существует объявление типа, для которого этот метод является
член, пусть T
будет самым внутренним объявлением типа. Класс или
интерфейс для поиска T
.
T
здесь - это класс Solution
, поскольку он является самым внутренним типом включения анонимного подкласса Solution
, а getName()
является его членом.
Тогда JLS сообщает
В противном случае, пусть T
будет объявлением окружающего типа, для которого метод
является членом, и пусть n
будет целым числом таким, что T
является n-ным лексическим
вложение декларации типа класса, объявление которого немедленно
содержит вызов метода. Целевой ориентир - это n'th
Лексически заключенный экземпляр this
.
Опять же, T
- это Solution
, 1-й лексически включающий тип, поскольку класс, в объявлении которого непосредственно содержится вызов метода, является анонимным подклассом Solution
. this
- это анонимный экземпляр подкласса Solution
. Таким образом, целевой ссылкой является 1-й лексически заключенный экземпляр this
, т.е. экземпляр Solution
, поле которого name
было инициализировано значением "main"
. Вот почему оригинальный код печатает "main"
.