2017-04-13 2 views
0

nehme an, ich habe eine Situation, wie:Erkundigung über Vererbung in Java

class Base{ 

    public Base() { 
     System.out.println("Base"); 
    } 

} 


class Derived extends Base{ 

    public Derived(){ 

     System.out.println("Devired"); 
    } 
} 


class DeriDerived extends Derived{ 
    public DeriDerived(){ 
     System.out.println("DeriDevired"); 
    } 
} 

Ich bin nicht so klar, wie die Vererbung arbeiten, zum Beispiel, wenn ich versuche: Derived b = new DeriDerived(); und DeriDerived b1 = new DeriDerived();, sie beide die gleichen Ergebnisse erzeugt.

Für die zweite Situation: DeriDerived b1 = new DeriDerived(); Was verstehe ich (vielleicht richtig sein, vielleicht auch nicht ???), dass die DeriDerived seine übergeordnete Klasse aufrufen, die abgeleitet ist, und der Devired ruft wieder seine übergeordnete Klasse der ist Basis, so am Ende werden wir Ergebnis aussehen wie: Based/Devired/DeriDerived.

Aber für die erste Situation, die ich nicht verstehe, wie es das gleiche Ergebnis wie Basierend erhalten Werke/Devired/DeriDerived

jemand mir helfen, zu erklären?

Vielen Dank!

+1

In beiden Beispielen rufen Sie den gleichen Konstruktor auf. Warum würde es andere Ergebnisse erzeugen? – dunni

+0

Der Typ der Variablen, in der Sie das Konstruktorresultat (die Instanz) speichern, hat keinen Einfluss auf die Konstruktion. Es wird nur der Typ der Box und dann die verfügbaren Eigenschaften (Methode, Variable) definiert. Aber Sie erstellen immer noch den gleichen Typ von Objekt, ein 'DeriDerived' – AxelH

+0

Mögliches Duplikat von [Java-Vererbung] (http://stackoverflow.com/questions/3506412/java-inheritance) – AxelH

Antwort

1

Beide Objekte sind Instanzen von abgeleiteten, daher verhalten sie sich ähnlich.
sie teilen nur den gleichen Konstruktor.
Wenn Sie jedoch andere Methoden in den Klassen haben, können Sie nur auf die Methoden in derived und base (im ersten Szenario) zugreifen, während Sie im zweiten Szenario auf alle Methoden von übergeordneten Klassen zugreifen können.
tun dies ist nicht ratsam, da es einige Unklarheiten in Ihrem Code bringen wird.

1

In Java wirkt sich die Variable, die einen Verweis auf das Objekt enthält, nicht auf die Objekterstellung aus.

In allen Fällen rufen Sie DeriDerived Konstruktor, aber Objekt erstellt wie folgt kann verwiesen werden nach Art von: DeriDerived, Devired, Base, Object.

Aber in jedem Fall haben Sie unterschiedliche Methoden Sichtbarkeit.

Wenn Sie also eine Instanz von DeriDerived erstellen, aber auf Devired verweisen, haben Sie nur Zugriff auf Methoden der Devired- und Base-Klassen. Sie werden keine Methoden aus der DeriDerived-Klasse sehen, obwohl dies eine Referenz auf das gleiche Objekt ist -> DeriDerived.

0

, wenn Sie Objekt

Derived d=new DeriDerived() 

intern Standardkonstruktors hat erste Anweisung ist Super()

Das Schlüsselwort super verwendet werden kann, auch aufrufen oder rufen Sie die übergeordneten Klasse Konstruktor erstellen. Constructor fordert von unten nach oben und von oben Ausführung bottom.so es funktioniert wie folgt

  1. DeriDerived() Konstruktor Aufruf Abgeleitete() Konstruktor als DeriDerived Konstruktor erste Aussage ist super(), es ruft Parent Constructor ie Derived() Konstruktor.

  2. Abgeleitet() Konstruktoraufruf zu Base() Konstruktor

  3. Base() Konstruktoraufruf Klassenkonstruktors Objekt als Objekt Elternklasse ist.

aber in folgenden Hierarchie Base() ausgeführt -> Abgeleitete() -> DeriDerived()

Debug dieser Code

class Base{ 

    public Base() { 
     super(); 
     System.out.println("Base"); 
    } 
} 


class Derived extends Base{ 

    public Derived(){ 
    super(); 

     System.out.println("Devired"); 
    } 
} 


class DeriDerived extends Derived{ 
    public DeriDerived(){ 
     super(); 
     System.out.println("DeriDevired"); 
    } 
} 
0

in beiden Objekten Schöpfung Abgeleitet b Siehe = neu DeriDerived(); und DeriDerived b1 = neu DeriDerived();

Sie rufen die gleiche Referenz, bedeutet mit dem Referenzaufruf, d. H. Mit b oder b1, sie beide erstellen die gleichen Instanzen, weshalb sie die gleichen Ergebnisse geben.

Wenn Sie einen Unterschied wollen, dann erstellen Sie öffentliche Methoden in jeder Klasse und versuchen Sie, auf Referenz zuzugreifen.

Unterklasse Referenz verwenden, (dh unter Verwendung b1) Sie abgeleitete Klassenmethoden zugreifen können, aber unter Verwendung von Super-Klasse Referenz (dh unter Verwendung b) Sie nicht in der Lage sein werden, Unterklasse (DeriDerived) Klasse Methoden für den Zugriff auf