2016-04-26 3 views
2

Учитывая следующее:Переопределенный вызов метода в родительском методе

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() вызывается в классе ребенка, он вызывает метод замещения.

Но когда метод overriden вызывается внутри метода объекта parent, он по-прежнему вызывает метод дочернего объекта.

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

В чем причина этой реализации в java?

+2

Почему бы и нет? Когда вы вызываете что-то в качестве Ребенка, вызывается переопределенный метод. Однако, если вы говорите, что родительский p = новый Parent(); p.isMeh(); он просто вернет false. –

+0

Простая вещь для понимания - это методы, вызываемые объектом и переменными на ссылке, поэтому всякий раз, когда я делаю родительский p = new parent(), вызывается родительский метод. –

ответ

1

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

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

Это поведение допускает очень приятные шаблоны: например, вы можете написать «частичную реализацию» метода в родительском объекте, полагаясь на функциональность «plug-in» в дочернем классе, предоставляемом через переопределения. Этот метод известен как Template Method Design Pattern.

* хотя Child сохраняет способность вызывать Parent «s isMeh явно.

Смежные вопросы