Java—当继承、多态、重载和重写都涉及时,调用哪个函数?

Java—当继承、多态、重载和重写都涉及时,调用哪个函数?,java,inheritance,polymorphism,overriding,overloading,Java,Inheritance,Polymorphism,Overriding,Overloading,我有一个涉及继承、多态、重载和重写的问题。我理解所有这些术语,但不确定它们在这里是如何工作的。代码如下: class A { public String show(D obj) {return "A and D";} public String show(A obj) {return "A and A";} } class B extends A { public String show(B obj) {return "B and B";} public Stri

我有一个涉及继承、多态、重载和重写的问题。我理解所有这些术语,但不确定它们在这里是如何工作的。代码如下:

class A {
    public String show(D obj) {return "A and D";}
    public String show(A obj) {return "A and A";}
}
class B extends A {
    public String show(B obj) {return "B and B";}
    public String show(A obj) {return "B and A";}
}
class C extends B{}
class D extends B{}
public class whatever {
    public static void main(String[] args) {
        A a = new B(); // note the B here
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println(a.show(a)); // B and A
        System.out.println(a.show(b)); // B and A
        System.out.println(a.show(c)); // B and A
        System.out.println(a.show(d)); // A and D
    }
}
所以这里的任务是找到输出。我已经有了答案,这些是我的评论

我理解第一个,因为Java自动执行动态绑定,所以a.show()从B类调用show(),a是a类型,所以调用B.show(a obj)

最后一个也是有意义的,show()方法是重载的,因为d是d类型,所以调用了从A类继承的A.show(d obj)


另外两个我有麻烦。我明白这是有道理的,因为从技术上讲,b和c都是A类型的对象,但为什么它与“b和A”一起出现在“b和b”之上呢?

声明的
A
类型是
A

A只有两个方法:一个采用A(b和c都是A的实例),另一个采用D(b和c都不是D的实例)

所以第一个方法匹配,第二个不匹配。因此,编译器选择了第一种方法

此方法在B中被重写,并且
a
的具体类型为B,因此打印“B和a”


方法
B.show(B)
不会重写方法
A.show(A)
,因为它不采用与参数相同的类型。

声明的
A
类型是
A

A只有两个方法:一个采用A(b和c都是A的实例),另一个采用D(b和c都不是D的实例)

所以第一个方法匹配,第二个不匹配。因此,编译器选择了第一种方法

此方法在B中被重写,并且
a
的具体类型为B,因此打印“B和a”


方法
B.show(B)
不会重写方法
A.show(A)
,因为它不采用与参数相同的类型。

这里有两个概念,一个是重载,另一个是重写。当您创建一个A=新B()时;意思是a是B的对象,有a的类型。因此,当执行a.show(a)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后将参数与类型匹配,但“a”是B的实例,因此执行类B的方法show(a obj)

现在,当执行a.show(c)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后在类a内找不到与c类型参数匹配的任何方法,但仍然执行它,因为类c扩展了B,而B扩展了a

简而言之,我们可以这样说
a、 show(a)相当于a.show(b)和a.show(c)。

这里有两个概念,一个是重载,另一个是重写。当您创建一个A=新B()时;意思是a是B的对象,有a的类型。因此,当执行a.show(a)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后将参数与类型匹配,但“a”是B的实例,因此执行类B的方法show(a obj)

现在,当执行a.show(c)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后在类a内找不到与c类型参数匹配的任何方法,但仍然执行它,因为类c扩展了B,而B扩展了a

简而言之,我们可以这样说
a、 show(a)相当于a.show(b)和a.show(c)。

Oh,因此它首先查看声明的类型,然后选择重写的方法。我倒过来想,我想它只是马上看具体的类型。谢谢你的帮助!哦,它首先查看声明的类型,然后选择重写的方法。我倒过来想,我想它只是马上看具体的类型。谢谢你的帮助!