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

1 回答 1

0

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

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

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

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

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

第四个例子也一样。

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

于 2013-03-19T15:03:08.910 回答