4. Vererbung Die Klasse Object Die Klasse Object • Alle Klassen ohne explizit deklarierte Superklasse haben die Klasse Object als Superklasse. • Object gehört zum Paket java.lang. • Object verfügt über einige vordefinierte Methoden. Diese stehen somit allen Objekten (auch Feldern) zur Verfügung. • Es kann sinnvoll sein, diese Methoden in Unterklassen zu überschreiben, d.h. mit einer anderen Implementierung zu versehen. • Beispiel: toString() • genaueres zu den Methoden: siehe API-Dokumentation Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 125 4. Vererbung Die Klasse Object Die Methode equals public boolean equals(Object vergleichsObjekt) • Äquivalenzrelation auf nicht null Objekten. • Implementierung in Object: return this == vergleichsObjekt; • Überschreiben in Unterklassen: inhaltlicher Vergleich Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 126 4. Vererbung Die Klasse Object Die Methode toString public String toString() • toString() wird implizit aufgerufen, wenn eine Objektreferenz als Parameter der Methode println() verwendet wird. MeineKlasse obj = new MeineKlasse(); System.out.println(obj); • Die Implementierung in Object liefert einen String der Art: Klassenname@Referenz • Hier bietet es sich an, in Unterklassen die Methode toString zu überschreiben. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 127 4. Vererbung Die Klasse Object Die Methode finalize protected void finalize() • • • • Wird vom Garbage Collector auf einem Objekt aufgerufen. Aufruf erfolgt, wenn nicht mehr auf das Objekt zugegriffen werden kann. finalize der Klasse Object macht nichts. Kann in Unterklassen überschrieben werden, um Aufräumarbeiten durchzuführen. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 128 4. Vererbung Die Klasse Object Die Methode hashCode public int hashCode() • • • • • Liefert einen Hash-Wert, d.h. eine nahezu eindeutige Kennung für ein Objekt. Unterstützung für Hashing (siehe 3. Semester, AlgoDat) Selbes Objekt liefert stets den gleichen Hashwert Objekte, für die equals den Wert true liefert, müssen gleichen Hash-Wert haben. Verschiedene Objekte müssen nicht verschiedene Hash-Werte haben. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 129 4. Vererbung Finale Klassen und finale Methoden Finale Klassen • • • • • Der Modifier final schützt Klassen vor Vererbung. public final class Klasse { ... } Wirkung: Von Klasse kann keine Unterklasse abgeleitet werden. Typischerweise sind Klassen, die nur static Definitionen enthalten, final. Beispiel: java.lang.Math Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 130 4. Vererbung Finale Klassen und finale Methoden Finale Methoden • final vor einer Methode schützt diese Methode vor dem Überschreiben. • public final void meineMethode() • Finale Methoden verwendet man, wenn man sicherstellen möchte, dass eine Methode nicht verändert wird, z.B. weil Sie kritisch für den Zustand eines Objektes ist. • class ChessAlgorithm { static final int WHITE = 0; static final int BLACK = 1; ... final int getFirstPlayer() { return ChessAlgorithm.WHITE; } ... } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 131 4. Vererbung Typumwandlungen Sichtbarkeit von Methoden Medium medium = new CD("Beggarś Banquet", "Rolling Stones", 10, 41); System.out.println(medium.gibKuenstler()); Problem: • Das erzeugte CD-Objekt hat zwar eine Methode gibKuenstler(), • diese ist aber über die Variable medium nicht sichtbar. ✎ Compiler liefert Fehler Ursache: Die Variable medium könnte auch Objekte referenzieren, die nicht aus der Klasse CD stammen. ✎ Entscheidend für die Sichtbarkeit ist der statische Typ einer Variablen Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 132 4. Vererbung Typumwandlungen Typumwandlungen Kann man aus dem Medium-Objekt wieder ein CD-Objekt machen? Ja, mit einer expliziten Typumwandlung. Medium medium = new CD("Beggarś Banquet", "Rolling Stones", 10, 41); ... CD cd = (CD) medium; System.out.println(cd.gibKuenstler()); oder kurz System.out.println( ((CD)medium).gibKuenstler() ); • Eine (typischerweise implizite) Typumwandlung von einem Untertyp zu einem Obertyp heißt Upcast. • Eine (nur explizit mögliche) Typumwandlung von einem Obertyp zu einem Untertyp heißt Downcast. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 133 4. Vererbung Typumwandlungen Typumwandlung (2) public class OK { ... } public class UK1 extends OK { ... } public class UK2 extends OK { ... } OK a = new UK1(); OK b = new UK2(); UK1 c = (UK1) a; UK2 d = (UK2) b; UK2 e = (UK2) c; UK2 f = (UK2) a; // // // // // // ok, Upcast ok, Upcast ok, Downcast ok, Downcast Fehler, erkennt Compiler Fehler, ClassCastException Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 134 4. Vererbung Typumwandlungen Typumandlung bei Feldern • Die Typhierarchie setzt sich auf Felder fort. • Wenn OK eine Oberklasse von UK ist, dann ist OK[] ein Obertyp von UK[]. Medium[] medienliste = new CD[20]; medienliste[0] = new CD(...); CD cd = (CD) medienliste[0]; medienliste[1] = new Video(...); Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 // // // // ok, Upcast ok, Upcast ok, Downcast Fehler, ClassCastException 135 4. Vererbung Typumwandlungen Der instanceof-Operator • zweistelliger Operator, der einen boolschen Wert liefert • Syntax: Ausdruck instanceof Referenztyp • Liefert true, wenn ein Cast von Ausdruck zu Referenztyp möglich ist. • Hierdurch kann eine ClassCastException vermieden werden. • Auch als Test möglich, um zu prüfen, ob ein Objekt aus einer bestimmten Unterklasse stammt. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 136 4. Vererbung Typumwandlungen Der instanceof-Operator (2) Beispiel: MedienDatenbank db = new MedienDatenbank(...); Medium[] medienliste = db.gibAlleMedien(); CD cd; Video video; for (int i=0 ; i<medienliste.length ; i++) if ( medienliste[i] instanceof CD ) { cd = (CD) medienliste[i]; System.out.println(cd.gibKuenstler()); } else if ( medienliste[i] instanceof Video ) { video = (Video)medienliste[i]; System.out.println(video.gibRegisseur()); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 137