Fahrzeug - Universität zu Lübeck

Werbung
Programmierkurs Java
Vererbung
Prof. Dr. Stefan Fischer
Institut für Telematik, Universität zu Lübeck
http://www.itm.uni-luebeck.de/people/fischer
Ähnlichkeiten zwischen Klassen?
•
Beispiel: Klassen „Auto“ und „Bus“
•
Haben einige gemeinsame Attribute
–
–
–
–
•
Hersteller
Wechselintervall
Gefahrene Kilometer
Baujahr
Aber auch Unterschiede
– Auto: Cabriodach, ...
– Bus: Toilette, ...
Bildquelle (Porsche): Oliver Kurmis, http://de.wikipedia.org/w/index.php?title=Datei:1962_Porsche_911.jpg&filetimestamp=20100321221316
#2
Vererbung
• Man versucht, zu ähnlichen Klassen eine
gemeinsame Oberklasse zu finden
• Fasst Ähnlichkeiten zusammen
– In Form von Attributen, Verhalten (Methoden),
Beziehungen zu anderen Klassen
• Ergänzt in den Unterklassen lediglich die
Unterschiede
– Ergänzende Attribute, Methoden, Beziehungen zu
anderen Klassen
#3
Vererbung
• Gemeinsamkeiten ähnlicher Klassen werden zu einer
Oberklasse zusammengefasst
Fahrzeug
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
wechsleOel()
Gemeinsame
Oberklasse
Bus
PKW
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
toilette: boolean
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
Bauart: String
wechsleOel()
leereToilette()
Gemeinsamkeiten
wechsleOel()
oeffneDach() : boolean
#4
Vererbung: Grafische Notation
• Unterklassen zeigen auf Oberklasse
Fahrzeug
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
wechsleOel()
Bus
toilette: boolean
leereToilette()
PKW
bauart: String
oeffneDach(): boolean
#5
Vererbung: Ausdrucksweise
•
Fahrzeug ist Oberklasse (Superclass) bzw. Generalisierung von Bus und
PKW
•
Bus und PKW sind Unterklassen (Subclasses) bzw. Spezialisierungen von
Fahrzeug
Fahrzeug
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
wechsleOel()
Bus
toilette: boolean
leereToilette()
PKW
bauart: String
oeffneDach(): boolean
#6
Vererbung: Ausdrucksweise
• Pfeile deuten eine „ist ein“-Beziehung an
Bus „ist ein“ Fahrzeug
Aber: nicht jedes
Fahrzeug
ist ein Bus
Bus
toilette: boolean
leereToilette()
Fahrzeug
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
wechsleOel()
PKW „ist ein“ Fahrzeug
Aber: nicht jedes
Fahrzeug
ist ein PKW
PKW
bauart: String
oeffneDach(): boolean
#7
Vererbung
• Unterklassen erben von ihrer Oberklasse
– Erben alle Attribute und Methoden
– Kann Oberklasse um weitere Attribute und Methoden
ergänzen
• Erben bedeutet
– Attribute und Methoden der Oberklasse können in der
Unterklasse verwendet werden
– Aus Sicht der Unterklasse wirkt es, als wären sie in der
Unterklasse selbst definiert
#8
Vererbung in Java
•
Vererbung wird über Schlüsselwort
extends angegeben
Fahrzeug
...
– Man kann von genau einer Oberklasse erben
– Andere Programmiersprachen erlauben
auch von mehreren Oberklassen zu erben
(C++, ...)
•
Syntax: class Unterklasse extends
Oberklasse {...}
•
Beispiel
...
Bus
PKW
...
...
...
...
– class Bus extends Fahrzeug {...}
– class PKW extends Fahrzeug {...}
#9
Vererbungshierarchie
•
Vererbung kann auch über mehrere
Hierarchiestufen erfolgen
Gegenstand
– Vererbung von Attributen und Methoden erfolgt
transitiv
•
...
...
Beispiel
Fahrzeug
– Fahrzeug erbt alles von Gegenstand
– Bus und PKW erben alles von Fahrzeug
und damit auch alles von Gegenstand
•
Umsetzung in Java
– class Fahrzeug extends Gegenstand {...}
– class Bus extends Fahrzeug {...}
– class PKW extends Fahrzeug {...}
...
...
Bus
PKW
...
...
...
...
#10
Vererbung in Java
Object
...
• In Java gibt es eine Oberklasse aller Klassen
– java.lang.Object
...
Gegenstand
...
• Wenn keine Oberklasse angegeben ist, wird
Object automatisch zur Oberklasse
– Konsequenz: java.lang.Object ist
Oberklasse jeder Klasse
– Vielleicht nicht direkt, aber irgendwann auf
jeden Fall
• Dies ist nicht in allen Programmiersprachen so
– z.B. nicht in C++
...
Fahrzeug
...
...
Bus
PKW
...
...
...
...
#11
Vererbung und Instanzen
•
Von jeder Klasse können Instanzen erzeugt werden
•
Diese können ganz normal verwendet werden
•
Beispiele
– Fahrzeug f = new Fahrzeug();
f.wechsleOel();
Fahrzeug
...
– Bus b = new Bus();
b.wechsleOel();
b.leereToilette();
– PKW p = new PKW();
p.wechsleOel();
p.oeffneDach();
...
Bus
PKW
...
...
...
...
#12
Vererbung und Instanzen: Darstellung
•
•
Syntax: Instanzname: Klassenname
Syntax (Attribute): Attributname = Wert
f: Fahrzeug
hersteller = "Honda"
wechselintervall = 5000
km_gefahren = 542
baujahr = 2003
Fahrzeug
hersteller: String
wechselintervall: int
km_gefahren: int
baujahr: int
b: Bus
wechsleOel()
Instanziierung
Bus
toilette: boolean
leereToilette()
PKW
bauart: String
oeffneDach(): boolean
hersteller = "MAN"
wechselintervall = 20000
km_gefahren = 4243
baujahr = 1999
toilette = true
p: PKW
hersteller = "VW"
wechselintervall = 10000
km_gefahren = 433
baujahr = 2005
bauart = "Cabrio"
#13
Vererbung und Instanzen
•
Merkregel: Vererbungsbeziehung drückt eine „ist ein“ Beziehung aus
– Beispiel: Ein PKW ist ein Fahrzeug
– Aber: Nicht jedes Fahrzeug ist ein PKW
•
Variablen der Basisklasse können auf Referenzen der Subklassen verweisen
– Fahrzeug f = new Fahrzeug();
– Fahrzeug f1 = new PKW();
Fahrzeug
– Fahrzeug f2 = new Bus();
...
– Bus b = new Bus();
Fahrzeug f3 = b;
•
...
Aber nicht umgekehrt
– Bus b = new Fahrzeug();
//Fehler
Bus
PKW
...
...
...
...
#14
Schlüsselwort „super“
• Jede Instanz hat eine Referenz
auf „Ober-Instanz“
– z.B. um Attribute und Methoden
explizit zu referenzieren
– Diese heißt „super“
Gegenstand
...
super
...
Fahrzeug
• Erfüllt ähnlichen Zweck zum
Zugriff auf Elemente der
Oberinstanz wie „this“ für die
aktuelle Instanz
• Kann nicht wie this ausgegeben
werden (zeigt auf dieselbe
Instanz)
...
...
super
super
Bus
PKW
...
...
...
...
#15
Aufruf des „super“-Konstruktors
•
Aufruf des Konstruktors der Oberklasse
– Nur aus Konstruktor möglich
– Muss erster Aufruf im Konstruktor sein
•
Syntax: super(…evtl. Parameter…)
– class Fahrzeug {
Fahrzeug(int i) { /* Code des Konstruktors */ }
}
– class Bus extends Fahrzeug {
Bus() {
super(1);
}
}
#16
Aufruf des „super“-Konstruktors: Beispiel
Ruft Konstruktor von „Object“ auf
#17
Aufruf der Super-Methode
• Ruft Methode der Oberklasse auf
– Nur möglich im Konstruktor und in Methoden
• Ohne super würde die Methode der aktuellen
Klasse aufgerufen
• Syntax
– super.methodenName(…evtl. Parameter…)
#18
Aufruf der Super-Methode: Beispiel
#19
Zugriff auf Super-Attribute
• Greift auf Attribut der Oberklasse zu
• Ohne super würde (falls vorhanden) das
Attribut in der aktuellen Klasse verwendet
werden
• Syntax: super.attributName = 123;
#20
Zugriff auf Super-Attribute: Beispiel
#21
Zusammenfassung
•
Über Vererbung können gemeinsame Attribute, Methode, etc. ähnlicher
Klassen zusammengefasst werden
– Unterklassen erben alle Eigenschaften der Oberklasse
– In Java kann man von einer Oberklasse erben
– Mit super kann man auf die Oberklasse zugreifen (Methoden, Attribute,
Konstruktoren)
– In Java ist ein Objekt ohne explizite Angabe der Oberklasse implizit von Object
abgeleitet
#22
Herunterladen