java中的继承是如何解决这个方法调用的?

java中的继承是如何解决这个方法调用的?,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,为什么在这种情况下会选择doAction(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) {

为什么在这种情况下会选择
doAction(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()); 
    } 
}
为什么在这种情况下会选择行动(A)

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

doAction(B)
方法不适用,因为没有从
A
(参数类型)到
B
(参数类型)的隐式转换。您可以像这样将值强制转换为
B

doAction((B) a);
在这一点上,这两种方法都是适用的,但是重载解析会选择
doAction(B)
doAction(A)
更具体。当然,如果传入的引用不是
B
的实例,它也会失败

您应该阅读以了解重载解析的确切细节

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

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

doAction(B)
方法不适用,因为没有从
A
(参数类型)到
B
(参数类型)的隐式转换。您可以像这样将值强制转换为
B

doAction((B) a);
在这一点上,这两种方法都是适用的,但是重载解析会选择
doAction(B)
doAction(A)
更具体。当然,如果传入的引用不是
B
的实例,它也会失败


您应该阅读有关重载解析的详细信息。

我不确定它是否真的与此重复,因为它没有询问如何根据执行时间类型进行选择。答案仍然是相关的…我不确定它是否真的是重复的,因为它没有询问如何根据执行时间类型进行选择。答案仍然是相关的,尽管。。。