PKJ 2005/1Stefan Dissmann
Kritische Betrachtung
Bisher implementiert:Listen für Werte des Typs intüber Elemente der Klasse intElement
• Liste für double • Liste für Studierende• Liste von Listen von int
erfordern jeweils neue, fast identische Implementierung der Klassen für Elemente und Liste.
PKJ 2005/2Stefan Dissmann
Kritische Betrachtung (Fortsetzung)
Analyse:• Elemente haben immer Referenzen auf Nachfolger (und
Vorgänger).• Liste verknüpft, löscht und durchläuft immer Elemente.
• Elemente unterscheiden sich im Typ der abgelegten Werte.• Liste benötigt möglicherweise typspezifische Vergleiche.
Idee:Elemente und Liste allgemein formulieren undanschließend nur an wenigen Stellen spezialisieren.
PKJ 2005/3Stefan Dissmann
Vererbung
Spezialisierung von Klassen in JAVA möglich durch
Konzept der Vererbung
PKJ 2005/4Stefan Dissmann
Vererbung
Wenn eine Klasse A die Klasse B spezialisiert,also die Klasse A von der Klasse B erbt,übernimmt sie alle Attribut- und Methoden-Deklarationen von
B.
A heißt dannUnterklasse von B oder Subklasse von B
B heißt dannOberklasse von A oder Superklasse von A
PKJ 2005/5Stefan Dissmann
Vererbung
Oberklasse
Unterklasse
PKJ 2005/6Stefan Dissmann
Vererbung
Beispiel:
public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname }}
PKJ 2005/7Stefan Dissmann
Vererbung
Beispiel:
public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person {{ private int nummer;}
PKJ 2005/8Stefan Dissmann
Vererbung
Beispiel:
public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer;}
PKJ 2005/9Stefan Dissmann
Vererbung
Beispiel:
public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer;}
+
PKJ 2005/10Stefan Dissmann
Vererbung
public class Kunde extends Person {{ private int nummer;}
bedeutet:• Kunde wird als Unterklasse von Person definiert.• Person wird dadurch Oberklasse von Kunde.• Kunde hat geerbt:
• die öffentliche Methode toString,• die privaten Attribute name, vorname und wohnort.
• In Kunde wird definiert:• das private Attribut nummer.
PKJ 2005/11Stefan Dissmann
Vererbung
Person
Kunde
PKJ 2005/12Stefan Dissmann
Vererbung
Was bringt Vererbung?
PKJ 2005/13Stefan Dissmann
Vererbung
Was bringt Vererbung?
• verringerten Schreibaufwand• Gleichförmigkeit• reduzierten Änderungsaufwand• vereinfachtes Testen
aber auch:
• ständiges Beachten der gegenseitigen Abhängigkeiten
PKJ 2005/14Stefan Dissmann
Fragen
Was geht wie in der Klasse Kunde?
• Zugriff auf die geerbten privaten Attribute name, vorname und wohnort,
• z.B. Definition eines Konstruktors für alle vier Attribute,• z.B. gemeinsamer Text aus einigen Attributen,• z.B. gemeinsamer Text aus allen Attributen,• Zulässigkeit von Referenzen auf Ober- und Unterklasse.
PKJ 2005/15Stefan Dissmann
Vererbung – Konstruktor in Unterklasse
Beispiel:public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer;}
PKJ 2005/16Stefan Dissmann
Vererbung – Konstruktor in Unterklasse
Beispiel:public class Person { private String name, vorname; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { name = n; vorname = v; wohnort = w; nummer = n; } }
PKJ 2005/17Stefan Dissmann
Vererbung – Konstruktor in Unterklasse
Beispiel:public class Person { private String name, vorname; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { name = n; nicht erlaubt, da private in Oberklasse vorname = v; nicht erlaubt, da private in Oberklasse wohnort = w; nicht erlaubt, da private in Oberklasse nummer = n; } }
PKJ 2005/18Stefan Dissmann
Vererbung – Konstruktor in Unterklasse
Beispiel:public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); Aufruf des Konstruktors erlaubt, da
public nummer = n; } }
PKJ 2005/19Stefan Dissmann
Vererbung – Texterzeugung in Unterklasse
Beispiel:public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; …} public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; } public String ???() { return ??? + ", " + nummer; } }
PKJ 2005/20Stefan Dissmann
Vererbung – Texterzeugung Version 1
Beispiel:public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; } public String zuText() { return toString() + ", " + nummer; } }
PKJ 2005/21Stefan Dissmann
Vererbung – Texterzeugung Version 2
Fragen:
• Ist Überdefinieren einer Methode in der Unterklasse möglich,also toString() in Ober und Unterklasse?
• Und: Wie wird dann der Namenskonflikt gelöst, um beideVersionen von toString() zu unterscheiden?
PKJ 2005/22Stefan Dissmann
Vererbung – toString in Unterklasse
Beispiel:public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; … } public String toString() { return name + ", " + vorname }}
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; } public String toString() { return super.toString() + ", " + nummer; } }
PKJ 2005/23Stefan Dissmann
Vererbung – toString in Unterklasse
Zusammenfassung:
•super(…) bezeichnet den Konstruktor der Oberklasse.
•Überdefinieren von Methoden in Unterklassen ist möglich.
•super. … erlaubt den Zugriff auf Komponenten der Oberklasse.
PKJ 2005/24Stefan Dissmann
Erweiterung der Klasse Kunde
Problem:Gewünscht ist Methode in Kunde, die wohnort ändern kann,wenn zugleich die richtige Kundenummer angegeben wird.
PKJ 2005/25Stefan Dissmann
Erweiterung der Klasse Kunde
Problem:Gewünscht ist Methode in Kunde, die wohnort ändern kann,wenn zugleich die richtige Kundenummer angegeben wird.
Lösung:Erweiterung der Klasse Person um die Methoden gibOrt() und setzeOrt(String w)
aber:Nur die Unterklasse soll Änderung durchführen können,daher private zu wenig und public zuviel.
PKJ 2005/26Stefan Dissmann
Erweiterung der Klasse Kunde
Problem:Gewünscht ist Methode in Kunde, die wohnort ändern kann,wenn zugleich die richtige Kundenummer angegeben wird.
Lösung:Erweiterung der Klasse Person um die Methoden gibOrt() und setzeOrt(String w)
daher:Zugriffsrecht protected nutzenUnterklassen dürfen zugreifen, andere Klassen nicht!
PKJ 2005/27Stefan Dissmann
Überarbeitete Klasse Person
Beispiel:
public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname } public String gibOrt() { return wohnort; } protected void setzeOrt(String w) { wohnort = w; }}
PKJ 2005/28Stefan Dissmann
Überarbeitete Klasse Kunde
Beispiel:
public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v); nummer = n; } public String toString() { return super.toString() + ", " + nummer; } public aendereOrt(int n, String w) { if (nummer == n) wohnort = w; } }
PKJ 2005/29Stefan Dissmann
Überarbeitete Klassen
Zusammenfassung:
•Person erlaubt nur Objekten von erbenden Klassen das Setzen des Ortes:
protected void setzeOrt(…)
• Kunde erlaubt allen Objekten das Ändern des Ortes, sofern die richtige Kundennummer angegeben wird:
public void aendereOrt(…)
PKJ 2005/30Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
// Methoden in beiden Klassen vereinbart
System.out.println(p.toString());
System.out.println(k.toString());
PKJ 2005/31Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
// Methoden in beiden Klassen vereinbart
System.out.println(p.toString());
System.out.println(k.toString());
// Methode aus Person vererbt
System.out.println(p.gibOrt());
System.out.println(k.gibOrt());
PKJ 2005/32Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
// Methoden in beiden Klassen vereinbart
System.out.println(p.toString());
System.out.println(k.toString());
// Methode aus Person vererbt
System.out.println(p.gibOrt());
System.out.println(k.gibOrt());
// Methode nur in Kunde
k.aendereOrt(103, “Unna“);
PKJ 2005/33Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
// Methoden in beiden Klassen vereinbart
System.out.println(p.toString());
System.out.println(k.toString());
// Methode aus Person vererbt
System.out.println(p.gibOrt());
System.out.println(k.gibOrt());
// Methode nur in Kunde
k.aendereOrt(103, “Unna“);
PKJ 2005/34Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
// Methoden in beiden Klassen vereinbart
System.out.println(p.toString());
System.out.println(k.toString());
// Methode aus Person vererbt
System.out.println(p.gibOrt());
System.out.println(k.gibOrt());
// Methode nur in Kunde
k.aendereOrt(103, “Unna“);
p k
PKJ 2005/35Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Folgerung:
Da jede öffentliche Methode der Oberklasseauch von jeder Unterklasse bereitgestellt wird,
darf eine Referenz der Oberklasse auf Objekte einer Unterklasse verweisen.
PKJ 2005/36Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
p.aendereOrt(103, “Unna“);
System.out.println(p.gibOrt());
System.out.println(p.toString());
PKJ 2005/37Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
p.aendereOrt(103, “Unna“);
System.out.println(p.gibOrt());
System.out.println(p.toString());
Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.
PKJ 2005/38Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
p.aendereOrt(103, “Unna“);
System.out.println(p.gibOrt());
System.out.println(p.toString());
Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.
PKJ 2005/39Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
p.aendereOrt(103, “Unna“);
System.out.println(p.gibOrt());
System.out.println(p.toString());
Unproblematisch, da in Person definiert und in Kunde nur geerbt.
PKJ 2005/40Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
p.aendereOrt(103, “Unna“);
System.out.println(p.gibOrt());
System.out.println(p.toString());
In Person definiert und in Kunde geerbt und überdefiniert, so dass zwei Versionen von toString() bereit stehen.Welche Version wird ausgeführt?
PKJ 2005/41Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
p.aendereOrt(103, “Unna“);
System.out.println(p.gibOrt());
System.out.println(p.toString());
Welche Version wird ausgeführt?Das Objekt entscheidet, nicht die Referenz:Da hier ein Kunde-Objekt, wird toString() aus Kunde aufgerufen.
PKJ 2005/42Stefan Dissmann
Vererbung
Person
Kunde
Aufruf einer Methode
PKJ 2005/43Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Zusammenfassung:
• Der Typ der Referenz bestimmt, welche Methoden über diese Referenz überhaupt aufgerufen werden dürfen.
• Wenn eine Methode über eine Referenz aufgerufen werden kann, dann wird immer die in oder am nächsten vor der Klasse des Objekts definierte Version ausgeführt.
PKJ 2005/44Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Zusammenfassung:
• Der Typ der Referenz bestimmt, welche Methoden über diese Referenz überhaupt aufgerufen werden dürfen.
• Wenn eine Methode über eine Referenz aufgerufen werden kann, dann wird immer die in oder am nächsten vor der Klasse des Objekts definierte Version ausgeführt.
Polymorphie
PKJ 2005/45Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel – es geht auch wieder zurück:
Person p = new Person (“Meier“, “Jana“, “Dortmund“);
Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103);
p = k;
System.out.println(p.gibOrt());
System.out.println(p.toString());
k = (Kunde)p;
expliziter Type-Cast:Der Programmierer versichert dem Programm, dass p auf ein Objekt der Klasse Kunde verweist.
PKJ 2005/46Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Wofür das Ganze?
PKJ 2005/47Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Wofür das ganze Referenzierungskonzept?
Es lassen sich Algorithmen formulieren, die nicht wissen müssen, mit welcher Art von Unterklassen-Objekten sie bei der Ausführung tatsächlich umgehen.
Beispiel: Liste, die nicht weiß, ob int-Werte oder Kunden-Objekte aufgelistet werden.
PKJ 2005/48Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Wofür das ganze Referenzierungskonzept?
Es lassen sich Algorithmen formulieren, die nicht wissen müssen, mit welcher Art von Unterklassen-Objekten sie bei der Ausführung tatsächlich umgehen.
Und: Objekte verschiedener Klassen können gemeinsam verarbeitet werden.
Beispiel:Objekte der Klassen Kunde und Lieferant bei Weihnachtsgrüßen.
PKJ 2005/49Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
public class Lieferant extends Person { …}
PKJ 2005/50Stefan Dissmann
Referenzen auf Ober- und Unterklassen
Beispiel:
public class Lieferant extends Person { …}
Lieferant ist eine weitere Unterklasse von Person.
PKJ 2005/51Stefan Dissmann
Unterklassen von Unterklassen
Beispiel:
public class Goldkunde extends Kunde { private String geschenk; …}
PKJ 2005/52Stefan Dissmann
Unterklassen von Unterklassen
Beispiel:
public class Goldkunde extends Kunde { private String geschenk; …}
Goldkunde ist jetzt:• (direkte) Unterklasse von Kunde und zugleich• eine weitere Unterklasse von Person
PKJ 2005/53Stefan Dissmann
Klassenhierarchie
Person
Kunde
Goldkunde
Lieferant
PKJ 2005/54Stefan Dissmann
Anmerkungen zum Vererbungskonzept
Jede Klasse hat höchstens eine Oberklasse:
public class Goldkunde extends Kunde { private String geschenk; …}
(Die Syntax erlaubt hier keine Liste!)
PKJ 2005/55Stefan Dissmann
Anmerkungen zum Vererbungskonzept
Jede Klasse hat höchstens eine Oberklasse:
public class Goldkunde extends Kunde { private String geschenk; …}
(Die Syntax erlaubt hier keine Liste!)
Es entstehen immer Vererbungsbäume!
PKJ 2005/56Stefan Dissmann
Anmerkungen zum Vererbungskonzept
Jede selbst definierte Klasse hat eine explizite Oberklasse oderdie implizite Oberklasse Object:
public class Person extends Object { …}
PKJ 2005/57Stefan Dissmann
Anmerkungen zur Syntax
Jede selbst definierte Klasse hat eine explizite Oberklasse oderdie implizite Oberklasse Object:
public class Person extends Object { …}
Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object!
PKJ 2005/58Stefan Dissmann
Anmerkungen zum Vererbungskonzept
Jede selbst definierte Klasse hat eine explizite Oberklasse oderdie implizite Oberklasse Object:
public class Person extends Object { …}
Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object!
Referenzen der Klasse Object können auf jedes Objekt verweisen.
PKJ 2005/59Stefan Dissmann
Klassenhierarchie
Person
Kunde
Goldkunde
Lieferant
Object