Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

PRJ 2007/1 Stefan Dissmann Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung.

Ähnliche Präsentationen


Präsentation zum Thema: "PRJ 2007/1 Stefan Dissmann Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung."—  Präsentation transkript:

1 PRJ 2007/1 Stefan Dissmann Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung

2 PRJ 2007/2 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

3 PRJ 2007/3 Stefan Dissmann Vererbung Oberklasse Unterklasse

4 PRJ 2007/4 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 }

5 PRJ 2007/5 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; }

6 PRJ 2007/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 } public class Kunde extends Person { private int nummer; }

7 PRJ 2007/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 PRJ 2007/8 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.

9 PRJ 2007/9 Stefan Dissmann Vererbung Person Kunde

10 PRJ 2007/10 Stefan Dissmann Vererbung Was bringt Vererbung?

11 PRJ 2007/11 Stefan Dissmann Vererbung Was bringt Vererbung? verringerten Schreibaufwand Gleichförmigkeit + Gleichbehandlung reduzierten Änderungsaufwand vereinfachtes Testen aber auch: ständiges Beachten der gegenseitigen Abhängigkeiten

12 PRJ 2007/12 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.

13 PRJ 2007/13 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; }

14 PRJ 2007/14 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; }

15 PRJ 2007/15 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; }

16 PRJ 2007/16 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; }

17 PRJ 2007/17 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; }

18 PRJ 2007/18 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; }

19 PRJ 2007/19 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?

20 PRJ 2007/20 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; }

21 PRJ 2007/21 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.

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

23 PRJ 2007/23 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.

24 PRJ 2007/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. 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!

25 PRJ 2007/25 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; }

26 PRJ 2007/26 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) setzeOrt(w); }

27 PRJ 2007/27 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(…)

28 PRJ 2007/28 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());

29 PRJ 2007/29 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());

30 PRJ 2007/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()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, Unna);

31 PRJ 2007/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()); // Methode nur in Kunde k.aendereOrt(103, Unna);

32 PRJ 2007/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); p k

33 PRJ 2007/33 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.

34 PRJ 2007/34 Stefan Dissmann Referenzen auf Ober- und Unterklassen Beispiel: Person p; Kunde k = new Kunde (Schmidt, Axel, Bochum, 103); p = k; p.aendereOrt(103, Unna); System.out.println(p.gibOrt()); System.out.println(p.toString());

35 PRJ 2007/35 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.

36 PRJ 2007/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()); Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.

37 PRJ 2007/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()); Unproblematisch, da in Person definiert und in Kunde nur geerbt.

38 PRJ 2007/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()); In Person definiert und in Kunde geerbt und überdefiniert, so dass zwei Versionen von toString() bereit stehen. Welche Version wird ausgeführt?

39 PRJ 2007/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()); Welche Version wird ausgeführt? Das Objekt entscheidet, nicht die Referenz: Da hier ein Kunde -Objekt, wird toString() aus Kunde aufgerufen.

40 PRJ 2007/40 Stefan Dissmann Vererbung Person Kunde Aufruf einer Methode

41 PRJ 2007/41 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.

42 PRJ 2007/42 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

43 PRJ 2007/43 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.

44 PRJ 2007/44 Stefan Dissmann Referenzen auf Ober- und Unterklassen Wofür das Ganze?

45 PRJ 2007/45 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.

46 PRJ 2007/46 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.

47 PRJ 2007/47 Stefan Dissmann Referenzen auf Ober- und Unterklassen Beispiel: public class Lieferant extends Person { … }

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

49 PRJ 2007/49 Stefan Dissmann Unterklassen von Unterklassen Beispiel: public class Goldkunde extends Kunde { private String geschenk; … }

50 PRJ 2007/50 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

51 PRJ 2007/51 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant

52 PRJ 2007/52 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!)

53 PRJ 2007/53 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!

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

55 PRJ 2007/55 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 !

56 PRJ 2007/56 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.

57 PRJ 2007/57 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object


Herunterladen ppt "PRJ 2007/1 Stefan Dissmann Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung."

Ähnliche Präsentationen


Google-Anzeigen