Ich habe eine Frage zu Vererbung und Casting in Java. Ich habe die folgenden zwei Beispiel-Klassen und eine Testklasse, und ich feststellen, meine Frage nach den Klassen:Vererbung und Casting in Java
public class Automobile {
public int var;
public Automobile() {
var = 1;
}
public String toString() {
return "AUTOMOBILE: " + var;
}
}
public class Porsche extends Automobile {
public int var;
public Porsche() {
var = 2;
}
public String toString() {
return "PORSCHE: " + var;
}
}
public class Test {
public static void main (String [] args) {
Porsche p = new Porsche();
Automobile a = new Automobile();
System.out.println ("(Automobile) p = " + (Automobile)p);
System.out.println ("(Automobile) p.var = " + ((Automobile)p).var);
}
}
Die Ausgabe lautet:
(Automobile) p = PORSCHE: 2
(Automobile) p.var = 1
Ich verstehe nicht, in der zweiten Erklärung, warum wir habe 1. Sollte es nicht 2 sein? Denn nachdem ich in der ersten Anweisung p zu Automobil-Guss noch ich PORSCHE: 2
als die Darstellung von p
bekommen - ich verstehe dies auf folgende Weise:
trotzdem habe ich p
zu Automobil-p
hält seine „ursprüngliche Natur“ gecastet - p
ist ein Objekt der Klasse Porsche, aber weil Porsche Automobile erweitert, könnten wir sagen, dass p auch ein Automobil ist. Und wenn wir es explizit auf Automobile anwenden, verwendet es weiterhin seine Methoden - in unserem Fall die in Porsche definierte Methode toString()
.
Auf der anderen Seite, wenn das, was ich schreibe, ist korrekt, dann die zweite print-Anweisung sollte 2 geben und nicht 1.
scheint nun dies als Widerspruch zu mir, aber da dies in Java arbeitet, wie es scheint dass ich nicht verstehe, was während des Castings und des Vererbungsprozesses passiert.