htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at Java Vererbung Inhalt 1 Zielsetzung ........................................................................................................................... 2 1.1 2 Grundlagen der Vererbung................................................................................................... 2 2.1 3 Bewertung ..................................................................................................................... 2 Super und Subklassen ................................................................................................... 2 Überladen von Methoden .................................................................................................... 4 3.1 Unterschiedliche Parameter .......................................................................................... 4 3.2 Gleiche Parameter unterschiedlicher Rückgabewert .................................................... 4 4 Überschreiben von Methoden ............................................................................................. 5 5 Polymorphismus ................................................................................................................... 6 5.1 Grundlagen .................................................................................................................... 6 5.2 Zuordnung erst zur Laufzeit........................................................................................... 6 6 Beispielprojekt (Polymorphismus) ....................................................................................... 7 7 Abstrakte Klassen ................................................................................................................. 8 8 History .................................................................................................................................. 9 SEW(3)-OOP-Vererbung.doc Seite 1 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at 1 Zielsetzung Lerne die Grundlagen zur Vererbung kennen. Verstehe den Unterschied zwischen gleich lautenden Methoden aber unterschiedlichen Parametern (=Überladen von Methoden) und gleich lautenden Methoden mit gleichen Parametern aber in unterschiedlichen, abgeleiteten (=Überschreiben von Methoden) Klassen. Lerne was Polymorphismus ist und wie erst zur Laufzeit entschieden wird, welche Methoden wirklich ausgeführt werden. 1.1 Bewertung Abgabe des Beispielprojekts am Ende der Übungseinheit und die persönliche Mitarbeit werden zur Beurteilung zu gleichen Teilen herangezogen. 2 Grundlagen der Vererbung Vererbung basiert auf der Idee, dass Eltern ihren Kindern Eigenschaften mitgeben. Dabei wird eine Kind-Klasse nicht komplett neu definiert, sondern von seiner Vater-Klasse abgeleitet. 2.1 Super und Subklassen Im Falle einer Vererbung, erbt die Kindklasse alle Eigenschaften der Vaterklasse und kann nach Belieben eigene hinzufügen. In unserem Fall wäre also B von A abgeleitet. A wird als Superklasse, B als Subklasse bezeichnet. Hier die wichtigsten Bezeichnungen: Superklasse <-> Subklasse Oberklasse <-> Unterklasse Vater- oder Elternklasse <-> Kindklasse Basisklasse <-> Abgeleitete Klasse 2.1.1 Ableitung (extends) Eine Klasse erweitert durch das Schlüsselwort extends eine andere Klasse. Sie wird dann zur Unterklasse. Eine Oberklasse vererbt also Eigenschaften, und die Unterklasse erbt sie. Alle Klassen haben direkt oder indirekt die Klasse java.lang.Object als Basisklasse. public class Unerklasse extends Oberklasse { } SEW(3)-OOP-Vererbung.doc Seite 2 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at Beispiel: public class Article { private int code; private String label; private double price; ... } public class CD extends Article { private String artist; private int songs; ... } public class Book extends Article { private String author; private int pages; ... } Damit ergibt sich das nachfolgende UML-Diagramm: 2.1.2 Super() Konstruktoren werden im Gegensatz zu Methoden nicht vererbt. Das heißt, eine Unterklasse muss ganz neue Konstruktoren angeben, denn mit den Konstruktoren der Oberklasse kann ein Objekt der Unterklasse nicht erzeugt werden. Java ruft im Konstruktor einer jeden Klasse (ausgenommen java.lang.Object) automatisch den Default-Konstruktor der Oberklasse auf oder auch mit: super(); // ruft den Default-Konstruktorauf Will man nicht den Default-Konstruktor der Oberklasse, sondern einen anderen (parametrisierten) Konstruktor der Oberklasse anzusprechen, muss man super(....) mit Argumenten befüllen (angewendet auf das Beispiel Article siehe 2.1.1): // ruft den Konstruktor der Vaterklasse (Article) auf super(int code, String label, double price); SEW(3)-OOP-Vererbung.doc Seite 3 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at 3 Überladen von Methoden Überladen von Methoden hat nicht unbedingt etwas mit Vererbung zu tun, es kann in jeder Klasse verwendet werden und ist etwas anderes als das Überschreiben von Methoden (siehe Kapitel 4). Methoden haben bestimmte Merkmale an denen man sie erkennt: a) einen Namen b) die Anzahl, die Typen und die Reihenfolge der Parameter c) einen Rückgabewert Beispiel: String text = new String(“Hallo“); String neuerText = text.substring(1,4); Wie lauten die Merkmale von der Methode substring? Name = substring Rückgabewert = String Parameteranzahl = 2, Parametertypen = int und int, Parametrreihenfolge = zuerst Start- dann End-Wert 3.1 Unterschiedliche Parameter Java erlaubt es, den Namen der Funktion gleich zu lassen, aber andere Parameter einzusetzen. Eine überladene Methode ist eine Funktion mit dem gleichen Namen wie eine andere Funktion, aber einer unterschiedlichen Parameterliste. text.substring(1,4); text.substring(1); 3.2 Gleiche Parameter unterschiedlicher Rückgabewert Liegt Unterscheid zweier Methoden innerhalb einer Klasse nur in ihrem Rückgabewert dann werden sie als gleich angesehen, dies führt zu einem Fehler. In der Klasse java.long.Math gibt es beispielsweise mehrere Methoden gleichen Namens mit unterschiedlichen Rückgabewerten: public int abs(int i) {...} public double abs(double d) {...} Hier ist aber wieder ein unterschiedlicher Parametertyp der Grund für keine Fehlermeldung. Andere Beispiele wären die überladenen print-Methoden in System.out . SEW(3)-OOP-Vererbung.doc Seite 4 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at 4 Überschreiben von Methoden Beim Überschreiben (eng. Overriding) von Methoden besitzt eine Methode in einer Kindklasse den Namen und die Parameterliste einer geerbten Methode der Vaterklasse. Durch diese neue Methode wird innerhalb der Unterklasse die ursprüngliche Methode der Oberklasse ersetzt. Regeln beim Überschreiben: Der Methodenname muss übereinstimmen. Die Parameterliste und der Rückgabetyp müssen gleich sein. Eine überschreibende Methode darf im Zugriff nicht eingeschränkter sein als die Ursprungsmethode. Beispiel: Public class Zweirad { public void fahren() { System.out.println("Zweirad: Vaterklasse"); } } public class Fahrrad extends Zweirad { public void fahren() { System.out.println("Fahrrad: Pedale betätigen"); } } public class Motorrad extends Zweirad { // public void fahren() { // System.out.println("Motorrad: Gashebel betätigen"); // } } SEW(3)-OOP-Vererbung.doc Seite 5 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at public class Main { public static void main(String[] args) { Fahrrad z1 = new Fahrrad(); Motorrad z2 = new Motorrad(); z1.fahren(); z2.fahren(); } } Existiert in der Kindklasse ’Motorrad’ keine passende Methode fahren() so wird einfach die der Vaterklasse verwendet. Sobald aber die Kindklasse eine passende Methode besitzt wird diese auch verwendet. 5 Polymorphismus 5.1 Grundlagen Polymorphismus bedeutet soviel wie Vielgestaltigkeit, und deutet auf die Fähigkeit von Objektvariablen, Objekte unterschiedlicher Klassen aufzunehmen. 5.2 Zuordnung erst zur Laufzeit Schauen wir auf folgendes Beispiel: public class Main { public static void main(String[] args) { Zweirad z1 = new Fahrrad(); // Der zugewiesene Wert passt zum Typ, wenn er // vom gleichen Typ oder von einem Subtyp ist. Zweirad z2 = new Motorrad(); // Instanzen können Objekte auch von beliebigen Subtypen halten. z1.fahren(); // Zuordnung erst zur Laufzeit z2.fahren(); } } Ein Fahrrad ist nun mal ein Zweirad, hat alle Eigenschaften eines Zweirads. Dass es möglicherweise ein paar zusätzliche Eigenschaften besitzt, stört den Compiler nicht. Er hat nur sicherzustellen, dass die Eigenschaften eines Zweirads vollständig vorhanden sind. Die Zuordnung dieser Funktion zum Methodennamen erfolgt erst zur Laufzeit (dynamisches Binden). Anders herum funktioniert Polymorphismus nicht. SEW(3)-OOP-Vererbung.doc Seite 6 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at 6 Beispielprojekt (Polymorphismus) Eine allgemeine Superklasse (Vaterklasse) Fahrzeug soll durch 2 weitere Subklassen (Kindklassen) Kraftfahrzeug und Fahrrad erweitert werden (siehe unten). Ergänzt wird das ganze durch die Aufrufe im Hauptprogramm. Aufgabe: Folgender Code im Hauptprogramm soll zum laufen gebracht werden: Arralist liste = new ArrayList(); Fahrzeug f1 = new Kraftfahrzeug(35508, “rot“, 2500, 5.7); f1.fahren(255); liste.add(f1); Fahrzeug f2 = new Fahrrad(870, “silber“, 21); f2.fahren(28); liste.add(f2); ... for(int i=0; i<liste.size(); i++) { Fahrzeug x =(Fahrzeug) liste.get(i); x. ausgabeDaten(); } Weiters: a) beim “fahren“ sollen die “gefahreneKm“ entsprechend erhöht werden b) beim “fahren“ wird entsprechend dem Verbrauch der “verbrauchteTreibstoff“ erhöht SEW(3)-OOP-Vererbung.doc Seite 7 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at 7 Abstrakte Klassen In Java ist es möglich, abstrakte Methoden zu definieren. Im Gegensatz zu den konkreten Methoden enthalten sie nur die Deklaration der Methode, nicht aber ihre Implementierung. Syntaktisch unterscheiden sich abstrakte Methoden dadurch, dass anstelle der geschweiften Klammern lediglich ein Semikolon steht. Zusätzlich wird die Methode mit dem Attribut abstract versehen. Abstrakte Methoden können nicht aufgerufen werden, sie definieren nur eine Schnittstelle. Erst durch Überlagerung in einer abgeleiteten Klasse und Implementierung des fehlenden Methodenrumpfes wird eine abstrakte Klasse konkret und kann aufgerufen werden. Eine Klasse, die mindestens eine abstrakte Methode enthält, wird selbst als abstrakt angesehen und muss ebenfalls mit dem Schlüsselwort abstract versehen werden. SEW(3)-OOP-Vererbung.doc Seite 8 25.05.2016 htl donaustadt Donaustadtstraße 45 1220 Wien www.htl-donaustadt.at 8 History Version 1.00 1.01 1.02 1.03 Datum 24.02.2013 2.3.2013 3.3.2013 10.3.2013 SEW(3)-OOP-Vererbung.doc Name SACH SACH SACH SACH Bemerkung Erstfassung Kapitel 2.1.1 & 2.1.2 Kapitel 3 bis 5 Kapitel 7 Seite 9 25.05.2016