2015-03-02 65 views
0

我想做一些多态性练习,我无法弄清楚这种多态性是如何工作的。我没有找到关于这种行使的深层信息。我希望你们能给我一些解释。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

参见https://stackoverflow.com/questions/1572322/overloaded-method-selection-based-on-the-parameters-real-type和https://stackoverflow.com/questions/14676395/ java-overloading-method-selection – DNA 2015-03-02 12:05:34

+0

练习2的一些答案是错误的,如果你实际运行代码,这可能解释了你的难度。请参阅下面的答案。 – DNA 2015-03-02 12:26:33

回答

2

在所有的这些情况下,可以考虑的方法取决于变量的编译时类型,但毕竟是实际调用该方法依赖于运行时类型的目的。因此,对于

Top ff = new Middle(); 

Middle的方法是将被称为的 - 但这些可以从顶部被继承,我们只能称之为是Top在编译时可用的方法,因为ff被声明为Top

要确定哪个重载方法被调用,我们查看参数类型,并选择最具体的方法。所以,如果我们要选择之间:

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

和我们传递一个Bottom,那么第二种方法将被选择。你可以认为Bottom为在类层次结构比Object接近Middle

Bottom -> Middle -> Top -> Object 

最后,一些你的答案是绝对错误的(练习2) - 我建议你尝试运行的代码,这可能需要一调整一点,所以它实际上编译。

oo.gg(uu); // -> A why? -- actually produces B 
uu.gg(uu); // -> X why? -- actually produces M