Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java.

Ähnliche Präsentationen


Präsentation zum Thema: "Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java."—  Präsentation transkript:

1 Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

2 Walther-Rathenau- Gewerbeschule Nazar2 Ein UML-Klassendiagramm SchulklasseKlassenraum Kurs Schüler SchulleiterSekretärin Lehrer Lehrerzimmer Hausmeister Schulgebäude Freizeitraum Klassenlehrer * * * 1 0..** * 1..* 1 * * * * 0..1 unterrichtet

3 Walther-Rathenau- Gewerbeschule Nazar3 Ein UML-Klassendiagramm SchulklasseKlassenraum Kurs Schüler SchulleiterSekretärin Lehrer Lehrerzimmer Hausmeister Schulgebäude Freizeitraum Klassenlehrer * * * 1 0..** * 1..* 1 * * * * 0..1 unterrichtet

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

5 Walther-Rathenau- Gewerbeschule Nazar5 Umsetzung in Java

6 Walther-Rathenau- Gewerbeschule Nazar6 Ein UML-Klassendiagramm SchulklasseKlassenraum Kurs Schüler SchulleiterSekretärin Lehrer Lehrerzimmer Hausmeister Schulgebäude Freizeitraum Klassenlehrer * * * 1 0..** * 1..* 1 * * * * 0..1 unterrichtet

7 Walther-Rathenau- Gewerbeschule Nazar7 Vererbung (Generalisierung) SchulleiterSekretärinSchüler Person + name: String - schularten: Set- klasse:String Hausmeister - bereich:String Lehrer - deputat: int

8 Walther-Rathenau- Gewerbeschule Nazar8 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.

9 Walther-Rathenau- Gewerbeschule Nazar9 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{....}

10 Walther-Rathenau- Gewerbeschule Nazar10 Vererbungshierarchie Fahrzeug Object LKWPKWMotorradFahrrad

11 Walther-Rathenau- Gewerbeschule Nazar11 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.

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

13 Walther-Rathenau- Gewerbeschule Nazar13 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!

14 Walther-Rathenau- Gewerbeschule Nazar14 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();

15 Walther-Rathenau- Gewerbeschule Nazar15 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();

16 Walther-Rathenau- Gewerbeschule Nazar16 Referenztypen legen die Methodenauswahl fest 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)! Fahrzeug fzg = new Fahrzeug(); fzg = new LKW(); fzg.beschleunige(70); //Aufruf einer Fahrzeug-Methode

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

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

19 Walther-Rathenau- Gewerbeschule Nazar19 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)

20 Walther-Rathenau- Gewerbeschule Nazar20 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();

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

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

23 Walther-Rathenau- Gewerbeschule Nazar23 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!

24 Walther-Rathenau- Gewerbeschule Nazar24 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.

25 Walther-Rathenau- Gewerbeschule Nazar25 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!

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

27 Walther-Rathenau- Gewerbeschule Nazar27 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!

28 Walther-Rathenau- Gewerbeschule Nazar28 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.

29 Walther-Rathenau- Gewerbeschule Nazar29 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!

30 Walther-Rathenau- Gewerbeschule Nazar30 Aufruf von Superklasse-Methoden Aus einer überschrieben Methode kann die ursprüngliche Methode mittels super. aufgerufen werden: Ausgabe:

31 Walther-Rathenau- Gewerbeschule Nazar31 Übung Welche Ausgabe erscheint am Bildschirm?

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

33 Walther-Rathenau- Gewerbeschule Nazar33 Ü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.

34 Walther-Rathenau- Gewerbeschule Nazar34 Ü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!

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

36 Walther-Rathenau- Gewerbeschule Nazar36 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!


Herunterladen ppt "Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java."

Ähnliche Präsentationen


Google-Anzeigen