Ich bin beim Lernen von Java auf eine seltsame Sache gestoßen. Betrachten Sie das folgende Programm:getClass() gibt den abgeleiteten Klassennamen nach dem Upcasting zurück
public class GetClassNameInheritance {
public static void main(String[] args) {
Employee e = new Employee();
Person p = (Person) e;
System.out.println(p.getClass());
}
}
class Person {
}
class Employee extends Person {
}
ich den Ausgang erwarten sein Person
wegen der Besetzung, aber es ist Employee
! Ehrlich gesagt bin ich ratlos und finde keine Erklärung. Das offizielle Oracle tutorial erwähnt dieses Verhalten nicht, und die docs scheinen zu kurz, um hilfreich zu sein. Ich kann aus anderen StackOverflow-Beispielen erkennen, dass dies etwas mit "Laufzeitklasse" zu tun hat, aber ich verstehe die zugrundeliegende Idee nicht. Kann mir jemand erklären, was hier vor sich geht?
Hmmm, sehr interessant. Wenn ich also "(Person) e" sage, wählt die JVM zur Laufzeit nur diejenigen Attribute von "Employee" aus, die der Schnittstelle "Person" entsprechen. Sehr interessant, in der Tat! – dotslash
Das ist genau das, was es tut. Zur Kompilierzeit überprüft es nur die Hierarchie. Zur Laufzeit tut es das tatsächlich. Wenn zur Laufzeit die Objekte nicht übereinstimmen, erhalten Sie eine Class Cast-Ausnahme. – anacron