PKJ 2005/1 Stefan Dissmann Kritische Betrachtung Bisher implementiert: Listen für Werte des Typs...

Post on 05-Apr-2015

105 views 0 download

Transcript of PKJ 2005/1 Stefan Dissmann Kritische Betrachtung Bisher implementiert: Listen für Werte des Typs...

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