Aufrufen einer überschriebenen Methode aus einem Konstruktor

8

Im folgenden Beispiel:

%Vor%
  • Warum ist die Ausgabe wie folgt
%Vor%
  • Ich dachte, Konstruktoren können nur auf Instanzmitglieder zugreifen, wenn ihre Superkonstruktoren fertig sind.

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?

    
ziggy 09.12.2011, 18:39
quelle

4 Antworten

11
  

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).

    
Puce 09.12.2011, 18:47
quelle
6

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 .

    
Luchian Grigore 09.12.2011 18:48
quelle
2

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.

Ссылка

Ссылка

    
Noufal Panolan 09.12.2011 18:53
quelle
1

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.

    
dasblinkenlight 09.12.2011 18:52
quelle

Tags und Links