java - Java多态是如何做到的

标签 java polymorphism

编辑:应该是 a2 = new B() 我不明白为什么下面的练习题中 a2.foo(b) 的结果是 3。

我认为通过多态性,动态类型方法将使用采用与静态类型对应的参数的方法签名来运行。

public class A {
    public int foo(Object o) {
        System.out.println(1);
        return 1;
    }

    public int foo(A a) {
        System.out.println(2);
        return 2;
    }
}

public class B extends A {
    public int foo(A a) {
        System.out.println(3);
        return 3;
    }

    public int foo(B b) {
        System.out.println(4);
        return 4;
    }

public static void main(String[] args) {
        A a2 = new B();
        B b = new B();
        a2.foo(b);
    }
}


我的学校给出的答案是a2.foo(b)返回3,但我认为它会返回4。

提前致谢!

最佳答案

这里发生了两件事:

  1. 重载
  2. 覆盖

重载是指在同一个类中具有相同名称但不同参数类型(因此它们不同)的两个不同方法。 重写和多态性是指在两个不同的类中拥有相同的单一方法。

AB重载foo方法:它们有两个同名的方法。在 A 中,一种方法将 Object 作为参数,另一种方法将 A 作为参数。在 B 中,一个将 A 作为参数,另一个将 B 作为参数。这四个方法中,有两个是相同的 (foo(A))。

B 中的 foo(A) 方法会覆盖 A 中的 foo(A) 方法。然而,foo(B) 方法是一种不同的方法。

因此,当您调用 a2.foo(b) 时,您正在调用 foo(A) 方法。一定是这样,因为 a2 被声明为 A 并且 A 没有 A.foo(B)。由于 a2 实际上是 B 类型的对象,因此您正在调用 B.foo(A),因为它会覆盖 A.foo (A).

关于java - Java多态是如何做到的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56576125/

相关文章:

java - 检查 int 数组中是否有 int

java - 自动售货机方案

c# - 从基类调用时,GetType() 会返回派生程度最高的类型吗?

go - Golang的组合继承如何将Commands调度到合适的CommandHandler?

c++ - 从模板参数继承并在 C++ 中向上转换

C#泛型继承

java - Java 时间计算 2 个日期之间的月份的错误

java - 找出哪个端点发送了 REST 调用

java - 如果之前进行过搜索,则带有缓存的搜索建议 (Java)

c++ - 当我将 C++ 中派生类的指针分配给指针时,地址会发生变化