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