Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Musterlösung Klausur 2004

4 views
Skip to first unread message

Nico Golde

unread,
Jul 28, 2006, 11:33:00 AM7/28/06
to
Hi,
die Musterlösung der Klausur von 2004 sagt, dass 1.3 korrekt sei, weil
A von B abgeleitet ist. Wie geht dann ein
A a=new A();
B b=a;
A erbt von B und erweitert es sogar noch um Variablen, wie kann ich dann
ein B, das ja offensichtlich weniger beinhaltet etwas aus A zuweisen?
Ist das ein Fehler in der Musterlösung oder überseh ich etwas?
Gruß Nico

Günther Brammer

unread,
Jul 28, 2006, 7:33:36 PM7/28/06
to
Hallo,

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

Felix Schwarz

unread,
Jul 29, 2006, 4:46:13 AM7/29/06
to
Nico Golde wrote:
> die Musterlösung der Klausur von 2004 sagt, dass 1.3 korrekt sei, weil
> A von B abgeleitet ist. Wie geht dann ein
> A a=new A();
> B b=a;
> A erbt von B und erweitert es sogar noch um Variablen, wie kann ich dann
> ein B, das ja offensichtlich weniger beinhaltet etwas aus A zuweisen?

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

Nico Golde

unread,
Jul 29, 2006, 5:10:48 PM7/29/06
to
Hi,
* Felix Schwarz <Felix....@web.de>:

Args ich habe das genau vertauscht in dem Beispiel, so gehts natürlich,
andersrum nicht.
Dankeschön!
Gruß Nico

0 new messages