mithilfe der Konstruktor aus der Superklasse
Java erlaubt keine Mehrfachvererbung, d.h. eine Klasse kann nicht Erben von zwei Klassen, die nicht etwas gemeinsam haben, das heißt, Sie sind nicht auf der gleichen Erbe Weg. Jedoch kann die Klasse erbt von mehreren Klassen, wenn diese Klassen sind super-Klassen von der direkten super-Klasse der Klasse. Aber die Klasse erbt von dieser Klassen indirekt, was bedeutet, dass es nicht "sehen" nichts von diesen Ober-super-Klassen, richtig? Ich war verwirrt, wenn man Konstruktoren (mit super() im Konstruktor). Zum Beispiel, wenn wir haben die folgenden Klassen:
public class A {
public A() {
....
}
}
public class B extends A {
public B() {
super();
....
}
}
public class C extends B {
public C() {
super();
....
}
}
den Konstruktor von der Klasse C ruft zuerst den Konstruktor der Klasse B mit super(). Wenn dies geschieht, wird der Konstruktor von B selbst ruft zuerst den Konstruktor von A (mit super()), aber der Konstruktor von C nicht, wissen nichts über den Konstruktor Ein, richtig? Ich meine, die Vererbung ist nur von der direkten super-Klasse - die ersten (nächsten) - Klasse aus der Vererbungshierarchie. Das ist auch meine Frage - mit super() wird ja nur der Konstruktor der direkten super-Klasse, egal wie viele andere Klassen haben wir in der Vererbungshierarchie.
Und dies gilt nicht nur für Handwerker, sondern für alle Methoden und Instanzvariablen..
Hinsichtlich
- Noch nicht sicher, was ist die Frage, die Sie gefragt haben. Ein Fragezeichen helfen könnte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zum aufrufen einige Konstruktor in Ihrer unmittelbaren Basisklasse. Dies kann
Damit für Errichter, die Sie nicht VERMEIDEN können, bauen Ihre fortgeschrittene Basis-Klassen, aber Sie können wählen, welcher Konstruktor zu verwenden ist. Wenn es nur die no-args-Konstruktor es ist alles für Sie verarbeitet mit einem impliziten Aufruf super. Mit mehrere Konstruktoren Sie haben einige Möglichkeiten mehr.
super kann beziehen sich auf alle nicht-privaten variable oder Methode in einer beliebigen base-Klasse. Also Methoden und Variablen sind nicht das gleiche wie Konstruktoren in dieser Hinsicht.
Selbst wenn Sie könnte vermeiden, fordern die intermediate-ctor, Sie würden nicht wollen, denn das würde bedeuten, Sie hatte nicht initialisierte Teile der zwischen-Klassen, könnte sein acessed von der untersten abgeleiteten Klasse. Zu schreckliche Auswirkungen.
Aber ich habe das Gefühl, dass du versuchst zu betrügen Ihren Weg, um Java zu tun, die mehrfache Vererbung. Das ist eine Schlechte Sache. Stattdessen können Sie es tun, Java-Weise über ein interface
oder durch die Verwendung von aggregation
Konstruktoren für alle Eltern aufgerufen werden. In der Tat, tief unten, C kennt A, weil B extends A. Zum Beispiel, wenn die Klasse enthaltene Methode foo(), dann könnte man Aufruf von foo() aus C.
Also aus deinem Beispiel C ruft den Konstruktor von B, die ruft den Konstruktor von A. Additionnally, Eine erstreckt sich auch von der Klasse Object. Also den Konstruktor der Klasse Object ist auch genannt!
Darüber hinaus müssen Sie nicht fügen Sie einen Aufruf von super(). Wenn es kein Aufruf für den Konstruktor der übergeordneten, super, ist call implizit.
Wie Sie sagen -, C-Konstruktor ruft B den Konstruktor der ruft Einen Konstruktor. Sie anrufen können "A" - Methoden auf ein C-Objekt und ein C-Objekt sehen können, nicht-privaten Felder in A.
Selbst wenn Sie überschreiben die Methode "foo" in C, kann man die Eine version mit "super.foo()", unter der Annahme B auch nicht außer Kraft setzen.
So weit wie C kennt, etwas, dass es nicht überschrieben, in C ist enthalten in B, wenn auch unter die Abdeckungen der Klasse A ist, wo die Umsetzung sein könnte.
So, in diesem Fall übernimmt die Umsetzung von aMethod(), obwohl dem Aufruf von super() in C Konstruktor bezeichnet B den Konstruktor direkt, keine ist.