Ohne jetzt die Aufgabe 1.3 angeguckt zu haben:
In Java sind alle Variablen, die Klassen beinhalten in Wirklichkeit nur
Referenzen auf die Instanzen - und eine Referenz auf den Typ B kann halt
problemlos auf eine Instanz einer abgeleiteten Klasse zeigen. Der
Speicherplatz wird durch "new A();" reserviert.
(In C++ beispielsweise kann man auch Nichtreferenzvariablen für
Klassentypen haben, und er obige Code würde in b eine Kopie von a
ablegen, und dabei im typischen Fall einfach wegwerfen, was A von B
unterscheidet. A * a = new A(); B * b = a; würde dagegen wie in Java zwei
Pointer unterschiedlichen Typs auf die gleiche Instanz erzeugen, und wenn
alle Methoden virtuell sind würde sich diese Instanz wie ein A verhalten,
auch wenn über b darauf zugegriffen wird.)
Günther
Wie schon erklärt, handelt es sich ja nur um Referenzen.
Zum anderen würde in Klassen und ihr Interface (Methoden, Variablen) als einen
Vertrag denken. Eine Instanz der Klasse A erfüllt das Interface von B UND noch
etwas mehr. Ich kann diese Instanz aber auch nur als B behandeln, dann nutze ich
halt nicht alle Fähigkeiten aus.
Im Prinzip ist es das gleiche wie mit Interfaces: LinkedList implements List
LinkedList implementiert u.U. auch mehr Methoden als durch das List-Interface
vorgegeben wurde. Trotzdem geht folgendes:
LinkedList linkedList = new LinkedList();
List justAList = linkedList;
Das ist auch sehr sinnvoll, weil man im Programm meist nur "irgendeine" Liste
haben will und die konkrete Implementierung (LinkedList, ArrayList, ...) idR
nicht interessiert. Wenn überall nur List verwendet wird, kann man die konkrete
Implementierung bei Bedarf einfach austauschen.
Felix Schwarz
Freitagsrunde
Args ich habe das genau vertauscht in dem Beispiel, so gehts natürlich,
andersrum nicht.
Dankeschön!
Gruß Nico