2016-08-23 66 views
1

为什么doAction(A a)会在这种情况下被选中?这是如何调用java中继承的方法解决的?

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

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()); 
    } 
} 
+0

我不确定它是否真的重复,因为它不会询问如何根据执行时类型进行选择。答案仍然相关,但... –

回答

4

为什么doAction(A)将在这种情况下可以选择?

因为这是唯一适用的方法。基于编译时间参数的类型,在编译时间执行过载分辨率。

doAction(B)方法是不适用的,因为有一个从A的隐式转换(你们的论据类型)B(参数的类型)。您可以在值转换为B这样的:

doAction((B) a); 

在这一点上两种方法将适用,但重载决议会选择doAction(B b)为更具体doAction(A a)。当然,如果您将不是的引用传递给B的实例,它也会失败。

您应该阅读JLS 15.12.2以了解重载分辨率的精确细节。