Дан код
public class Solution {
private String name;
Solution(String name) {
this.name = name;
}
private String getName() {
return name;
}
private void sout() {
new Solution("sout") {
void printName() {
System.out.println(getName());
}
}.printName();
}
public static void main(String[] args) {
new Solution("main").sout();
}
}
Который работает вполне логично и выводит "main", но если изменить метод printName() в анонимном классе, добавив ключевое слово super перед вызовом метода getName(), то результат вывода будет "sout".
void printName() {
System.out.println(super.getName());
}
Почему так происходит? Ведь private методы как и поля класса не виртуальные, почему в методе суперкласса используется переменная подкласса?
У вас нету переменных в подклассе. Вы пользуетесь переменной суперкласса. Когда вы вызываете метод sout(), то зоздается новый экземпляр, который возвращает значение из метода суперкласса getName().
То есть вы расширяете класс Solution анонимным классом, а в нем нет метода getName() поэтому его вывызов происходит в контексте main и печатается соответствующее значение экземпляра класса.
С другой стороны super.getName() говорит о том, что вызов метода происходит в контексте sout и печатается соответствующее значение второго экземпляра класса.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости