Переопределенный вызов метода в Родительском методе


Учитывая следующее:

public class Child extends Parent{
  public boolean isMeh(){
    return true;
  }

  public void childMethod() {
    System.out.println("child: "+isMeh());
  }

  public static void main(String... args){
    Child child = new Child();
    child.parentMethod();
    child.childMethod();

  }

}

class Parent{
  public boolean isMeh(){
    return false;
  }

  public void parentMethod() {
    System.out.println("parent: "+isMeh());
  }
}

Вывод:

parent: true
child: true

Это довольно очевидно, когда isMeh () вызывается в дочернем классе, он вызывает переопределенный метод.

Но когда переопределенный метод вызывается в методе родительского объекта , он все равно вызывает метод дочернего объекта.

Я вижу, что мы создаем один дочерний объект, и parentMethod просто наследуется, поэтому, когда мы вызываем ISME (), он вызывает доступный (переопределенный).

Что бы это значило? причина такой реализации в java?

1 2

1 ответ:

Любой класс в иерархии наследования Parent, будь то Child, Parent или некоторый Grandchild, производный от них, имеет ровно одну реализацию метода, называемого isMeh. Когда Child переопределяет isMeh из Parent своей собственной реализацией, он заменяет реализацию; Что касается Child, реализация в Parent больше не применяется*.

Когда вы создаете экземпляр Child и вызываете его parentMethod, метод имеет доступ только к одному методу isMeh - т. е. реализация, предусмотренная Child. Вот почему вы получаете поведение, которое описываете.

Это поведение позволяет создавать очень хорошие шаблоны: например, вы можете написать "частичную реализацию" метода в родительском классе, полагаясь на функциональность "плагина" в дочернем классе, предоставляемую через переопределения. Эта техника известна как шаблон метода проектирования шаблона.

* хотя Child сохраняет возможность вызывать Parent's isMeh явно.