Java中的运行时多态性可访问已被再次覆盖的覆盖方法

时间:2019-03-02 10:47:53

标签: java run-time-polymorphism

由于动态方法分派,在使用超类引用创建对象并通过此对象调用已在子类中重写的方法时,将调用子类中被重写的方法,而不是超类中的原始方法。如果重写的方法又在另一个子类中被重写,将会是什么情况?

例如,假设A是父类,B扩展了A,C扩展了B。假设在A中编写了一个方法void m1(),然后在B中对其进行了覆盖,然后在C中对其进行了覆盖。我们创建一个对象,如下所示-

  A obj = new B();
  obj.m1();

将调用哪个方法? B中的一个或C中的一个?

1 个答案:

答案 0 :(得分:0)

您总是可以自己尝试,但是答案非常简单:将调用 B的方法。

class A {
    public static void main(String a[]) {
        A obj = new B();
        obj.m();
    }
    void m() {
        System.out.println("It's A");
    }
}
class B extends A {
    @Override
    void m() {
        System.out.println("It's B");
    }
}
class C extends B {
    @Override
    void m() {
        System.out.println("It's C");
    }
}

执行该程序将打印It's B。请注意,main的位置无关紧要。

经过一番思考,应该清楚地知道» C的方法将被调用«不能成为答案;如果是,添加另一个class C2 extends B覆盖方法void m()后将调用哪个方法?

通常,如果您有obj.m(arguments),并且想找出执行哪个m,请执行以下步骤:

  1. 确定obj的运行时类型(在本例中为B)。
  2. 在相应的类中查找方法m(type of arguments)
  3. 如果没有这种方法,请转到超类并重复2。