Java - 当涉及到继承、多态、重载和覆盖时调用哪个函数?

标签 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 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 自动执行动态绑定(bind),所以 a.show() 从 B 类调用 show() 并且 a 是 A 类型所以调用 B.show(A obj)。

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

另外两个我遇到了麻烦。嗯,我明白这是有道理的,因为 b 和 c 在技术上都是 A 类型对象,但为什么它与“B 和 A”一起使用而不是“B 和 B”?

最佳答案

a 的声明类型是A

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

所以第一个方法匹配,第二个不匹配。所以第一种方法是由编译器选择的。

在B中重写了该方法,a的具体类型为B,所以打印出“B and A”。

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

关于Java - 当涉及到继承、多态、重载和覆盖时调用哪个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55227081/

相关文章:

c++ - Arduino:在 Stream 对象上调用 serial.begin()

c++ - 为什么 static_cast 为同一对象提供不同的内存位置?

clojure - clojure 中比使用实例更惯用的模式?按类型分派(dispatch)

c++ - 为什么我们不能像在java中那样使用new ClassName(),而是使用new ClassName呢?

java - ESAPI.properties 中的最少必需属性

java - 如何拆分字符串或从字符串中获取正确的文本

java - 如何阻止我的日志文件相互添加?

c++ - C++:在子类中扩展静态STL容器/映射成员?

c++ - 从基类的特定派生类型调用特定函数

java - 在共享类中调用 View ID - android