使用继承时的Java动态绑定

时间:2020-02-02 21:33:33

标签: java inheritance binding polymorphism

对于以下代码:

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,执行的方法仍然是超类中的方法。

1 个答案:

答案 0 :(得分:2)

由于创建了C实例的类链,因此将提供所有3种方法:

  • A.ex(Object)
  • B.ex(B)
  • C.ex(A)

所有这些都可以用于您的xx.ex(xx)调用。此时,根据Java规范,将调用最具体的方法。

如果可以使用多个成员方法并且适用于 方法调用,有必要选择一种方法来提供 运行时方法分派的描述符。 Java编程 语言使用选择最具体方法的规则。

由于您没有ex(C)方法,因此与您的调用最匹配的方法是B.ex(B),因为B是A的子类,而A是Object的子类。

相关问题