2013-03-19 37 views
0

我是新来的Java世界,我有一些问题想出Java如何决定当有多态性时调用哪个方法。你能帮我弄清楚这个例子的工作原理吗? 我试了一下代码,看到了结果。我更感兴趣的是它为什么这样工作。如何完成类型解析?

class A { 
    void redef(A a) { System.out.println("[A]"); } 
} 

class B extends A { 
    //@Override 
    void redef(B b) { System.out.println("[B]"); } 
} 

class C extends B { 
} 

public class Surcharge { 
    static void surcharge(A a) { System.out.println("[A]"); } 
    static void surcharge(B b) { System.out.println("[B]"); } 

    public static void main(String[] argv) { 

     A a = new A() ; 
     B b = new B() ; 

     A ab = new B(); 
     C c = new C(); 

     ab.redef(c); //? 
     surcharge(a); //? 
     surcharge(b); //? 
     surcharge(c); //? 
     surcharge(ab); //? 
    } 
} 
+2

你为什么不把你的问题缩小到这里对你没有意义的行为?就目前而言,这太像“在这里,为我做我的作业”。 – 2013-03-19 14:59:05

+0

此外,您可能需要阅读[FAQ](http://stackoverflow.com/faq)。你应该总是包括[你尝试过](http://mattgemmell.com/2008/12/08/what-have-you-tried/)以及你在问题中所做的任何研究。 – 2013-03-19 15:05:20

回答

0

当一个方法被重载(就像这里所有的方法一样)时,Java使用最接近参数声明类型的方法。

在第一个例子中,对象(ab)被声明为A类型,因此编译器只知道方法redef(A a),因此它被选中。

请注意,方法redef(B)不会覆盖方法redef(A),因为它的签名不匹配。如果您取消注释@Override注释,则会出现编译错误。

在第二个示例中,只有sucharge(A a)与参数(A)的声明类型相匹配,因此选择此参数。

在第三个示例中,surcharge(B b)更接近地匹配参数(B)的声明类型,因此它被选中。

与第四个例子相同。

在最后一个例子中,只有surcharge(A a)适用于参数(A)的声明类型,因此它被选中。