walther-rathenau- gewerbeschule nazar1 vererbungskonzepte in java
TRANSCRIPT
Walther-Rathenau-Gewerbeschule
Nazar 1
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
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
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...
Walther-Rathenau-Gewerbeschule
Nazar 5
Umsetzung 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
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
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.
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{....}
Walther-Rathenau-Gewerbeschule
Nazar 10
Vererbungshierarchie
Fahrzeug
Object
LKW PKW Motorrad Fahrrad
....... ....... ....... .......
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.
Walther-Rathenau-Gewerbeschule
Nazar 12
Lösungsvorschlag
rekursive Beziehung
Aufgabe: Überführen Sie dieses Diagramm in Java. Erzeugen Sie einige Objekte...
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!
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();
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();
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
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.
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()
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)
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();
Walther-Rathenau-Gewerbeschule
Nazar 21
Der instanceof-Operator Mithilfe des instanceof-Operators kann der tatsächliche
Referenztyp eine Variable ermittelt werden:
Walther-Rathenau-Gewerbeschule
Nazar 22
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) 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
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
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!
Das ist keine überschriebene, sondern eine eigene Methode der Klasse B!
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!
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.
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!
Walther-Rathenau-Gewerbeschule
Nazar 30
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?
Walther-Rathenau-Gewerbeschule
Nazar 32
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)
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.
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!
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
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!