Die Klasse Object, Finale Klassen und Methoden, Typumwandlungen

Werbung
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
Herunterladen