Переопределенный вызов метода в Родительском методе
Учитывая следующее:
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 ответ:
Любой класс в иерархии наследования
Parent, будь тоChild,Parentили некоторыйGrandchild, производный от них, имеет ровно одну реализацию метода, называемогоisMeh. КогдаChildпереопределяетisMehизParentсвоей собственной реализацией, он заменяет реализацию; Что касаетсяChild, реализация вParentбольше не применяется*.Когда вы создаете экземпляр
Childи вызываете егоparentMethod, метод имеет доступ только к одному методуisMeh- т. е. реализация, предусмотреннаяChild. Вот почему вы получаете поведение, которое описываете.Это поведение позволяет создавать очень хорошие шаблоны: например, вы можете написать "частичную реализацию" метода в родительском классе, полагаясь на функциональность "плагина" в дочернем классе, предоставляемую через переопределения. Эта техника известна как шаблон метода проектирования шаблона.
* хотя
Childсохраняет возможность вызыватьParent'sisMehявно.