java多态性后期绑定规则

时间:2015-03-02 11:59:15

标签: java polymorphism subclass superclass

我正在尝试做一些多态性练习,我无法弄清楚这种多态性是如何工作的。我没有找到关于这种运动的任何深层信息。我希望你们能给我一些解释。

练习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 个答案:

答案 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