我正在尝试做一些多态性练习,我无法弄清楚这种多态性是如何工作的。我没有找到关于这种运动的任何深层信息。我希望你们能给我一些解释。
练习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?
}
}
提前谢谢!
迎接
答案 0 :(得分:2)
在所有这些情况下,可被视为的方法取决于变量的编译时类型,但实际上称为的方法取决于对象的运行时类型。
Top ff = new Middle();
Middle
的方法是将被调用的方法 - 但这些方法可以从Top继承,我们只能在编译时调用Top
中可用的方法,因为{{1声明为ff
。
要确定调用哪个重载方法,我们查看参数类型,并选择最具体的方法。所以,如果我们必须在:
之间做出选择Top
我们正在传递public void m( Object p ) System.out.print("M ");
public void m( Middle p ) System.out.print("L ");
,然后将选择第二种方法。您可以认为Bottom
在类层次结构中更接近Bottom
而不是Middle
:
Object
最后,你的一些答案是错的(练习2) - 我建议你尝试运行代码,这可能需要一些调整,以便实际编译。
Bottom -> Middle -> Top -> Object