Полиморфизм времени выполнения в Java для доступа к переопределенному методу, который был снова переопределен

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

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

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

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

1 ответ

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