Правила позднего связывания полиморфизма Java

Я пытаюсь выполнить некоторые упражнения по полиморфизму и не могу понять, как работает этот тип полиморфизма. Я не нашел никакой глубокой информации об этом виде упражнений. Я надеюсь, что вы, ребята, могли бы дать мне некоторое объяснение.

упражнение 1:

class Top {
    public void m( Middle p ) System.out.print("A ");
}

class Middle extends Top {
    public void m( Object p ) System.out.print("M ");
    public void m( Middle p ) System.out.print("L ");
}

class Bottom extends Middle {
    public void m( Object p ) System.out.print("V ");
    public void m( Middle p ) System.out.print("X ");
}

class Test {
    public static void run() {
        Top tm = new Middle();
        Middle mb = new Bottom();

        tm.m (mb);            -> L
        tm.m(new Bottom());   -> L   why?
        mb.m(mb);             -> X
        mb.m(tm);             -> V   why?
        mb.m(new Middle());   -> X
        new Bottom().m(tm);   -> V
    }
}

упражнение 2:

class Top {
    public void gg( Top o ) System.out.print("A ");
    public void gg( Middle m ) System.out.print("B ");
}

class Middle extends Top {
    public void gg( Top o ) System.out.print("L ");
    public void gg( Bottom b ) System.out.print("M ");
}

class Bottom extends Middle {
    public void gg( Top o ) System.out.print("X ");
    public void gg( Middle m) System.out.print("Z ");
}

class Test {
    public static void run() {
        Top oo = new Top();
        Top ff = new Middle();
        Bottom uu = new Bottom();

        oo.gg(ff);      -> A
        oo.gg(uu);      -> A   why?
        ff.gg(ff);      -> L
        ff.gg(uu);      -> B   why?
        uu.gg(ff);      -> X
        uu.gg(uu);      -> X   why?
    }
}

Заранее спасибо!

поздравил

1 ответ

Во всех этих случаях методы, которые можно рассмотреть, зависят от типа переменной во время компиляции, но фактически вызываемый метод зависит от типа объекта во время выполнения. Таким образом, для

Top ff = new Middle();

методы Middle это те, которые будут вызываться, но они могут быть унаследованы от Top, и мы можем вызывать только те методы, которые доступны в Top во время компиляции, потому что ff объявлен как Top,

Чтобы определить, какой из перегруженных методов вызывается, мы смотрим на тип параметра и выбираем наиболее конкретный метод. Так что, если мы должны выбирать между:

public void m( Object p ) System.out.print("M ");
public void m( Middle p ) System.out.print("L ");

и мы проходим Bottom, тогда будет выбран второй метод. Вы можете думать о Bottom как быть ближе к Middle чем Object в иерархии классов:

Bottom -> Middle -> Top -> Object

Наконец, некоторые из ваших ответов просто неверны (упражнение 2) - я предлагаю вам попробовать запустить код, который может потребовать небольшой настройки, чтобы он действительно компилировался.

oo.gg(uu); // -> A why?  -- actually produces B
uu.gg(uu); // -> X why?  -- actually produces M
Другие вопросы по тегам