36
Walther-Rathenau- Gewerbeschule Nazar 1 Vererbungskonzepte in Java

Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Embed Size (px)

Citation preview

Page 1: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 1

Vererbungskonzepte in Java

Page 2: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 2

Ein UML-Klassendiagramm

Schulklasse Klassenraum

Kurs

Schüler

SchulleiterSekretärin

Lehrer

Lehrerzimmer

Hausmeister

Schulgebäude

Freizeitraum

Kla

ssen

lehr

er

1

0..1

1..5

*

0..1 0..1

1..*

1 1

1

1..*

1..5

1

1..*

1

0..* *

*

1..*

1

* *

*

1

11..*

0..1

1..32 1..32

*

0..1

0..1

unte

rric

htet

Page 3: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 3

Ein UML-Klassendiagramm

Schulklasse Klassenraum

Kurs

Schüler

SchulleiterSekretärin

Lehrer

Lehrerzimmer

Hausmeister

Schulgebäude

Freizeitraum

Kla

ssen

lehr

er

1

0..1

1..5

*

0..1 0..1

1..*

1 1

1

1..*

1..5

1

1..*

1

0..* *

*

1..*

1

* *

*

1

11..*

0..1

1..32 1..32

*

0..1

0..1

unte

rric

htet

Page 4: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 4

Vererbung (Generalisierung)

Klassenraum Freizeitraum Lehrerzimmer

Raum

+ raumNr: int

- typ: String - spiele: ArrayList - anzFach: int

Generalisierung(Superklasse)

Spezialisierungen(Subklassen)

Klassenraum, Freieitraum und Lehrerzimmer erben die Eigenschaft raumNr der Klasse Raum...

Page 5: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 5

Umsetzung in Java

Page 6: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 6

Ein UML-Klassendiagramm

Schulklasse Klassenraum

Kurs

Schüler

SchulleiterSekretärin

Lehrer

Lehrerzimmer

Hausmeister

Schulgebäude

Freizeitraum

Kla

ssen

lehr

er

1

0..1

1..5

*

0..1 0..1

1..*

1 1

1

1..*

1..5

1

1..*

1

0..* *

*

1..*

1

* *

*

1

11..*

0..1

1..32 1..32

*

0..1

0..1

unte

rric

htet

Page 7: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 7

Vererbung (Generalisierung)

Schulleiter Sekretärin Schüler

Person

+ name: String

- schularten: Set - klasse:String

Hausmeister

- bereich:String

Lehrer

- deputat: int

Page 8: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 8

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.

Page 9: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 9

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{....}

Page 10: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 10

Vererbungshierarchie

Fahrzeug

Object

LKW PKW Motorrad Fahrrad

....... ....... ....... .......

Page 11: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 11

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.

Page 12: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 12

Lösungsvorschlag

rekursive Beziehung

Aufgabe: Überführen Sie dieses Diagramm in Java. Erzeugen Sie einige Objekte...

Page 13: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 13

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!

Page 14: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 14

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();

Page 15: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 15

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();

Page 16: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 16

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 Methodenamens 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

Page 17: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 17

Polymorpher Methodenaufruf

Ausgabe:

Dynamisches Binden:Zur Laufzeit wird geschaut,welches Objekt fzg tatsächlichentspricht. Es wird dann die Passende Methode aufgerufen.

Page 18: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 18

Vorteile der Polymorphismus Höhere flexibilität durch dynamisches Binden.

Einfache Programmlogik => Wartungsaufwand wird reduziert.

LKW beschleunigeLKW()

PKW beschleunigePKW()

...

ohne Polymorphismus mit Polymorphismus

beschleunige()

Page 19: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 19

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)

Page 20: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 20

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 LKWlkw.showLadeRaumGröße();

Page 21: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 21

Der instanceof-Operator Mithilfe des instanceof-Operators kann der tatsächliche

Referenztyp eine Variable ermittelt werden:

Page 22: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 22

Der instanceof-Operator Der instanceof-Test ist hier optional, schützt aber im Allgemeinen

vor unerwarteten ClassCastException's

Page 23: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 23

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!

Page 24: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 24

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.

Page 25: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 25

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!

Page 26: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 26

private-Methoden private deklarierte Methoden werden nicht geerbt!

Das ist keine überschriebene, sondern eine eigene Methode der Klasse B!

Page 27: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 27

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!

Page 28: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 28

Zugriffsmodifikatoren und Overriding Die Zugänglichkeit einer überschriebenen Methode darf nicht

geringer sein als die der zugehörigen Methode in der Superklasse.

Kompilerfehler, weilprivate restriktiver ist als public.

Zur Laufzeit wird die showData()-Methode derLKW-Klasse ausgeführt.Da f aber als Fahrzeug deklariert ist, kann es nichtauf die showData()-Methode zugreifen.

Page 29: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 29

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!

Page 30: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 30

Aufruf von Superklasse-Methoden Aus einer überschrieben Methode kann die ursprüngliche Methode

mittels super.<Methodenname> aufgerufen werden:

Ausgabe:

Page 31: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 31

Übung

Welche Ausgabe erscheint am Bildschirm?

Page 32: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 32

static-Methoden

Welche Ausgabe erscheint am Bildschirm?

static-Methoden sind an Klassen gebunden und können nicht überschrieben werden.

Page 33: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 33

Ü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 Fahrzeugverlangt wird!

Ungültige Überladung,da die Argumentliste nicht geändert wurde.

Page 34: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 34

Ü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!

Page 35: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 35

Konstruktoren und Vererbung

Ezeugung von B mittels impliziter super()-Aufruf

Ezeugung von B mittels impliziter super()-Aufruf

Ezeugung von Object mittels impliziter super()-Aufruf

Page 36: Walther-Rathenau- Gewerbeschule Nazar1 Vererbungskonzepte in Java

Walther-Rathenau-Gewerbeschule

Nazar 36

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!