Weil Sie sich auf Felder beziehen, die nicht von Polymorphie betroffen sind. Wenn Sie stattdessen getX()
verwendet hätten, hätte 2
zurückgegeben.
Sie fragen nach dem Wert des Feldes x
, das in der Klasse A
definiert ist (weil Base.getObject()
A
zurückgibt). Auch wenn CovariantReturn
die Methode, die B
zurückgibt, überschreibt, verweisen Sie nicht auf Ihr Objekt als CovariantReturn
.
Um ein wenig darüber zu erweitern, wie Felder von Polymorphie nicht beeinflusst werden - Feldzugriff wird zur Kompilierzeit realisiert, also was auch immer der Compiler sieht, darauf wird zugegriffen. In Ihrem Fall definiert die Methode, dass A
zurückgegeben wird und auf A.x
zugegriffen wird. Auf der anderen Seite werden Methoden basierend auf dem Laufzeittyp aufgerufen. Selbst wenn Sie definieren, dass A
zurückgegeben wird, aber eine Instanz von B
zurückgegeben wird, wird die Methode, die Sie aufrufen, auf B
aufgerufen.
@ kris979 Obwohl Sie B zurückgeben, denke ich, was den Unterschied ausmacht, ist, dass der Rückgabetyp aus A besteht. Daher wird der Wert von x in A, d. h. 1, gedruckt.
Wie Bozho darauf hingewiesen hat - die Instanzvariable wird niemals von Polymorphie beeinflusst. Lassen Sie mich Ihnen ein kleines Beispiel geben.
%Vor%Dieser Code wird gedruckt - in sub und 1