对于以下代码:
class A {
public void ex(Object o) {
System.out.println("A");
}
}
class B extends A {
public void ex(B o) {
System.out.println("B");
}
}
class C extends B {
public void ex(A o) {
System.out.println("C");
}
}
public class Main {
public static void main(String argv[]) {
C xx;
xx = new C();
xx.ex(xx); // This prints B
}
}
为什么调用 ex 方法“ B”的结果?引用类型和类类型均为C,执行的方法仍然是超类中的方法。
答案 0 :(得分:2)
由于创建了C实例的类链,因此将提供所有3种方法:
所有这些都可以用于您的xx.ex(xx)
调用。此时,根据Java规范,将调用最具体的方法。
如果可以使用多个成员方法并且适用于 方法调用,有必要选择一种方法来提供 运行时方法分派的描述符。 Java编程 语言使用选择最具体方法的规则。
由于您没有ex(C)
方法,因此与您的调用最匹配的方法是B.ex(B)
,因为B是A的子类,而A是Object的子类。