如何完成类型分辨率?

时间:2013-03-19 14:38:46

标签: java types casting polymorphism substitution

我是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); //?
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

第四个例子相同。

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