【问题标题】:How is type resolution done?类型解析是如何完成的?
【发布时间】:2013-03-19 14:38:45
【问题描述】:

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

【问题讨论】:

  • 你为什么不把你的问题缩小到对你没有意义的行为?就目前而言,这太像“来,为我做作业”。
  • 此外,您可能希望阅读FAQ。您应该始终在问题中包含what you've tried 以及您所做的任何研究。

标签: java types casting polymorphism substitution


【解决方案1】:

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

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

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

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

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

第四个例子也是如此。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多