Betrachten Sie die folgende Basen/abgeleiteten Klassen:Aufruf der Methode von Java-Kind-Klasse nicht in übergeordneten Klasse
public class Car {
private int cylinders;
public Car(int cyl) {
cylinders = cyl;
}
public int getCylinders() {
return cylinders;
}
}
public class SportsCar extends Car {
private int topSpeed;
public SportsCar(int cyl, int top) {
super(cyl);
topSpeed = top;
}
public int getTopSpeed() {
return topSpeed;
}
}
Betrachten Sie nun die folgenden zwei Objekte:
SportsCar lambo = new SportsCar(8,255);
Car m5 = new SportsCar(10,240);
Die folgender Methodenaufruf kompiliert:
lambo.getTopSpeed();
jedoch diese Methode aufrufen, bricht mit der Fehlermeldung „kann nicht Symbol finden - Methode getTopSpeed ()“
m5.getTopSpeed();
Jetzt verstehe ich, dass die getTopSpeed
Methode in der Basisklasse, um existieren muss, damit es da m5
zu kompilieren ist ein Car
Typ, also, wenn ich getTopSpeed
in Car
dann m5.getTopSpeed();
compiles nett einschließen.
Meine Fragen sind:
- Warum tritt der Fehler „nicht finden können, Symbol - Methode getTopSpeed ()“ bei der Kompilierung passieren und nicht die Zeit laufen?
- Warum verhindert "späte Bindung" diesen Fehler nicht?
getTopSpeed
Unter der Annahme, inCar
umgesetzt (so es kompiliert), wenn das Programm ausgeführt wird, wird der Compiler zunächst prüfen, obgetTopSpeed
inCar
existiert und dann überprüft, ob es übergegangen inSportsCar
ist oder tut es einfach " wissen, "dass es bereits vom Compiler überfahren wurde und direkt die Override-Methode verwendet?
Ihre erste Frage [vernünftigerweise mit dem ersten Satz beantworten] (http://stackoverflow.com/a/11466790/1079354) in dieser andere Antwort auf die Frage. Die anderen Bits, ich würde ein bisschen eine Durchsicht der JLS ermuntern. – Makoto
'm5' ist eine Referenzvariable vom Typ' Car', was bedeutet, dass Sie nur Methoden aufrufen können, die in 'Car' definiert sind. Wenn Sie die Methoden in 'SportsCar' verwenden möchten, müssen Sie' m5' explizit als 'SportsCar' einsetzen. – Logan
Der Compiler kann die Member eines abgeleiteten Typs nicht durch eine Variable eines übergeordneten Typs "sehen". Es gibt zwei Typen, den deklarierten Typ der _variable_, mit der der Compiler arbeitet, und den Laufzeittyp des _object_, mit dem die JVM arbeitet. Sie haben erwartet, dass der Compiler die _variable_ verarbeitet, als ob sie den Laufzeittyp des _object_ sehen könnte. Es kann nicht. –