Wenn ein Array erstellt wird, merkt es sich, welche Art von Daten es speichern soll. Also, wenn du Klassen hast
class Employee { .. }
class Manager extends Employee { .. }
und du ein Array erstellst
Manager[] arrM = new Manager[10];
wird das Array merken, dass es nur Instanzen der Klasse Manager oder abgeleitete Typen speichern soll. Aber ein solches Array kann keine Überklasse von Manager speichern, da die Überklasse nicht alle Methoden oder Felder der Managerklasse haben könnte. Deshalb ist etwas wie
arrM[0] = new Manager();
in Ordnung, aber
arrM[0] = new Employee();
wirft eine java.lang.ArrayStoreException: Employee
und zeigt an, dass Employee hier kein korrektes Argument ist.
Also in deinem Fall bist du
-
ein Array für Manager zu erstellen
Manager[] mans ={new Manager("Adam"),new Manager("Ben")};
-
eine Referenz zu diesem Array unter Verwendung seines Überdatentyps Employee
zu erstellen
Employee[] emps =mans;
(aber diese Referenz zeigt immer noch auf ein Array, das nur Manager enthalten kann)
-
und versucht, ein Employee
in das Array zu platzieren
emps[0] = new Employee("Charlie");
aber wie ich erwähnt habe, ist dies nicht erlaubt, da es möglich ist, dass Employee nicht dieselben Member wie Manager hat. Angenommen Manager kann jemanden einstellen (mit der Methode hire(...)
), während Employee das nicht kann (da es diese Methode nicht hat). Was würde passieren, wenn du folgendes aufrufen würdest
mans[0].hire(new Employee("Tom");
und emps[0] = new Employee ("Charlie");
würde keine Ausnahme werfen, sondern dich gestatten, Employee in emps[0]
zu platzieren? Da mans
und emps
dasselbe Array verwenden, würde dies bedeuten, dass mans[0].hire(new Employee("Tom")
von Employee("Charlie")
aufgerufen würde, der niemanden einstellen kann, weil Employee keine hire
-Methode hat.
Deshalb kannst du kein Instanz des Überdatentyps (Employee) in ein Array von Managern platzieren.