2016-04-26 8 views
2

Unter Berücksichtigung der folgenden:Überschrieben Methodenaufruf in Mutter Methode

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()); 
    } 
} 

Ausgang:

parent: true 
child: true 

Es ist ziemlich offensichtlich, wenn isMeh() innerhalb Child-Klasse aufgerufen wird, wird die überschriebene Methode aufruft.

Wenn die überschriebene Methode innerhalb einer Methode des übergeordneten Elements aufgerufen wird, wird die Methode des untergeordneten Objekts dennoch aufgerufen.

Ich sehe, dass wir ein Kind-Objekt erstellen und ParentMethod ist nur vererbt, also wenn wir IsMeh() aufrufen ruft es die verfügbare (überschriebene).

Was wäre der Grund für diese Implementierung in Java?

+2

Warum nicht? Wenn Sie etwas als Kind aufrufen, wird die überschriebene Methode aufgerufen. Wenn Sie jedoch sagen, Parent p = new Parent(); p.isMeh(); es wird nur falsch zurückgegeben. –

+0

Die einfache Sache zu verstehen ist, Methoden werden auf Objekt und Variablen auf Referenz aufgerufen, so, wenn ich Eltern p = new parent() tun, wird die übergeordnete Methode aufgerufen. –

Antwort

1

Jede Klasse in einer Vererbungshierarchie von Parent, sei es ein Child, eine Parent oder etwas Grandchild aus ihnen abzuleiten, hat genau eine Implementierung des Verfahrens isMeh genannt. Wenn ChildisMeh von Parent mit einer eigenen Implementierung überschreibt, ersetzt es die Implementierung; soweit es die Child betrifft, gilt die Implementierung in der Parent nicht mehr *.

Wenn Sie Child instanziiert und rufen seine parentMethod, wobei das Verfahren den Zugriff auf nur eine Methode hat isMeh - das heißt, die Umsetzung durch die Child zur Verfügung gestellt. Deshalb erhalten Sie das Verhalten, das Sie beschreiben.

Dieses Verhalten ermöglicht sehr schöne Muster: Sie können beispielsweise eine "teilweise Implementierung" einer Methode im übergeordneten Element schreiben, indem Sie auf die Plug-in-Funktionalität in der untergeordneten Klasse zurückgreifen. Diese Technik ist bekannt als Template Method Design Pattern.

* obwohl Child behält die Fähigkeit Parent ‚s isMeh ausdrücklich zu nennen.