Programmieren 2 – Java
Überblick
1
2
3
4
5
6
7
8
9
10
11
Klassen und Objekte
Vererbung
Schnittstellen
Innere Klassen
Exceptions
Funktionsbibliothek
Datenstrukturen und Algorithmen
Ein-/Ausgabe
Graphische Benutzeroberflächen
Applets
Internet-Anwendungen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
75
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
76
1
2 Vererbung
2.1 Einleitung
Vererbung: Englisch Inheritance
Mechanismus, bei dem Klassen mit ähnlichen Eigenschaften in eine
hierarchische Beziehung miteinander gesetzt werden
Die untergeordnete, speziellere Klasse (Subklasse) erbt die
Eigenschaften (Attribute und Methoden) der übergeordneten,
allgemeineren Klasse (Superklasse)
Baum
Nadelbaum
Superklasse,
allgemeiner
Laubbaum
Subklasse,
abgeleitete Klasse,
spezieller
Gemeinsame Eigenschaften ordnet man der Superklasse zu, so dass
diese in den Subklassen wiederverwendet werden können
Man erhält eine Vererbungshierarchie: Spezialisierung/Generalisierung.
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
77
2 Vererbung
2.1 Einleitung
Was wird vererbt?
Wie die Eigenschaften, die man von seinen Eltern ererbt: Einige sind
dieselben, einige sind verändert, einige sind neu
Dies gilt sowohl für Attribute als auch für Methoden
Alle Attribute der Elternklasse werden geerbt
Einige können noch hinzukommen
Es können jedoch keine weggelassen werden
Es können welche geändert werden (unter demselben Namen)
Alle Methoden der Elternklasse können auch von den Nachkommen
benutzt werden
Es können Methoden hinzukommen
Es können keine weggelassen werden.
Es können jedoch Methoden redefiniert werden (unter demselben
Namen): Anderes Verhalten!
Zugriffsprivilege können bei der Vererbung verändert werden
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
78
2
2 Vererbung
2.1 Einleitung
Code-Wiederverwendung
Wichtige Basisattribute und Basismethoden können in einer
hierarchisch höher stehenden Klasse platziert werden und stehen allen
Nachkommen, die spezialisierte Objekte darstellen, zur Verfügung.
Vereinfachte Wartung, Wiederverwendbarkeit von Code!
Nur die zentrale Funktion der
Änderung
Basisklasse
Basisklasse muss geändert
werden. Durch die Vererbung
greifen alle untergeordnete
Klassen zwangsläufig auf die
Subklasse
richtige, geänderte Methode zu.
Man kann auf diese Weise die
Struktur der Eigenschaften
(Attribute und Methoden) aller
Nachfolgeklassen erzwingen.
Subklasse
Jede Klasse hat einen Vorgänger, kann aber
selbstverständlich mehrere Nachkommen haben.
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
79
2 Vererbung
2.1 Einleitung
Polymorphismus
Methoden bei Java sind normalerweise virtuelle Methoden
Solche Methoden sind in der Basisklasse definiert und werden in den
abgeleiteten Klassen redefiniert (überschrieben)
Damit zeigen die abgeleiteten Klassen ein anderes Verhalten
Mit einer Klassenhierarchie wird eine Menge von Datentypen (Klassen)
derart definiert,
dass eine Referenz auf die Basisklasse auch auf Objekte aller
abgeleiteten Klassen zeigen kann.
Ruft man mit einer solchen Referenz eine virtuelle Methode auf, so
wird zur Laufzeit entschieden, welches die richtige redefinierte
Methode ist
Jedes Objekt „weiß“, welche Methodenimplementierung für es die
richtige ist
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
80
3
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
81
2 Vererbung
2.2 Vererbung in Java
Beispiel: Online Shop für Bücher und CDs
Buch
Artikelnummer
Verfasser
Titel
Verlag
Erscheinungsjahr
Preis
CD
Artikelnummer
Interpret
Liste von Musikstücken
Preis
Warenkorb sollte beide Arten von Artikel aufnehmen können
Gemeinsame Attribute und Methoden
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
82
4
2 Vererbung
2.2 Vererbung in Java
Klassendefinitionen
Artikel, Buch, CD
public class Article {
private int code;
// Artikelnummer
private String label; // Kurzbeschreibung
private int price;
Eine Zeile Kurzinfo über Artikel:
public void showInfo() { ... }
code, label, price
public String getArticleLine() { ... }
public Article(int code, String label, int price) { ... }
}
public class Book extends Article {
private String author, title, publisher;
private int year;
public void showInfo() { ... }
Informationen zu dem Artikel
}
aufbereitet zur Darstellung in
public class CD extends Article {
einem separaten Fenster:
private String artist;
Verschieden
für Bücher und CDs
private String[] song;
public void showInfo() { ... }
}
© Prof. Dr. Björn Dreher
83
Programmieren 2 - Java
2 Vererbung
2.2 Vererbung in Java
Klassendefinitionen in UML-Notation
Article
- code: int
- label: String
- price: int
+ showInfo(): void
+ getArticleLine(): String
Book
CD
- author: String
- title: String
- publisher: String
- year: int
- artist: String
- song: String [ ]
+ showInfo(): void
+ showInfo(): void
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
84
5
2 Vererbung
2.2 Vererbung in Java
Alle Klassen erben von der „Urvorfahrenklasse“ Object
Vererbungsbeziehungen
Jede Klasse hat genau eine Vorfahrenklasse (außer Object)
In Java gibt es keine Mehrfachvererbung
Jede Klasse kann 0 oder mehrere Nachfahrenklassen haben
Syntax
class UnterKlasse extends OberKlasse {
...
}
Bedeutung bei richtiger Anwendung von Vererbungsbeziehungen
Ein Objekt der Unterklasse ist sinngemäß auch immer ein Mitglied
der Oberklasse (eine is-a Beziehung)
Ein Buch ist ein Artikel
Eine CD ist ein Artikel
© Prof. Dr. Björn Dreher
Sehr wichtig!
Programmieren 2 - Java
85
2 Vererbung
2.2 Vererbung in Java
Ein etwas einfacheres Beispiel: Kleidungsstücke
Kleidung
# farbe: String
+ setFarbe(String f): void
+ getFarbe(): String
Socke
+ kennung(): String
Hose
+ kennung(): String
class Kleidung {
protected String farbe;
public void setFarbe (String f) {
farbe = f;
}
public String getFarbe() {
return farbe;
}
© Prof. Dr. Björn Dreher
class Socke extends Kleidung {
public String kennung() {
return "Ich bin eine Socke " +
"der Farbe " + farbe;
}
}
class Hose extends Kleidung {
public String kennung() {
return "Ich bin eine Hose " +
"der Farbe " + farbe;
}
}
Programmieren 2 - Java
86
6
2 Vererbung
2.2 Vererbung in Java
Hauptprogramm dazu
public class SchrankVoll {
public static void main(String args[]) {
Socke s = new Socke();
s.setFarbe("rot");
Hose h = new Hose();
h.setFarbe("grau");
System.out.println( s.kennung() );
System.out.println( h.kennung() );
Von Kleidung
geerbte Methode
}
}
Eigene Methode
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
87
2 Vererbung
2.2 Vererbung in Java
Sichtbarkeit
Nachfahrenklassen haben zu privaten Eigenschaften der
Vorfahrenklasse keinen Zugriff
Spezielle Sichtbarkeit: protected
Sichtbar für Nachfahrenklassen und alle Klassen desselben
Packages
Will man eine Klasse auf mögliche Nachfahrenklassen vorbereiten,
sollte man private in den meisten Fällen durch protected ersetzen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
88
7
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
89
2 Vererbung
2.3 Substitutionsprinzip
Zuweisungskompatibilität innerhalb einer Vererbungshierarchie
Referenz auf Vorfahrenklasse kann Referenz auf Nachfahrenklasse
aufnehmen
Kleidung kann Socke oder Hose zugewiesen werden
Beide sind Kleidung
Kleidung
Wichtiges Konzept der Objektorientierung
# farbe: String
Überall, wo Oberklasse
+ setFarbe(String f): void
gefordert ist, kann auch ein Objekt
+ getFarbe(): String
der Unterklasse verwendet
werden
Unterklasse hat alles, was
Socke
Hose
Oberklasse erwartet, ist
+
kennung():
String
+ kennung(): String
nur spezieller
Oberklasse kann speziellere
Eigenschaften der Unterklasse (ohne besondere Vorkehrungen)
nicht nutzen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
90
8
2 Vererbung
2.3 Substitutionsprinzip
Häufige Anwendung in der Java-Klassenbibliothek
Behälterklassen (Liste, Stack)
Erwarten Objekte der Klasse Object
Können daher alle Java Objekte aufnehmen
Unser Beispiel:
Überall, wo Kleidung erwartet
wird, können auch Socken der
Hosen benutzt werden
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
91
2 Vererbung
2.3 Substitutionsprinzip
Beispiel
public class WasIstAllesKleidung {
public static void main(String args[]) {
Kleidung [] kl = new Kleidung[2];
Socke s = new Socke();
s.setFarbe("rot");
Hose h = new Hose();
h.setFarbe("grau");
kl[0] = s;
kl[1] = h;
System.out.println( kl[0].getFarbe() );
System.out.println( kl[1].getFarbe() );
for (int i = 0; i < 2; i++)
System.out.println( kl[i].kennung() ); // Geht nicht!
}
}
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
92
9
2 Vererbung
2.3 Substitutionsprinzip
Kleidung
# farbe: String
Unser Beispiel Kleidungsstücke
modifiziert
+ setFarbe(String f): void
+ getFarbe(): String
+ kennung(): String
Socke
+ kennung(): String
class Kleidung {
protected String farbe;
public void setFarbe (String f) {
farbe = f;
}
public String getFarbe() {
return farbe;
}
public String kennung() {
return "Ich bin eine Kleidung";
}
}
© Prof. Dr. Björn Dreher
Hose
+ kennung(): String
class Socke extends Kleidung {
public String kennung() {
return "Ich bin eine Socke " +
"der Farbe " + farbe;
}
}
class Hose extends Kleidung {
public String kennung() {
return "Ich bin eine Hose " +
"der Farbe " + farbe;
}
}
Programmieren 2 - Java
93
2 Vererbung
2.3 Substitutionsprinzip
Beispiel
public class WasIstAllesKleidung {
public static void main(String args[]) {
Kleidung [] kl = new Kleidung[2];
Socke s = new Socke();
s.setFarbe("rot");
Hose h = new Hose();
h.setFarbe("grau");
for (int i = 0; i < 2; i++)
System.out.println( kl[i].kennung() ); // Geht jetzt!
Socke s1 = kl[0];
Socke s1 = (Socke) kl[0];
// Geht nicht!
// So geht's
}
}
© Prof. Dr. Björn Dreher
Typumwandlung
Richtigkeit wird zur Laufzeit geprüft
Programmieren 2 - Java
94
10
2 Vererbung
2.3 Substitutionsprinzip
Finale Klassen
Soll eine Klasse nicht vererbbar sein, d.h. also keine Unterklassen
bilden können, so muss sie mit dem Modifizierer final versehen
werden
Unterklassen können Eigenschaften der Klasse nicht mehr verändern
Einsatz z.B. unter Sicherheitsaspekten
Klasse String ist final
Strings bleiben immer unveränderlich
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
95
2 Vererbung
2.3 Substitutionsprinzip
Klassenzugehörigkeit überprüfen
Operator instanceof
boolean b;
String str = "Mein String";
b = ( str instanceof String );
b = ( str instanceof Object );
b = ( str instanceof Date );
...
// true
// true
// false
Ergibt auch „wahr“ bei Vergleich mit einer Vorfahrenklasse!
Falls true
Linker Operand kann sicher einem Objekt der Klasse des rechten
Operanden zugewiesen oder
in diese Klasse typgewandelt werden:
if (myObject instanceof Point)
Point p = (Point) myObject;
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
96
11
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
97
2 Vererbung
2.4 Methoden überschreiben
Vererbungsregeln
Unterklasse erbt alle sichtbaren Eigenschaften
public und protected
package, wenn sie im selben Package liegt
Methoden können hinzugefügt werden
Anderer Name: Neue Methode kommt hinzu
Derselbe Name, aber andere Signatur: Methode wird überladen
(Overloading)
Neue Methode mit veränderter Signatur kommt hinzu
Derselbe Name, dieselbe Signatur und derselbe Rückgabetyp:
Methode wird überschrieben (Overriding)
© Prof. Dr. Björn Dreher
Unterklasse implementiert die Methode der Oberklasse neu
Neue Methode verändert das bisherige Verhalten
Spezialisierung
Basis für Polymorphismus
Programmieren 2 - Java
98
12
2 Vererbung
2.4 Methoden überschreiben
Aufrufen einer Methode der Oberklasse
Überschreiben einer Methode: Völlig neue Implementierung
Könnte man nicht die überschriebene Methode aufrufen, diese
bestimmte Basisarbeit verrichten lassen ...
und dann zusätzliche Anweisungen anhängen (CodeWiederverwendung)?
Abhilfe: Schlüsselwort super
class Kleidung {
protected String farbe;
public void setFarbe (String f) {
farbe = f;
}
public String getFarbe() {
return farbe;
}
public String kennung() {
return "Ich habe die Farbe " +
farbe + " und ";
}
}
© Prof. Dr. Björn Dreher
class Socke extends Kleidung {
public String kennung() {
return super.kennung() +
" ich bin eine Socke!";
}
}
class Hose extends Kleidung {
public String kennung() {
return super.kennung() +
" ich bin eine Hose!";
}
}
99
Programmieren 2 - Java
2 Vererbung
2.4 Methoden überschreiben
Regeln zu super
Entspricht der this-Referenz
super bezeichnet dasselbe Objekt wie this, nur als Typ der Oberklasse
Damit stehen verdeckte Methoden (und verdeckte Attribute) der
Oberklasse zur Verfügung
class Oben {
int i = 1;
void m() { System.out.println("Ich bin Oben"); }
}
class Unten extends Oben {
int i = 2;
void m() {
super.m();
System.out.println("Ich bin Unten");
System.out.println(super.i);
System.out.println(i);
}
}
super ist nicht schachtelbar, um sich entlang der Vererbungshierarchie
nach oben zu hangeln!
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
100
13
2 Vererbung
2.4 Methoden überschreiben
Nicht überschreibbare Methoden
Will man unterbinden, dass ein Entwickler eine Methode in einer
Unterklasse überschreibt und somit neu definiert
Schlüsselwort final vor die Methodendefinition
class Ober {
final void sicher() {
}
}
class Unter extends Ober {
void sicher() { }
}
Compilerfehler!
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
101
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
102
14
2 Vererbung
2.5 Basisklasse Object
Wurzel aller Java-Klassen
Alle Methoden werden geerbt oder
können überschrieben werden
Object
+ getClass(): Class
+ hashCode(): int
+ equals(obj: Object): boolean
+ toString(): String
+ notify(): void
+ notifyAll(): void
+ wait(timeout: long): void
+ wait(timeout: long, nanos: int): void
+ wait(): void
# clone(): Object
# finalize(): void
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
103
2 Vererbung
2.5 Basisklasse Object
public final Class getClass()
Gibt das zugehörige Klassenobjekt zurück
Klassenobjekte repräsentieren jeweils eine Klasse
Meta-Informationen über Objekte, u.a.
Verfügbare Attribute und Methoden
Name der Klasse
Hose meineHose = new Hose();
System.out.println( meineHose.getClass().getName() );
public int hashCode()
Möglichst eindeutige Integerzahl für ein Objekt
Inhaltlich gleiche Objekte (gemäß equals()) müssen denselben Hash
Code liefern
Anwendung: Speichern von Objekten in Hash-Tabellen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
104
15
2 Vererbung
2.5 Basisklasse Object
public String toString()
Identifikation eines jeden Objektes durch eine Zeichenkette
Z.B. Werte der Attribute in lesbarer Form
Neue Klassen sollten diese Methode überschreiben
Wird automatisch aufgerufen, wenn print() oder println() eine
Objektreferenz übergeben bekommen
Sichtbarkeit sollte public bleiben
Standard-Implementation in Object
public String toString() {
return getClass().getName() + "@" +
Integer.toHexString(hashCode());
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
105
2 Vererbung
2.5 Basisklasse Object
public boolean equals(Object obj)
Vergleichsoperator zwischen zwei Objektreferenzen
if (ob1 == obj2) ...
liefert true, wenn beide Referenzen auf dasselbe Objekt zeigen
Prüft nicht inhaltliche Gleichheit:
if (meinName == "Ulli") ...
kann false liefern, auch wenn meinName denselben Stringwert
enthält
Stattdessen:
String meinName = "Ulli";
if (meinName.equals("Ulli")) ...
// liefert true
Vorsicht: Nicht jede Klasse implementiert ihre eigene equals()-Methode
String tut das
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
106
16
2 Vererbung
2.5 Basisklasse Object
equals(), null und hashCode()
Vergleich mit null liefert immer false
if (meinName.equals(null)) ...
// liefert false
Bei Gleichheit via equals() muss auch hashCode() identische Werte
liefern
Bei Point Objekten wird der Hash Code auf der Basis der beiden
Koordinaten berechnet
Folge:
Wird equals() überschrieben, muss meistens auch hashCode()
überschrieben werden
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
107
2 Vererbung
2.5 Basisklasse Object
Eigene Methode clone()
Objekt kann sich selbst klonen
Exakte Kopie von sich selbst
Von Object geerbtes clone(): Flache Kopie
Eigenes clone(): Tiefe Kopie ist möglich
Aufräumen mit finalize()
Aufgerufen, wenn Garbage Collector Objekt entfernen möchte
Freigeben erworbener Ressourcen
Datei schließen
Dynamische Objekte freigeben (nicht unbedingt nötig)
Keine Garantie, dass überhaupt irgendwann aufgerufen wird!
Wenn überschrieben, dann auch immer finalize() der Oberklasse
aufrufen:
super.finalize();
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
108
17
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
109
2 Vererbung
2.6 Polymorphismus
Überschreiben einer Methode (Overriding)
Oberklasse kann einfache Implementierung vorgeben
Unterklasse kann diese durch Überschreiben spezialisieren
Laufzeitumgebung sucht in Klassenhierarchie von unten nach oben
nach passender Methode
Hätte Hose keine kennung(), würde die von Kleidung aufgerufen
class Kleidung {
protected String farbe;
public void setFarbe (String f) {
farbe = f;
}
public String getFarbe() {
return farbe;
}
public String kennung() {
return "Ich habe die Farbe " +
farbe + " und ";
}
}
© Prof. Dr. Björn Dreher
class Socke extends Kleidung {
public String kennung() {
return super.kennung() +
" ich bin eine Socke!";
}
}
class Hose extends Kleidung {
public String kennung() {
return super.kennung() +
" ich bin eine Hose!";
}
}
Programmieren 2 - Java
110
18
2 Vererbung
2.6 Polymorphismus
Polymorphismus durch dynamische Bindung
public class WasIstAllesKleidung {
public static void main(String args[]) {
Kleidung [] kl = new Kleidung[2];
Socke s = new Socke();
s.setFarbe("rot");
Hose h = new Hose();
h.setFarbe("grau");
Wird hier kennung() von
Kleidung oder von Socke bzw.
Hose aufgerufen?
for (int i = 0; i < 2; i++)
System.out.println( kl[i].kennung() );
}
}
Als Voreinstellung werden Methoden in Java dynamisch gebunden
Zur Laufzeit wird festgestellt, zu welcher Klasse das Objekt gehört
Dann wird die zugehörige Methode aufgerufen
In C++: Virtuelle Methoden
© Prof. Dr. Björn Dreher
111
Programmieren 2 - Java
2 Vererbung
2.6 Polymorphismus
Keine dynamische Bindung:
Bei nicht überschreibbaren Methoden
private
static
final
class NoPolymorphismWithPrivate {
public static void main( String args[] ) {
Unter unsicht = new Unter();
System.out.println( unsicht.bar() ); // Å--}
}
Hier wird in bar() furcht() von
class Ober {
private int furcht() { return 2; }
int bar() { return furcht(); }
}
class Unter extends Ober {
int furcht() { return 1; }
}
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
Ober aufgerufen!
furcht() wird statisch gebunden!
Kein Compilerfehler: Unterklasse
weiß nichts von privater
Methode der Oberklasse
112
19
2 Vererbung
2.6 Polymorphismus
Konstruktoren in der Vererbung
Konstruktoren werden nicht vererbt
Zu Beginn eines Konstruktors wird immer automatisch der StandardKonstruktor der Oberklasse aufgerufen:
super();
Initialisiert den geerbten Teil des Objektes
Möglichkeit, einen parametrisierten Konstruktor der Oberklasse aufzurufen:
public GraphObject(double x, double y, String farbe) {
this.x = x;
this.y = y;
this.farbe = new String(farbe);
}
public Kreis(double x, double y, String farbe, double radius){
super(x, y, farbe);
Kreis ist Nachfahre von
this.radius = radius;
GraphObject
}
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
113
Programmieren 2 – Java
Überblick: 2. Vererbung
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Vererbung in Java
Substitutionsprinzip
Methoden überschreiben
Basisklasse Object
Polymorphismus
Abstrakte Klassen
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
114
20
2 Vererbung
2.7 Abstrakte Klassen
Klassen, von der keine Instanzen gebildet werden sollen
Wurzelklasse einer Klassenhierarchie
Kann/soll vielleicht noch nicht voll ausprogrammiert werden
Hält gemeinsame Attribute vor
Realisiert schon voll implementierbare Methoden
Gibt für abstrakte Methoden die Signatur vor
Implementierung liegt bei den Unterklassen
Eine konkrete Unterklasse muss diese Methode implementieren
Wenn nicht, ist auch sie abstrakt
Gegenteil: Konkrete Klasse:
Es können davon Instanzen gebildet werden
© Prof. Dr. Björn Dreher
115
Programmieren 2 - Java
2 Vererbung
2.7 Abstrakte Klassen
Abstrakte Klasse
Basisklasse für Container, der alle Nachfahren enthalten können soll
Wurzel einer is-a Beziehungshierarchie
Gibt Signaturen für Unterklassen vor
Bereits „fertige“ Methoden
abstract class Kleidung {
können hier voll
protected String farbe;
implementiert werden und
public void setFarbe (String
farbe = f;
werden so geerbt
}
Andere Methoden werden
public String getFarbe() {
in Unterklasse überschrieben,
return farbe;
}
wenn sich dort das
public String kennung() {
Verhalten ändert
f) {
return "Ich habe die Farbe " +
farbe + " und ";
}
}
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
116
21
2 Vererbung
2.7 Abstrakte Klassen
Abstrakte Methoden
Methode, die in der (abstrakten) Klasse noch nicht implementiert
werden kann
Besitzt keinen Methodenrumpf
Gibt jedoch bereits Signatur vor
public abstract double flaeche();
Nachfahrenklassen müssen diese Methode implementieren, damit von
ihnen Instanzen erzeugt werden können
Eine Klasse mit mindestens einer abstrakten Methode muss selbst
auch als abstrakt definiert sein
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
117
2 Vererbung
2.7 Abstrakte Klassen
Beispiel
Tier
alter: int
setAlter(a: int): void
istSaeuger(): boolean
ausgabe(): void
Saeugetier
istSaeuger(): boolean
Delphin
Mensch
ausgabe(): void
ausgabe(): void
© Prof. Dr. Björn Dreher
abstract class Tier {
int alter = -1;
void alterSetzen( int a ) {
alter = a; }
abstract boolean istSaeuger();
abstract void ausgabe();
}
abstract class Saeugetier extends Tier {
boolean istSaeuger() { return true; }
}
class Mensch extends Saeugetier {
void ausgabe() {
System.out.println(
"Ich bin ein Mensch" );
}
}
class Delphin extends Saeugetier {
void ausgabe() {
System.out.println(
"Ich bin ein Delphin" );
}
}
Programmieren 2 - Java
118
22
2 Vererbung
2.7 Abstrakte Klassen
Unser Beispiel
Tier m = new Mensch();
Tier d = new Delphin();
Aufgrund des Substitutionsprinzips möglich
Standard-Konstruktor wird aufgerufen
Auch der der Superklasse
Auch wenn sie abstrakt ist
Kann jedoch nicht direkt aufgerufen werden
Tier s = new Saeugetier();
// geht nicht!
Auch Attribute werden initialisiert (alter = -1)!
Aufruf von
m.ausgabe(); d.ausgabe();
liefert
Ich bin ein Mensch
Ich bin ein Delphin
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
119
2 Vererbung
2.7 Abstrakte Klassen
abstract und final ?
abstract: Keine Instanz
final: Keine Vererbung
Widerspruch
Compiler lässt das nicht zu!
© Prof. Dr. Björn Dreher
Programmieren 2 - Java
120
23