"Es ist wichtig das zu verstehen es ist die Art der Referenzvariablen - nicht die Art des Objekts, auf das es sich bezieht zu - das bestimmt, was Mitglieder können zugegriffen werden. "
Was meinst du genau mit dieser Aussage? Ist dies auf das Konzept der Vererbung beschränkt? Wie behandelt JVM das?
Es bedeutet, dass Sie Folgendes haben:
%Vor% Der Typ der -Variablen ist Object
, aber der Typ des Objekts, auf das verwiesen wird, ist String
. Es ist der Variablentyp, der bestimmt, was Sie tun können - Sie können also nicht
Der Compiler weiß nur, dass Sie eine Methode für Object
aufrufen, die toUpperCase
nicht enthält. In ähnlicher Weise werden überladene Methoden nur gegen diejenigen aufgelöst, die Sie kennen:
Zum Beispiel:
%Vor% Im obigen Beispiel wird angenommen, dass ein Fahrrad nicht die Methode shiftUp
hat. Die Zeile b2.shiftGearUp()
würde nicht kompiliert, da die JVM nur weiß, dass b2
ein Bike
ist und nicht MountainBike
.
Du könntest es zum Laufen bringen, indem du es auf einen Mountainbike-Typ verwandelst:
%Vor% In Java kann sich eine Referenz des Typs base
auf ein Objekt der Klasse child
beziehen. Mit einem solchen Verweis können wir jedoch nur auf die Mitglieder der Klasse base
zugreifen, die an die Klasse child
vererbt wurden, und nicht auf die Mitglieder, die die Klasse child
hinzugefügt haben könnte.
Wenn Sie eine Klasse Foo
mit einem öffentlichen Feld foo
und eine Klasse Bar extends Foo
mit einem öffentlichen Feld bar
...
Foo myRef = new Bar();
können Sie nur auf myRef.foo
zugreifen, obwohl das Objekt tatsächlich ein Bar
ist. Bar myRef = new Bar();
erlaubt den Zugriff auf myRef.foo
und myRef.bar
. Weil die Referenz als Bar
deklariert ist. "Es ist wichtig das zu verstehen ist die Art der Bezugsgröße - nicht die Art des Objekts, auf das es sich bezieht zu - das bestimmt, was Mitglieder können zugegriffen werden. "
Das bedeutet, dass der Compiler die Klasse der Referenzvariable auf das Vorhandensein von Methoden und anderen Membern überprüft, zum Beispiel, dass Sie eine Dog
-Unterklasse haben, die Animal
baseclass erweitert,
Hier prüft der Compiler, ob die makeSound () - Methode in der Animal-Klasse deklariert ist oder nicht, damit sie kompiliert werden kann.
Tags und Links java