Java Полиморфизм - перегрузка метода двух иерархий классов - PullRequest
1 голос
/ 29 февраля 2020

Я получил короткий вопрос о полиморфизме в java: вот две иерархии классов, и упражнение состоит в том, чтобы сказать, что код будет распечатывать.

class All { /* ... */ }
class Most extends All { /* ... */ }
class Special extends Most { /* ... */ }

class Top {
    public void m( All p ) { System.out.print("A "); }
}
class Middle extends Top {
    public void m( All p ) { System.out.print("M "); }
    public void m( Special p ) { System.out.print("L "); }
}
class Bottom extends Middle {
    public void m( Most p ) { System.out.print("V "); }
    public void m( Special p ) { System.out.print("X "); }
}

class Test {

    public static void main(String[] args) {
        All all = new All();
        Most most = new Most();
        Special special = new Special();

        Top x = new Middle();
        Top y = new Bottom();
        Middle z = new Bottom();

        x.m( most );
        x.m( special );

        y.m( all );
        y.m( special );

        z.m( all );
        z.m( most );
    }
}

Я вставил код в файл Eclipse. java, и он распечатал 6x M, поэтому M для каждого метода. Может ли кто-нибудь помочь мне понять?

Очевидно, объявленный тип аргумента вызывающей ссылки и аргумент имеют значение и ничего больше (согласно сценарию), но в этом случае, почему x.m(special) не распечатывает "L", так как Special - это тип аргумента метода?

PS: Мой самый первый вопрос по stackoverflow, очень надеюсь, что кто-нибудь может помочь мне понять:)

1 Ответ

2 голосов
/ 29 февраля 2020

Прежде всего, если вы изменили подпись, вы также можете изменить название метода. это сделает вещи намного яснее.

x и y, объявленный классом Top, у них есть только один метод, вызываемый компилятором: m (All). Его реализация, которую они вызывают (метод overiden), происходит из Middle, поэтому они печатают M.

Middle z имеет 2 метода для вызова компилятора, m (All) и m (Special). Компилятор подключает вызов m (All), потому что это все, что он может сделать с аргументом Most. Поскольку Bottom наследует без переопределения m (All), он также выдает M.

...