Полиморфизм времени выполнения в Java для доступа к переопределенному методу, который был снова переопределен - PullRequest
0 голосов
/ 02 марта 2019

Из-за динамической диспетчеризации методов при создании объекта с использованием ссылки на суперкласс и вызове метода через этот объект, который был переопределен в подклассе, переопределенный метод в подклассе будет вызываться вместо исходного метода в суперклассе.Что будет, если переопределенный метод был снова переопределен в следующем подклассе?

Например, допустим, A является родительским классом, B расширяет A, а C расширяет B. Скажем, метод void m1 ()был записан в A, а затем переопределен в B, а затем снова переопределен в C. Теперь, если мы создадим и объект следующим образом -

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

, какой метод будет вызван?Один в Б или тот в С?

1 Ответ

0 голосов
/ 02 марта 2019

Вы всегда можете попробовать сами, но ответ очень прост: будет вызван метод 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.
...