Правила позднего связывания полиморфизма 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