Не могу понять как вызываются методы суперкласса в анонимном подклассе

237
02 сентября 2018, 15:00

Дан код

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 методы как и поля класса не виртуальные, почему в методе суперкласса используется переменная подкласса?

Answer 1

У вас нету переменных в подклассе. Вы пользуетесь переменной суперкласса. Когда вы вызываете метод sout(), то зоздается новый экземпляр, который возвращает значение из метода суперкласса getName().

То есть вы расширяете класс Solution анонимным классом, а в нем нет метода getName() поэтому его вывызов происходит в контексте main и печатается соответствующее значение экземпляра класса.

С другой стороны super.getName() говорит о том, что вызов метода происходит в контексте sout и печатается соответствующее значение второго экземпляра класса.

READ ALSO
Выравнивание сетки товаров woocommerce

Выравнивание сетки товаров woocommerce

помогите пожалуйста выровнить сетку товаров в woocommerceВот здесь видно что не ровно отображаются товары из-за длинного названия

496
Сторонние шрифты в css

Сторонние шрифты в css

Ремарка - новичокВопрос странный и возможно глупый но я реально не могу понять

241
Получить данные из js. Python

Получить данные из js. Python

и тд подскажите, пожалуйста как получить данные из этих переменных (словари)?

250
Селектор #/id в jquery

Селектор #/id в jquery

Имеется на странице блок с id "/text/text" Необходимо с помощью jquery обратиться к немуПробую так - $("#/text/text"), но получаю ошибку связанную с неправильным...

256