2016-06-19 15 views
1

ich zur Zeit des Erlernen der Programmiersprache Java. In meinem Lektor Notizen fand ich den folgenden Codeausschnitt:Ausgabe von JAVA-Programm [Polymorphismus, Verfahren überwiegende]

class Base{ 
    void g(){ 
    System.out.print("g-Base "); 
    } 
    void f(){ 
    System.out.print("f-Base "); 
    g(); 
    } 
} 
class Derived extends Base{ 
    public static void main(String[] args) { 
     Base b = new Derived(); b.f(); 
    } 
    void g() { 
     System.out.print("g-Derived "); 
    } 
    void f() { 
     System.out.print("f-Derived "); super.f(); 
    } 
} 

Die Frage ist: Was ist die Ausgabe dieses Programms ist. Ich kompiliert und es lief und bekam: f-Derived f-Base-g-Derived verstehe ich die f-Derived und f-Basisteile, aber warum es nicht gedruckt „g-Derived“ im letzten Schritt, ich dachte, es haben sollte gewesen "g-Base".

+0

Genau wie '' 'Base b = new Abgeleitet(); b.g(); '' 'würde' '' g-Derived''' ausgeben. –

+0

Ja, aber wenn der Code zu super.f() springt und g() von dort aufruft, sollte es nicht weiter das g() von super aufrufen? – SalysBruoga

+0

Nein, es ist ein dynamischer Aufruf (geschieht zur Laufzeit) auf '' 'this''' '' '' this.g() '' '. '' 'this''' hat den dynamischen Typ' '' Derived''', also wird '' Derived :: g''' aufgerufen. –

Antwort

1

Compiler kennt die folgenden Regeln:

Wenn eine Methode ohne super Schlüsselwort rufen Sie die Derived Version genannt wird, aber wenn eine Methode mit super Stichwort rufen Sie die Base Version genannt wird.

Also, wenn super.f() genannt wird Base Version von f() genannt wird, aber wenn g() innerhalb der Base Version und da dieser Aufruf genannt wird, ist ohne super Schlüsselwort (mit implizitem this Stichwort wo this zu Derived Objekt bezieht) den Compiler glücklich ruft die Derived Version auf und wir erhalten die Ausgabe: g-Derived. Hoffe das hilft.

+0

Awesome Erklärung! Danke vielmals! – SalysBruoga

2

ist die Reihenfolge der Ausführung Lassen Sie verfolgen:

  1. Derived#f genannt wird und druckt ` "f-Derived".
  2. Derived#f ruft dann super.f(), die Base#f bedeutet.
  3. Base#f druckt "f-Base".
  4. Base#f ruft dann g(). Da g() in Derived überschrieben wird, wird Derived#g aufgerufen.
  5. Derived#g druckt "g-Derived".
+0

Aber wie weiß der Compiler, dass wenn Base # f ruft g(), sollte die overriden g() anstelle der Basis ein? Ich denke, ich vermisse wahrscheinlich einen kleinen Teil der Logik. Danke für die Antwort aber :) – SalysBruoga