Im folgenden Beispiel:
%Vor%%Vor%
Ich denke, was hier passiert, ist, dass der Super-Konstruktor die show () -Methode des Kindes aufruft, weil diese Methode in Child außer Kraft gesetzt wurde. wie es überschrieben wurde, aber warum ist der Wert von x 0 und warum ist es in der Lage, auf diese Methode zuzugreifen, bevor der Superkonstruktor abgeschlossen ist?
Ich denke, was hier passiert ist, dass der Super-Konstruktor die show () -Methode des Kindes aufruft, weil diese Methode in Child überschrieben wurde.
Das ist richtig
aber warum ist der Wert von x 0
weil es noch nicht initialisiert ist (x von Child)
und warum kann auf diese Methode zugegriffen werden, bevor der Superkonstruktor abgeschlossen wurde?
Genau deshalb sollten Sie in einem Konstruktor niemals eine Methode aufrufen, die überschrieben werden kann (nicht-final public und protected).
Bearbeiten:
Das Merkwürdige hier ist, dass alles standardmäßig / package-private Sichtbarkeit hat. Dies kann einige seltsame Auswirkungen haben. Siehe: Ссылка
Ich empfehle, wenn möglich, Methoden mit Standardsichtbarkeit nicht zu überschreiben (Sie können dies verhindern, indem Sie sie als endgültig deklarieren).
Sie können überschriebene Methoden von Konstruktoren aufrufen, aber es ist schlecht und Sie sollten nicht . Sie haben den Grund, warum dies schlecht ist, illustriert: Die abgeleitete Klasse hat keine Chance, initialisiert zu werden, also werden nicht initialisierte Felder verwendet - in Ihrem Beispiel ist der Standardwert für int
x 0
, deshalb druckt 0
.
Konstruktor Verkettung macht es sinnvoll, genau zu erklären, was das ist. Die erste Aufgabe einer Unterklassenkonstruktormethode besteht darin, die Konstruktormethode ihrer Oberklasse aufzurufen. Dadurch wird sichergestellt, dass die Erstellung des Unterklassenobjekts mit der Initialisierung der darüber liegenden Klassen in der Vererbungskette beginnt.
Child
s override der Methode show
wird aufgerufen, weil die Java-Spezifikation dies fordert. Hier ist eine große Diskussion darüber, warum Sie es nicht tun sollten . Der Wert von x ist Null, weil Child
die Initialisierung noch nicht beendet hat.
Tags und Links java constructor