编辑:应该是 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。
提前致谢!
最佳答案
这里发生了两件事:
- 重载
- 覆盖
重载是指在同一个类中具有相同名称但不同参数类型(因此它们不同)的两个不同方法。 重写和多态性是指在两个不同的类中拥有相同的单一方法。
类A
和B
都重载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/