Teil 2: OOP und JAVA (Vorlesung 11) Modul: Programmierung B-PRG Grundlagen der Programmierung II Prof. Dot.-Ing. Roberto Zicari Professur für Datenbanken und Informationssysteme (FB 12) 28.06.06 1
Teil 8 - Java Vererbung Schnittstellen Polymorphie 2
Erinnerung: Beispiel für Vererbung Kraftfahrzeug Typ, Farbe, kmh beschleunigen() bremsen() Omnibus Stehplätze PKW LKW anhängen() Limousine Cabriolet Verdeck öffnen() Cabriolet und Limousine können zusätzliche Methoden bzw. Attribute haben. Beide erben alle Merkmale von PKW und damit auch von Kraftfahrzeug. 3 Grundlagen der Programmierung II
Mehrfachvererbung (Multiple Inheritance) In manchen objektorientierten Programmiersprachen (C++, Smalltalk usw.) kann eine Klasse mehrere direkte Oberklassen haben (Mehrfachvererbung) gute Modellierung mancher realen Gegebenheiten: 4 Grundlagen der Programmierung II
Schnittstellen (Interfaces) Um Probleme bei der Mehrfachvererbung zu umgehen, gibt es in Java die eingeschränkte Mehrfachvererbung durch Schnittstellen. Interfaces enthalten nur die "Signaturen" von Methoden. Statt der Definition des Methoden-Inhalts zwischen { und enthalten sie nur ein Semikolon: interface InterfaceName { void methode1(parameterliste) ; 5 Grundlagen der Programmierung II
Schnittstellen (Interfaces) Die Subklasse, die dieses Interface implementiert, muss dann alle darin skizzierten Methoden enthalten, mit der richtigen Signatur (Typ, Name und Parameterliste) und mit einem konkreten Block von Statements: class ClassName implements InterfaceName {... void methode1 (parameterliste) {... // Statements; 6 Grundlagen der Programmierung II
Polymorphie Die Fähigkeit eines Objektes zu entscheiden, welche Methode auf sich selbst anzuwenden ist, bezeichnet man als Polymorphie in der Objektorientierung. Das Objekt kann auf eigene Weise auf den Aufruf einer Methode reagieren. 7 Grundlagen der Programmierung II
Polymorphie bei Methoden Beispiel Überladung in Java: GeoObjekt berechneflaeche(kreis k) berechneflaeche(rechteck r) Was ist hier nicht sinnvoll? Klasse von geometrischen Formen GeoObjekt. Es gibt zwei Methoden zur Flächenberechnung berechneflaeche() aber mit unterschiedlichen Parametern nämlich zur Berechnung von Kreisen und Rechtecken. unterschiedliche Berechungsvorschriften aber gleicher Name. 8 Grundlagen der Programmierung II
Late Binding in Java: Beispiel: GeoObjekt Kreis radius berechneflaeche() Rechteck laenge breite berechneflaeche() Unterklassen Rechteck und Kreis, haben jeweils eine eigene Methode zur Flächenberechnung unterschiedliche Berechungsvorschriften aber gleich benannte Methoden 9 Grundlagen der Programmierung II
Überschreiben von Methoden In einer Unterklasse darf eine Methode mit gleichem Namen und gleicher Signatur wie in einer Oberklasse definiert werden. Überschreiben (Overwriting) Wichtig: Unterscheidung zum Überladen: (vgl. Beispiel Geometrische Objekte ) - gemeinsame Oberklasse - unterschiedliche Klassennamen Unterklasse1 methodex() Oberklassenmethode geht in der Unterklasse verloren (In Java durch das Keyword super noch zugreifbar!) Oberklasse methodex()... 10 Grundlagen der Programmierung II
Überschreiben von Methoden in Java Fahrzeug kmh: int sitzplaetze: int fahren() plaetze_anzeigen() Omnibus stehplaetze: int plaetze_anzeigen()... Die Unterklasse Omnibus erbt alle Attribute und Methoden der Oberklasse Fahrzeug. Zusätzlich erhält die Unterklasse Omnibus das Attribut stehplaetze. Die Methode plaetze_anzeigen() der Oberklasse Fahrzeug wird in der Unterklasse Omnibus durch eine neue Version überschrieben. 11 Grundlagen der Programmierung II
Übungs-Aufgabe class A{ public void foo(){ System.out.println("A"); class B extends A { public void foo(){ System.out.println("B"); public static void main(string[] args){ A aobject = new B(); aobject.foo(); AUSGABE: B (VM erkennt das aobject vom typ B ist) 12 Grundlagen der Programmierung II
Übungs-Aufgabe class A{ public int dosomething(int y){return y*2; public class B extends A{ public long dosomething(int y){return y*4; public static void main(string[] args){ B bobject = new B(); long x = bobject.dosomething(5); System.out.println(x); Falsches Überschreiben: Kompilierung schlägt fehl in Zeile: public long dosomething(int y){return y*4; 13 Grundlagen der Programmierung II
Übungs-Aufgabe class A{ public A(){ super(); System.out.println("A erzeugt"); AUSGABE: A erzeugt B erzeugt public class B extends A{ public B(){ System.out.println("B erzeugt"); super() in class A redundant public class Test{ public static void main(string[] args){ A aobject = new B(); 14 Grundlagen der Programmierung II