如何在java中的继承中解析对方法的调用?

时间:2016-08-23 11:40:09

标签: java inheritance polymorphism

为什么在这种情况下会选择doAction(A a)

您能否根据参数类型向一些文章提供有关方法选择的建议?

class A { } 
class B extends A { } 
class D {
    void start(A a){ 
        doAction(a); 
    }
    void doAction(A a) { 
        System.out.println("A action"); 
    } 
    void doAction(B b) { 
        System.out.println("B action"); 
    } 
} 
public class Test { 
    public static void main(String[] args) { 
        new D().start(new B()); 
    } 
}

1 个答案:

答案 0 :(得分:4)

  

为什么在这种情况下会选择行动(A)?

因为这是唯一适用的方法。根据编译时类型的参数,在编译时执行重载分辨率。

doAction(B)方法不适用,因为没有从A(您的参数类型)到B(参数类型)的隐式转换。您可以将值转换为B,如下所示:

doAction((B) a);

此时这两种方法都适用,但重载决策会选择doAction(B b)作为特定而不是doAction(A a)。当然,如果您将不是的引用传递给B的实例,它也会失败。

您应该阅读JLS 15.12.2以了解重载解析的详细信息。