Java-当涉及继承,多态性,重载和重写时,将调用哪个函数?

时间:2019-03-18 17:37:09

标签: java inheritance polymorphism override 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 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.show(D obj),该继承自A类。

我遇到其他两个问题。好吧,我知道这是有道理的,因为从技术上讲b和c都是A类型的对象,但是为什么它与“ B and B”一起使用“ B and A”?

2 个答案:

答案 0 :(得分:3)

a的声明类型为A

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

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

此方法在B中被覆盖,a的具体类型为B,因此将打印“ B and A”。

方法B.show(B)不会覆盖方法A.show(A),因为它的类型与参数不同。

答案 1 :(得分:1)

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

现在,当执行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)。