Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

PKJ 2005/1 Stefan Dissmann Kritische Betrachtung Bisher implementiert: Listen für Werte des Typs int über Elemente der Klasse intElement Liste für double.

Ähnliche Präsentationen


Präsentation zum Thema: "PKJ 2005/1 Stefan Dissmann Kritische Betrachtung Bisher implementiert: Listen für Werte des Typs int über Elemente der Klasse intElement Liste für double."—  Präsentation transkript:

1 PKJ 2005/1 Stefan 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.

2 PKJ 2005/2 Stefan 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 und anschließend nur an wenigen Stellen spezialisieren.

3 PKJ 2005/3 Stefan Dissmann Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung

4 PKJ 2005/4 Stefan 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 dann Unterklasse von B oder Subklasse von B B heißt dann Oberklasse von A oder Superklasse von A

5 PKJ 2005/5 Stefan Dissmann Vererbung Oberklasse Unterklasse

6 PKJ 2005/6 Stefan 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 }

7 PKJ 2005/7 Stefan 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; }

8 PKJ 2005/8 Stefan 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; }

9 PKJ 2005/9 Stefan 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; } +

10 PKJ 2005/10 Stefan 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.

11 PKJ 2005/11 Stefan Dissmann Vererbung Person Kunde

12 PKJ 2005/12 Stefan Dissmann Vererbung Was bringt Vererbung?

13 PKJ 2005/13 Stefan Dissmann Vererbung Was bringt Vererbung? verringerten Schreibaufwand Gleichförmigkeit reduzierten Änderungsaufwand vereinfachtes Testen aber auch: ständiges Beachten der gegenseitigen Abhängigkeiten

14 PKJ 2005/14 Stefan 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.

15 PKJ 2005/15 Stefan 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; }

16 PKJ 2005/16 Stefan 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; }

17 PKJ 2005/17 Stefan 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; }

18 PKJ 2005/18 Stefan 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; }

19 PKJ 2005/19 Stefan 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; }

20 PKJ 2005/20 Stefan 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; }

21 PKJ 2005/21 Stefan 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 beide Versionen von toString() zu unterscheiden?

22 PKJ 2005/22 Stefan 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; }

23 PKJ 2005/23 Stefan 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.

24 PKJ 2005/24 Stefan Dissmann Erweiterung der Klasse Kunde Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird.

25 PKJ 2005/25 Stefan 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.

26 PKJ 2005/26 Stefan 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 nutzen Unterklassen dürfen zugreifen, andere Klassen nicht!

27 PKJ 2005/27 Stefan 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; }

28 PKJ 2005/28 Stefan 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; }

29 PKJ 2005/29 Stefan 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(…)

30 PKJ 2005/30 Stefan 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());

31 PKJ 2005/31 Stefan 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());

32 PKJ 2005/32 Stefan 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);

33 PKJ 2005/33 Stefan 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);

34 PKJ 2005/34 Stefan 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

35 PKJ 2005/35 Stefan Dissmann Referenzen auf Ober- und Unterklassen Folgerung: Da jede öffentliche Methode der Oberklasse auch von jeder Unterklasse bereitgestellt wird, darf eine Referenz der Oberklasse auf Objekte einer Unterklasse verweisen.

36 PKJ 2005/36 Stefan 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());

37 PKJ 2005/37 Stefan 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.

38 PKJ 2005/38 Stefan 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.

39 PKJ 2005/39 Stefan 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.

40 PKJ 2005/40 Stefan 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?

41 PKJ 2005/41 Stefan 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.

42 PKJ 2005/42 Stefan Dissmann Vererbung Person Kunde Aufruf einer Methode

43 PKJ 2005/43 Stefan 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.

44 PKJ 2005/44 Stefan 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

45 PKJ 2005/45 Stefan 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.

46 PKJ 2005/46 Stefan Dissmann Referenzen auf Ober- und Unterklassen Wofür das Ganze?

47 PKJ 2005/47 Stefan 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.

48 PKJ 2005/48 Stefan 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.

49 PKJ 2005/49 Stefan Dissmann Referenzen auf Ober- und Unterklassen Beispiel: public class Lieferant extends Person { … }

50 PKJ 2005/50 Stefan Dissmann Referenzen auf Ober- und Unterklassen Beispiel: public class Lieferant extends Person { … } Lieferant ist eine weitere Unterklasse von Person.

51 PKJ 2005/51 Stefan Dissmann Unterklassen von Unterklassen Beispiel: public class Goldkunde extends Kunde { private String geschenk; … }

52 PKJ 2005/52 Stefan 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

53 PKJ 2005/53 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant

54 PKJ 2005/54 Stefan 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!)

55 PKJ 2005/55 Stefan 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!

56 PKJ 2005/56 Stefan Dissmann Anmerkungen zum Vererbungskonzept Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object : public class Person extends Object { … }

57 PKJ 2005/57 Stefan Dissmann Anmerkungen zur Syntax Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object : public class Person extends Object { … } Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object !

58 PKJ 2005/58 Stefan Dissmann Anmerkungen zum Vererbungskonzept Jede selbst definierte Klasse hat eine explizite Oberklasse oder die 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.

59 PKJ 2005/59 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object


Herunterladen ppt "PKJ 2005/1 Stefan Dissmann Kritische Betrachtung Bisher implementiert: Listen für Werte des Typs int über Elemente der Klasse intElement Liste für double."

Ähnliche Präsentationen


Google-Anzeigen