Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Vererbungskonzepte in Java

Ähnliche Präsentationen


Präsentation zum Thema: "Vererbungskonzepte in Java"—  Präsentation transkript:

1 Vererbungskonzepte in Java
Ahmad-Nessar Nazar Vererbungskonzepte in Java Walther-Rathenau-Gewerbeschule Nazar

2 Ein UML-Klassendiagramm
Ahmad-Nessar Nazar Ein UML-Klassendiagramm Schulklasse 0..1 0..1 Klassenraum Freizeitraum 1..* 0..1 0..1 * 0..1 1 0..1 unterrichtet Kurs Klassenlehrer 1 1 * Schulgebäude 1 1..5 1..32 1..32 Lehrer Schüler 1 1..* * * 1..5 1..* Hausmeister 0..* * * * 1 1 Sekretärin 1..* 1 Schulleiter 1..* Lehrerzimmer 1 Walther-Rathenau-Gewerbeschule Nazar

3 Ein UML-Klassendiagramm
Ahmad-Nessar Nazar Ein UML-Klassendiagramm Schulklasse 0..1 0..1 Klassenraum Freizeitraum 1..* 0..1 0..1 * 0..1 1 0..1 unterrichtet Kurs Klassenlehrer 1 1 * Schulgebäude 1 1..5 1..32 1..32 Lehrer Schüler 1 1..* * * 1..5 1..* Hausmeister 0..* * * * 1 1 Sekretärin 1..* 1 Schulleiter 1..* Lehrerzimmer 1 Walther-Rathenau-Gewerbeschule Nazar

4 Vererbung (Generalisierung)
Ahmad-Nessar Nazar Vererbung (Generalisierung) Klassenraum, Freieitraum und Lehrerzimmer erben die Eigenschaft raumNr der Klasse Raum... Raum Generalisierung (Superklasse) + raumNr: int Spezialisierungen (Subklassen) Klassenraum Freizeitraum Lehrerzimmer - typ: String - spiele: ArrayList - anzFach: int Walther-Rathenau-Gewerbeschule Nazar

5 Umsetzung in Java Ahmad-Nessar Nazar Walther-Rathenau-Gewerbeschule

6 Ein UML-Klassendiagramm
Ahmad-Nessar Nazar Ein UML-Klassendiagramm Schulklasse 0..1 0..1 Klassenraum Freizeitraum 1..* 0..1 0..1 * 0..1 1 0..1 unterrichtet Kurs Klassenlehrer 1 1 * Schulgebäude 1 1..5 1..32 1..32 Lehrer Schüler 1 1..* * * 1..5 1..* Hausmeister 0..* * * * 1 1 Sekretärin 1..* 1 Schulleiter 1..* Lehrerzimmer 1 Walther-Rathenau-Gewerbeschule Nazar

7 Vererbung (Generalisierung)
Ahmad-Nessar Nazar Vererbung (Generalisierung) Person + name: String Schulleiter Sekretärin Schüler Hausmeister Lehrer - schularten: Set - klasse:String - bereich:String - deputat: int Walther-Rathenau-Gewerbeschule Nazar

8 Vererbung (Generalisierung)
Ahmad-Nessar Nazar Vererbung (Generalisierung) Auslagern von Gemeinsamkeiten in eine Superklasse (Generalisierung). Jede Subklasse erbt i.d.R alle nicht privaten Eigenschaften (Attribute) und Methoden der Superklasse. Jede Subklasse kann zudem weitere Attribute und Methoden definieren (Spezialisierung). Einige offensichtliche Vorteile: Vermeidung von Code-Duplizierung einfache Wartung schnelle Erweiterbarkeit Wird eine Klasse als final class deklariert, so kann von ihr nicht geerbt werden. Walther-Rathenau-Gewerbeschule Nazar

9 Vererbung (Generalisierung)
Ahmad-Nessar Nazar Vererbung (Generalisierung) Vererbungen sind spezielle Beziehungen („ist-ein“-Beziehungen). In Java kann eine Klasse kann nur von einer Klasse direkt erben (Einfachvererbung). In Java wird Vererbung zwischen zwei Klassen durch das Schlüsselwort extends ausgedrückt: Fehlt bei einer Klassendeklaration das Schlüsselwort extends, so ist automatisch die Klasse java.lang.Object die Superklasse. Eigenschaften und Verhalten können über mehrere Generationen vererbt werden (Vererbungshierarchien). Konstruktoren werden nicht vererbt. public class Subklasse extends Superklasse{....} Walther-Rathenau-Gewerbeschule Nazar

10 Vererbungshierarchie
Ahmad-Nessar Nazar Vererbungshierarchie Object Fahrzeug LKW PKW Motorrad Fahrrad Walther-Rathenau-Gewerbeschule Nazar

11 Ahmad-Nessar Nazar Aufgabe 1 (20 Minuten) Entwerfen Sie ein UML-Klassendiagramm für die Verwaltung von Ländern, Städten, Flüssen, Seen und Meeren. Ein Land besitzt mehrere Städte. Ein Stadt liegt in einem Land. Jede Stadt kann an einem oder mehreren Seen/Flüssen liegen. Außerdem kann eine Stadt auch an mehreren Meeren angrenzen. Zu jedem Land soll zudem der Name, der Ländercode, die Einwohnerzahl und die Fläche erfasst werden. Auch zu jeder Stadt ist der Name, die Einwohnerzahl, die Längen- und die Breitengrade zu verwalten. An Seen und Meeren interessiert in erster Linie die Tiefe. Außerdem ist interessant, um welche Art von Meer oder See es sich handelt. An Flüssen interessiert neben der Länge vorallem deren Zuflüsse. Außerdem möchte man für jeden der drei Gewässer wissen, welche Städte bzw. welche Länder an ihnen angrenzen. Walther-Rathenau-Gewerbeschule Nazar

12 Ahmad-Nessar Nazar Lösungsvorschlag Aufgabe: Überführen Sie dieses Diagramm in Java. Erzeugen Sie einige Objekte... rekursive Beziehung Walther-Rathenau-Gewerbeschule Nazar

13 Ahmad-Nessar Nazar Aufgabe 2 (30 Minuten) Überführen Sie das Diagramm aus der letzten Folie in Java. Erzeugen Sie ein paar Länder, Städte, Meere und Flüsse. Programmieren Sie eine Methode public double getSumLength() in der Klasse Fluss der die Länge des Fluss addiert mit der Länge aller seiner Zuflüsse zurückgibt. Verwenden Sie Rekursion. Testen Sie die Methode! Walther-Rathenau-Gewerbeschule Nazar

14 Vererbungen drücken ist-ein-Beziehungen aus
Ahmad-Nessar Nazar Vererbungen drücken ist-ein-Beziehungen aus Ein Fahrzeug ist ein Object Ein LKW ist ein Fahrzeug Ein PKW ist ein Fahrzeug Objekte von Subtypen können statt Objekte von Super- typen eingestzt werden: Umgekehrt aber gilt nicht: => Object fahrzeug = new Fahrzeug(); Fahrzeug lkw = new LKW(); Fahrzeug pkw = new PKW(); Object str = new String(“Hallo“); Fahrzeug fahrzeug = new Object(); LKW lkw = new Fahrzeug(); PKW pkw = new Fahrzeug(); Walther-Rathenau-Gewerbeschule Nazar

15 Referenztypen sind nicht änderbar
Ahmad-Nessar Nazar Referenztypen sind nicht änderbar Auf Objekte werden über Referenzvariablen zugegriffen. Der Typ einer Referenzvariablen darf nach der Deklaration nicht mehr geändert werden. Das Objekt, das von einer Referenzvariable referenziert wird, kann aber nachträglich ersetzt werden: Der Referenztyp (Typ einer Referenzvariable) legt fest, welche Methoden des zugehörigen Objekts aufgerufen werden können (siehe nächste Folie) LKW lkw = new LKW(); Fahrzeug lkw = new LKW(); Fahrzeug fzg = new Fahrzeug(); fzg = new LKW(); Walther-Rathenau-Gewerbeschule Nazar

16 Referenztypen legen die Methodenauswahl fest
Ahmad-Nessar Nazar Referenztypen legen die Methodenauswahl fest Fahrzeug fzg = new Fahrzeug(); fzg = new LKW(); fzg.beschleunige(70); //Aufruf einer Fahrzeug-Methode Obwohl im obigen Beispiel fzg ein LKW-Objekt zugewiesen wird, überwacht der Compiler, dass auf fzg nur die Methoden aufgerufen werden, die in der Klasse Fahrzeug oder in Supertypen davon definiert wurden. Der Referenztyp Fahrzeug legt damit die Methodenauswahl fest! Obwohl fzg ein LKW-Objekt ist, können aufgrund seines Referenztyps Fahrzeug nur die Methoden auf fzg aufgerufen werden, die in der Klasse Fahrzeug definiert sind. Besitzt allerdings die LKW-Klasse eine exakt gleichnamige Methode namens beschleunige mit denselben Parametertypen und Rückgabetyp, so wird zur Laufzeit die beschleunige-Methode der LKW-Klasse aufgerufen (→ polymorpher Methodenaufruf)! Walther-Rathenau-Gewerbeschule Nazar

17 Polymorpher Methodenaufruf
Ahmad-Nessar Nazar Polymorpher Methodenaufruf Dynamisches Binden: Zur Laufzeit wird geschaut, welches Objekt fzg tatsächlich entspricht. Es wird dann die Passende Methode aufgerufen. Ausgabe: Walther-Rathenau-Gewerbeschule Nazar

18 Vorteile der Polymorphismus
Ahmad-Nessar Nazar Vorteile der Polymorphismus Höhere flexibilität durch dynamisches Binden. Einfache Programmlogik => Wartungsaufwand wird reduziert. ohne Polymorphismus mit Polymorphismus LKW beschleunigeLKW() beschleunige() PKW beschleunigePKW() ... Walther-Rathenau-Gewerbeschule Nazar

19 Ahmad-Nessar Nazar Polymorphe Variablen Objekte von Subtypen können statt Objekte von Super- typen eingestzt werden: Die Variable fahrzeug ist polymorph (vielseitig). Sie kann Objekte verschiedener Typen (z. B. LKW- oder PKW-Objekte) repräsentieren (referenzieren) Walther-Rathenau-Gewerbeschule Nazar

20 Up- and Downcasts Fahrzeug fzg = new LKW();
Ahmad-Nessar Nazar Up- and Downcasts Bisher können auf fzg nur Methoden die in der Klasse Fahrzeug definiert sind, aufgerufen werden. Möchte man aber eine LKW-spezifische Methode aufrufen, muss fzg explizit wieder in ein LKW-Objekt gecastet (Downcast) werden: Fahrzeug fzg = new LKW(); //ist implizit ein Upcast! Ein Upcast kann aber auch (unnötigerweise) explizit geschehen: Fahrzeug fzg = (Fahrzeug) new LKW(); Fahrzeug fzg = new LKW(); LKW lkw = (LKW) fzg; //Downcast nach LKW lkw.showLadeRaumGröße(); Walther-Rathenau-Gewerbeschule Nazar

21 Der instanceof-Operator
Ahmad-Nessar Nazar Der instanceof-Operator Mithilfe des instanceof-Operators kann der tatsächliche Referenztyp eine Variable ermittelt werden: Walther-Rathenau-Gewerbeschule Nazar

22 Der instanceof-Operator
Ahmad-Nessar Nazar Der instanceof-Operator Der instanceof-Test ist hier optional, schützt aber im Allgemeinen vor unerwarteten ClassCastException's Walther-Rathenau-Gewerbeschule Nazar

23 Methoden überschreiben (Overriding)
Ahmad-Nessar Nazar Methoden überschreiben (Overriding) In einer Subklasse können geerbte Methoden der Superklasse überschrieben werden, sofern diese in der Superklasse nicht mit dem Schlüsselwort final deklariert wurden. Der Name, der Rückgabetyp (Ausnahme covariant-Rückgabetypen, siehe nächste Folie) und die Parametertypen der überschriebenen Methoden müssen mit denen der Orginalmethoden in der Superklasse übereinstimmen. Konstruktoren können nicht überschrieben werden, weil sie nicht vererbt werden! Walther-Rathenau-Gewerbeschule Nazar

24 Kovariante Rückgabetypen
Ahmad-Nessar Nazar Kovariante Rückgabetypen Im folgenden Ausnahmefall (ab Java 5 möglich) kann der Rückgabetyp der überschrieben Methode von der geerbten Methode ausweichen: Wenn der Rückgabetyp der überschriebenen Methode ein Untertyp (Subtyp) der geerbten Methode ist (kovariant). Alles OK, weil String ist ein Subtyp von Object ist. Walther-Rathenau-Gewerbeschule Nazar

25 Ahmad-Nessar Nazar final-Methoden final deklarierte Methoden werden zwar geerbt, sie dürfen aber nicht überschrieben werden! Kompilerfehler, weil die Methode geerbt ist, aber nicht überschrieben werden darf! Walther-Rathenau-Gewerbeschule Nazar

26 private-Methoden private deklarierte Methoden werden nicht geerbt!
Ahmad-Nessar Nazar private-Methoden private deklarierte Methoden werden nicht geerbt! Das ist keine überschriebene, sondern eine eigene Methode der Klasse B! Walther-Rathenau-Gewerbeschule Nazar

27 Zugriffsmodifikatoren
Ahmad-Nessar Nazar Zugriffsmodifikatoren Zugriffsmodifikatoren legen die Zugänglichkeit der Objektmitglieder fest. Es gibt die folgenden Zugriffsmodifikatoren: public (keine Einschränkung bei der Sichbarkeit) default (Defaultsichbarkeit: innerhalb des Packages sichbar) protected (innerhalb des Packages und in Subklassen sichtbar) private (nur innerhalb der Klasse sichtbar) public hat die größte Zugänglichkeitsstufe und private die niedrigste! Fehlt die Angabe eines Zugriffsmodifikators, so hat die Variable oder die Methode automatisch die Defaultsichtbarkeit. default ist kein Java-Schlüsselwort! Walther-Rathenau-Gewerbeschule Nazar

28 Zugriffsmodifikatoren und Overriding
Ahmad-Nessar Nazar Zugriffsmodifikatoren und Overriding Die Zugänglichkeit einer überschriebenen Methode darf nicht geringer sein als die der zugehörigen Methode in der Superklasse. Kompilerfehler, weil private restriktiver ist als public. Zur Laufzeit wird die showData()-Methode der LKW-Klasse ausgeführt. Da f aber als Fahrzeug deklariert ist, kann es nicht auf die showData()- Methode zugreifen. Walther-Rathenau-Gewerbeschule Nazar

29 Overriding und Exception's
Ahmad-Nessar Nazar Overriding und Exception's Überschriebene Methode dürfen keine neuen oder ristriktiveren Exceptions werfen als die ursprünglichen Methoden. Mit restriktiv ist gemeint, dass die geworfenen Exceptions der überschriebenen Methoden in der Vererbungshierarchie nicht vor (aber durchaus nach) dem Exceptiontyp der ursprünglichen Methode vorkommen dürfen. IOException kommt in der Vererbungshierarchie vor dem FileNotFoundException ist damit restriktiver! Walther-Rathenau-Gewerbeschule Nazar

30 Aufruf von Superklasse-Methoden
Ahmad-Nessar Nazar Aufruf von Superklasse-Methoden Aus einer überschrieben Methode kann die ursprüngliche Methode mittels super.<Methodenname> aufgerufen werden: Ausgabe: Walther-Rathenau-Gewerbeschule Nazar

31 Übung Welche Ausgabe erscheint am Bildschirm? Ahmad-Nessar Nazar
Walther-Rathenau-Gewerbeschule Nazar

32 static-Methoden Welche Ausgabe erscheint am Bildschirm?
Ahmad-Nessar Nazar static-Methoden Welche Ausgabe erscheint am Bildschirm? static-Methoden sind an Klassen gebunden und können nicht überschrieben werden. Walther-Rathenau-Gewerbeschule Nazar

33 Überladene Methoden (Overloaded Methods)
Ahmad-Nessar Nazar Überladene Methoden (Overloaded Methods) Eine Methode wird als überladen bezeichnet, wenn sie mindestens zweimal mit demselben Namen in der Klasse definiert wurde. Überladene Methoden müssen sich in ihren Eingabeparameter- typen (Argumenttypen) unterscheiden! Sie können aber unterschiedliche Rückgabetypen haben! Korrekte Überladung, da hier ein Argument vom Typ Fahrzeug verlangt wird! Ungültige Überladung, da die Argumentliste nicht geändert wurde. Walther-Rathenau-Gewerbeschule Nazar

34 Überladene Methoden (Overloaded Methods)
Ahmad-Nessar Nazar Überladene Methoden (Overloaded Methods) Eine Methode wird dann als überladen bezeichnet, wenn mindestens eine zweite gleichnamige Methode in derselben Klasse oder in einer Subklasse existiert! Überladene Methoden müssen die Argumentliste (Typen) verändern! Überladene Methoden können die Rückgabetypen verändern! Überladene Methoden können die Zugriffsmodifikatoren (public, protected, default und package) verändern! Überladene Methoden können beliebig neue Exceptions werfen! Walther-Rathenau-Gewerbeschule Nazar

35 Konstruktoren und Vererbung
Ahmad-Nessar Nazar Konstruktoren und Vererbung Ezeugung von Object mittels impliziter super()-Aufruf Ezeugung von B mittels impliziter super()-Aufruf Ezeugung von B mittels impliziter super()-Aufruf Walther-Rathenau-Gewerbeschule Nazar

36 Konstruktoren und Vererbung
Ahmad-Nessar Nazar Konstruktoren und Vererbung Konstruktoren werden nicht vererbt und können deshalb auch nicht überschrieben werden! Ein Konstruktor kann aber beliebig oft in einer Klasse überladen werden. Die erste Anweisung in einem Konstruktor ist entweder ein this()- oder ein super()-Aufruf. Falls beide Anweisungen fehlen, fügt der Kompiler automatisch die Anweisung super(); als erste Anweisung im Konstruktor hinzu! Mittels dem Befehl super() wird der Standard-Konstruktor der Superklasse aufgerufen. Falls es sich bei der Superklasse nicht um die Klasse Object handelt muss deren Konstruktor erneut mittels super() den Konstruktor seiner Superklasse aufrufen usw.. Mittels this() kann ein Konstruktor einen anderen Konstruktor der eigenen Klasse aufrufen! Walther-Rathenau-Gewerbeschule Nazar


Herunterladen ppt "Vererbungskonzepte in Java"

Ähnliche Präsentationen


Google-Anzeigen