Programmieren 2 – Java Überblick Programmieren 2 – Java

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