Переопределенный вызов метода в Родительском методе
Учитывая следующее:
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
явно.