Programmieren 2 – Java Überblick 1 2 3 4 5 6 7 8 9 10 11 Klassen und Objekte Vererbung Schnittstellen Innere Klassen Exceptions Funktionsbibliothek Datenstrukturen und Algorithmen Ein-/Ausgabe Graphische Benutzeroberflächen Applets Internet-Anwendungen © Prof. Dr. Björn Dreher Programmieren 2 - Java 75 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 76 1 2 Vererbung 2.1 Einleitung Vererbung: Englisch Inheritance Mechanismus, bei dem Klassen mit ähnlichen Eigenschaften in eine hierarchische Beziehung miteinander gesetzt werden Die untergeordnete, speziellere Klasse (Subklasse) erbt die Eigenschaften (Attribute und Methoden) der übergeordneten, allgemeineren Klasse (Superklasse) Baum Nadelbaum Superklasse, allgemeiner Laubbaum Subklasse, abgeleitete Klasse, spezieller Gemeinsame Eigenschaften ordnet man der Superklasse zu, so dass diese in den Subklassen wiederverwendet werden können Man erhält eine Vererbungshierarchie: Spezialisierung/Generalisierung. © Prof. Dr. Björn Dreher Programmieren 2 - Java 77 2 Vererbung 2.1 Einleitung Was wird vererbt? Wie die Eigenschaften, die man von seinen Eltern ererbt: Einige sind dieselben, einige sind verändert, einige sind neu Dies gilt sowohl für Attribute als auch für Methoden Alle Attribute der Elternklasse werden geerbt Einige können noch hinzukommen Es können jedoch keine weggelassen werden Es können welche geändert werden (unter demselben Namen) Alle Methoden der Elternklasse können auch von den Nachkommen benutzt werden Es können Methoden hinzukommen Es können keine weggelassen werden. Es können jedoch Methoden redefiniert werden (unter demselben Namen): Anderes Verhalten! Zugriffsprivilege können bei der Vererbung verändert werden © Prof. Dr. Björn Dreher Programmieren 2 - Java 78 2 2 Vererbung 2.1 Einleitung Code-Wiederverwendung Wichtige Basisattribute und Basismethoden können in einer hierarchisch höher stehenden Klasse platziert werden und stehen allen Nachkommen, die spezialisierte Objekte darstellen, zur Verfügung. Vereinfachte Wartung, Wiederverwendbarkeit von Code! Nur die zentrale Funktion der Änderung Basisklasse Basisklasse muss geändert werden. Durch die Vererbung greifen alle untergeordnete Klassen zwangsläufig auf die Subklasse richtige, geänderte Methode zu. Man kann auf diese Weise die Struktur der Eigenschaften (Attribute und Methoden) aller Nachfolgeklassen erzwingen. Subklasse Jede Klasse hat einen Vorgänger, kann aber selbstverständlich mehrere Nachkommen haben. © Prof. Dr. Björn Dreher Programmieren 2 - Java 79 2 Vererbung 2.1 Einleitung Polymorphismus Methoden bei Java sind normalerweise virtuelle Methoden Solche Methoden sind in der Basisklasse definiert und werden in den abgeleiteten Klassen redefiniert (überschrieben) Damit zeigen die abgeleiteten Klassen ein anderes Verhalten Mit einer Klassenhierarchie wird eine Menge von Datentypen (Klassen) derart definiert, dass eine Referenz auf die Basisklasse auch auf Objekte aller abgeleiteten Klassen zeigen kann. Ruft man mit einer solchen Referenz eine virtuelle Methode auf, so wird zur Laufzeit entschieden, welches die richtige redefinierte Methode ist Jedes Objekt „weiß“, welche Methodenimplementierung für es die richtige ist © Prof. Dr. Björn Dreher Programmieren 2 - Java 80 3 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 81 2 Vererbung 2.2 Vererbung in Java Beispiel: Online Shop für Bücher und CDs Buch Artikelnummer Verfasser Titel Verlag Erscheinungsjahr Preis CD Artikelnummer Interpret Liste von Musikstücken Preis Warenkorb sollte beide Arten von Artikel aufnehmen können Gemeinsame Attribute und Methoden © Prof. Dr. Björn Dreher Programmieren 2 - Java 82 4 2 Vererbung 2.2 Vererbung in Java Klassendefinitionen Artikel, Buch, CD public class Article { private int code; // Artikelnummer private String label; // Kurzbeschreibung private int price; Eine Zeile Kurzinfo über Artikel: public void showInfo() { ... } code, label, price public String getArticleLine() { ... } public Article(int code, String label, int price) { ... } } public class Book extends Article { private String author, title, publisher; private int year; public void showInfo() { ... } Informationen zu dem Artikel } aufbereitet zur Darstellung in public class CD extends Article { einem separaten Fenster: private String artist; Verschieden für Bücher und CDs private String[] song; public void showInfo() { ... } } © Prof. Dr. Björn Dreher 83 Programmieren 2 - Java 2 Vererbung 2.2 Vererbung in Java Klassendefinitionen in UML-Notation Article - code: int - label: String - price: int + showInfo(): void + getArticleLine(): String Book CD - author: String - title: String - publisher: String - year: int - artist: String - song: String [ ] + showInfo(): void + showInfo(): void © Prof. Dr. Björn Dreher Programmieren 2 - Java 84 5 2 Vererbung 2.2 Vererbung in Java Alle Klassen erben von der „Urvorfahrenklasse“ Object Vererbungsbeziehungen Jede Klasse hat genau eine Vorfahrenklasse (außer Object) In Java gibt es keine Mehrfachvererbung Jede Klasse kann 0 oder mehrere Nachfahrenklassen haben Syntax class UnterKlasse extends OberKlasse { ... } Bedeutung bei richtiger Anwendung von Vererbungsbeziehungen Ein Objekt der Unterklasse ist sinngemäß auch immer ein Mitglied der Oberklasse (eine is-a Beziehung) Ein Buch ist ein Artikel Eine CD ist ein Artikel © Prof. Dr. Björn Dreher Sehr wichtig! Programmieren 2 - Java 85 2 Vererbung 2.2 Vererbung in Java Ein etwas einfacheres Beispiel: Kleidungsstücke Kleidung # farbe: String + setFarbe(String f): void + getFarbe(): String Socke + kennung(): String Hose + kennung(): String class Kleidung { protected String farbe; public void setFarbe (String f) { farbe = f; } public String getFarbe() { return farbe; } © Prof. Dr. Björn Dreher class Socke extends Kleidung { public String kennung() { return "Ich bin eine Socke " + "der Farbe " + farbe; } } class Hose extends Kleidung { public String kennung() { return "Ich bin eine Hose " + "der Farbe " + farbe; } } Programmieren 2 - Java 86 6 2 Vererbung 2.2 Vererbung in Java Hauptprogramm dazu public class SchrankVoll { public static void main(String args[]) { Socke s = new Socke(); s.setFarbe("rot"); Hose h = new Hose(); h.setFarbe("grau"); System.out.println( s.kennung() ); System.out.println( h.kennung() ); Von Kleidung geerbte Methode } } Eigene Methode © Prof. Dr. Björn Dreher Programmieren 2 - Java 87 2 Vererbung 2.2 Vererbung in Java Sichtbarkeit Nachfahrenklassen haben zu privaten Eigenschaften der Vorfahrenklasse keinen Zugriff Spezielle Sichtbarkeit: protected Sichtbar für Nachfahrenklassen und alle Klassen desselben Packages Will man eine Klasse auf mögliche Nachfahrenklassen vorbereiten, sollte man private in den meisten Fällen durch protected ersetzen © Prof. Dr. Björn Dreher Programmieren 2 - Java 88 7 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 89 2 Vererbung 2.3 Substitutionsprinzip Zuweisungskompatibilität innerhalb einer Vererbungshierarchie Referenz auf Vorfahrenklasse kann Referenz auf Nachfahrenklasse aufnehmen Kleidung kann Socke oder Hose zugewiesen werden Beide sind Kleidung Kleidung Wichtiges Konzept der Objektorientierung # farbe: String Überall, wo Oberklasse + setFarbe(String f): void gefordert ist, kann auch ein Objekt + getFarbe(): String der Unterklasse verwendet werden Unterklasse hat alles, was Socke Hose Oberklasse erwartet, ist + kennung(): String + kennung(): String nur spezieller Oberklasse kann speziellere Eigenschaften der Unterklasse (ohne besondere Vorkehrungen) nicht nutzen © Prof. Dr. Björn Dreher Programmieren 2 - Java 90 8 2 Vererbung 2.3 Substitutionsprinzip Häufige Anwendung in der Java-Klassenbibliothek Behälterklassen (Liste, Stack) Erwarten Objekte der Klasse Object Können daher alle Java Objekte aufnehmen Unser Beispiel: Überall, wo Kleidung erwartet wird, können auch Socken der Hosen benutzt werden © Prof. Dr. Björn Dreher Programmieren 2 - Java 91 2 Vererbung 2.3 Substitutionsprinzip Beispiel public class WasIstAllesKleidung { public static void main(String args[]) { Kleidung [] kl = new Kleidung[2]; Socke s = new Socke(); s.setFarbe("rot"); Hose h = new Hose(); h.setFarbe("grau"); kl[0] = s; kl[1] = h; System.out.println( kl[0].getFarbe() ); System.out.println( kl[1].getFarbe() ); for (int i = 0; i < 2; i++) System.out.println( kl[i].kennung() ); // Geht nicht! } } © Prof. Dr. Björn Dreher Programmieren 2 - Java 92 9 2 Vererbung 2.3 Substitutionsprinzip Kleidung # farbe: String Unser Beispiel Kleidungsstücke modifiziert + setFarbe(String f): void + getFarbe(): String + kennung(): String Socke + kennung(): String class Kleidung { protected String farbe; public void setFarbe (String f) { farbe = f; } public String getFarbe() { return farbe; } public String kennung() { return "Ich bin eine Kleidung"; } } © Prof. Dr. Björn Dreher Hose + kennung(): String class Socke extends Kleidung { public String kennung() { return "Ich bin eine Socke " + "der Farbe " + farbe; } } class Hose extends Kleidung { public String kennung() { return "Ich bin eine Hose " + "der Farbe " + farbe; } } Programmieren 2 - Java 93 2 Vererbung 2.3 Substitutionsprinzip Beispiel public class WasIstAllesKleidung { public static void main(String args[]) { Kleidung [] kl = new Kleidung[2]; Socke s = new Socke(); s.setFarbe("rot"); Hose h = new Hose(); h.setFarbe("grau"); for (int i = 0; i < 2; i++) System.out.println( kl[i].kennung() ); // Geht jetzt! Socke s1 = kl[0]; Socke s1 = (Socke) kl[0]; // Geht nicht! // So geht's } } © Prof. Dr. Björn Dreher Typumwandlung Richtigkeit wird zur Laufzeit geprüft Programmieren 2 - Java 94 10 2 Vererbung 2.3 Substitutionsprinzip Finale Klassen Soll eine Klasse nicht vererbbar sein, d.h. also keine Unterklassen bilden können, so muss sie mit dem Modifizierer final versehen werden Unterklassen können Eigenschaften der Klasse nicht mehr verändern Einsatz z.B. unter Sicherheitsaspekten Klasse String ist final Strings bleiben immer unveränderlich © Prof. Dr. Björn Dreher Programmieren 2 - Java 95 2 Vererbung 2.3 Substitutionsprinzip Klassenzugehörigkeit überprüfen Operator instanceof boolean b; String str = "Mein String"; b = ( str instanceof String ); b = ( str instanceof Object ); b = ( str instanceof Date ); ... // true // true // false Ergibt auch „wahr“ bei Vergleich mit einer Vorfahrenklasse! Falls true Linker Operand kann sicher einem Objekt der Klasse des rechten Operanden zugewiesen oder in diese Klasse typgewandelt werden: if (myObject instanceof Point) Point p = (Point) myObject; © Prof. Dr. Björn Dreher Programmieren 2 - Java 96 11 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 97 2 Vererbung 2.4 Methoden überschreiben Vererbungsregeln Unterklasse erbt alle sichtbaren Eigenschaften public und protected package, wenn sie im selben Package liegt Methoden können hinzugefügt werden Anderer Name: Neue Methode kommt hinzu Derselbe Name, aber andere Signatur: Methode wird überladen (Overloading) Neue Methode mit veränderter Signatur kommt hinzu Derselbe Name, dieselbe Signatur und derselbe Rückgabetyp: Methode wird überschrieben (Overriding) © Prof. Dr. Björn Dreher Unterklasse implementiert die Methode der Oberklasse neu Neue Methode verändert das bisherige Verhalten Spezialisierung Basis für Polymorphismus Programmieren 2 - Java 98 12 2 Vererbung 2.4 Methoden überschreiben Aufrufen einer Methode der Oberklasse Überschreiben einer Methode: Völlig neue Implementierung Könnte man nicht die überschriebene Methode aufrufen, diese bestimmte Basisarbeit verrichten lassen ... und dann zusätzliche Anweisungen anhängen (CodeWiederverwendung)? Abhilfe: Schlüsselwort super class Kleidung { protected String farbe; public void setFarbe (String f) { farbe = f; } public String getFarbe() { return farbe; } public String kennung() { return "Ich habe die Farbe " + farbe + " und "; } } © Prof. Dr. Björn Dreher class Socke extends Kleidung { public String kennung() { return super.kennung() + " ich bin eine Socke!"; } } class Hose extends Kleidung { public String kennung() { return super.kennung() + " ich bin eine Hose!"; } } 99 Programmieren 2 - Java 2 Vererbung 2.4 Methoden überschreiben Regeln zu super Entspricht der this-Referenz super bezeichnet dasselbe Objekt wie this, nur als Typ der Oberklasse Damit stehen verdeckte Methoden (und verdeckte Attribute) der Oberklasse zur Verfügung class Oben { int i = 1; void m() { System.out.println("Ich bin Oben"); } } class Unten extends Oben { int i = 2; void m() { super.m(); System.out.println("Ich bin Unten"); System.out.println(super.i); System.out.println(i); } } super ist nicht schachtelbar, um sich entlang der Vererbungshierarchie nach oben zu hangeln! © Prof. Dr. Björn Dreher Programmieren 2 - Java 100 13 2 Vererbung 2.4 Methoden überschreiben Nicht überschreibbare Methoden Will man unterbinden, dass ein Entwickler eine Methode in einer Unterklasse überschreibt und somit neu definiert Schlüsselwort final vor die Methodendefinition class Ober { final void sicher() { } } class Unter extends Ober { void sicher() { } } Compilerfehler! © Prof. Dr. Björn Dreher Programmieren 2 - Java 101 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 102 14 2 Vererbung 2.5 Basisklasse Object Wurzel aller Java-Klassen Alle Methoden werden geerbt oder können überschrieben werden Object + getClass(): Class + hashCode(): int + equals(obj: Object): boolean + toString(): String + notify(): void + notifyAll(): void + wait(timeout: long): void + wait(timeout: long, nanos: int): void + wait(): void # clone(): Object # finalize(): void © Prof. Dr. Björn Dreher Programmieren 2 - Java 103 2 Vererbung 2.5 Basisklasse Object public final Class getClass() Gibt das zugehörige Klassenobjekt zurück Klassenobjekte repräsentieren jeweils eine Klasse Meta-Informationen über Objekte, u.a. Verfügbare Attribute und Methoden Name der Klasse Hose meineHose = new Hose(); System.out.println( meineHose.getClass().getName() ); public int hashCode() Möglichst eindeutige Integerzahl für ein Objekt Inhaltlich gleiche Objekte (gemäß equals()) müssen denselben Hash Code liefern Anwendung: Speichern von Objekten in Hash-Tabellen © Prof. Dr. Björn Dreher Programmieren 2 - Java 104 15 2 Vererbung 2.5 Basisklasse Object public String toString() Identifikation eines jeden Objektes durch eine Zeichenkette Z.B. Werte der Attribute in lesbarer Form Neue Klassen sollten diese Methode überschreiben Wird automatisch aufgerufen, wenn print() oder println() eine Objektreferenz übergeben bekommen Sichtbarkeit sollte public bleiben Standard-Implementation in Object public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); © Prof. Dr. Björn Dreher Programmieren 2 - Java 105 2 Vererbung 2.5 Basisklasse Object public boolean equals(Object obj) Vergleichsoperator zwischen zwei Objektreferenzen if (ob1 == obj2) ... liefert true, wenn beide Referenzen auf dasselbe Objekt zeigen Prüft nicht inhaltliche Gleichheit: if (meinName == "Ulli") ... kann false liefern, auch wenn meinName denselben Stringwert enthält Stattdessen: String meinName = "Ulli"; if (meinName.equals("Ulli")) ... // liefert true Vorsicht: Nicht jede Klasse implementiert ihre eigene equals()-Methode String tut das © Prof. Dr. Björn Dreher Programmieren 2 - Java 106 16 2 Vererbung 2.5 Basisklasse Object equals(), null und hashCode() Vergleich mit null liefert immer false if (meinName.equals(null)) ... // liefert false Bei Gleichheit via equals() muss auch hashCode() identische Werte liefern Bei Point Objekten wird der Hash Code auf der Basis der beiden Koordinaten berechnet Folge: Wird equals() überschrieben, muss meistens auch hashCode() überschrieben werden © Prof. Dr. Björn Dreher Programmieren 2 - Java 107 2 Vererbung 2.5 Basisklasse Object Eigene Methode clone() Objekt kann sich selbst klonen Exakte Kopie von sich selbst Von Object geerbtes clone(): Flache Kopie Eigenes clone(): Tiefe Kopie ist möglich Aufräumen mit finalize() Aufgerufen, wenn Garbage Collector Objekt entfernen möchte Freigeben erworbener Ressourcen Datei schließen Dynamische Objekte freigeben (nicht unbedingt nötig) Keine Garantie, dass überhaupt irgendwann aufgerufen wird! Wenn überschrieben, dann auch immer finalize() der Oberklasse aufrufen: super.finalize(); © Prof. Dr. Björn Dreher Programmieren 2 - Java 108 17 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 109 2 Vererbung 2.6 Polymorphismus Überschreiben einer Methode (Overriding) Oberklasse kann einfache Implementierung vorgeben Unterklasse kann diese durch Überschreiben spezialisieren Laufzeitumgebung sucht in Klassenhierarchie von unten nach oben nach passender Methode Hätte Hose keine kennung(), würde die von Kleidung aufgerufen class Kleidung { protected String farbe; public void setFarbe (String f) { farbe = f; } public String getFarbe() { return farbe; } public String kennung() { return "Ich habe die Farbe " + farbe + " und "; } } © Prof. Dr. Björn Dreher class Socke extends Kleidung { public String kennung() { return super.kennung() + " ich bin eine Socke!"; } } class Hose extends Kleidung { public String kennung() { return super.kennung() + " ich bin eine Hose!"; } } Programmieren 2 - Java 110 18 2 Vererbung 2.6 Polymorphismus Polymorphismus durch dynamische Bindung public class WasIstAllesKleidung { public static void main(String args[]) { Kleidung [] kl = new Kleidung[2]; Socke s = new Socke(); s.setFarbe("rot"); Hose h = new Hose(); h.setFarbe("grau"); Wird hier kennung() von Kleidung oder von Socke bzw. Hose aufgerufen? for (int i = 0; i < 2; i++) System.out.println( kl[i].kennung() ); } } Als Voreinstellung werden Methoden in Java dynamisch gebunden Zur Laufzeit wird festgestellt, zu welcher Klasse das Objekt gehört Dann wird die zugehörige Methode aufgerufen In C++: Virtuelle Methoden © Prof. Dr. Björn Dreher 111 Programmieren 2 - Java 2 Vererbung 2.6 Polymorphismus Keine dynamische Bindung: Bei nicht überschreibbaren Methoden private static final class NoPolymorphismWithPrivate { public static void main( String args[] ) { Unter unsicht = new Unter(); System.out.println( unsicht.bar() ); // Å--} } Hier wird in bar() furcht() von class Ober { private int furcht() { return 2; } int bar() { return furcht(); } } class Unter extends Ober { int furcht() { return 1; } } © Prof. Dr. Björn Dreher Programmieren 2 - Java Ober aufgerufen! furcht() wird statisch gebunden! Kein Compilerfehler: Unterklasse weiß nichts von privater Methode der Oberklasse 112 19 2 Vererbung 2.6 Polymorphismus Konstruktoren in der Vererbung Konstruktoren werden nicht vererbt Zu Beginn eines Konstruktors wird immer automatisch der StandardKonstruktor der Oberklasse aufgerufen: super(); Initialisiert den geerbten Teil des Objektes Möglichkeit, einen parametrisierten Konstruktor der Oberklasse aufzurufen: public GraphObject(double x, double y, String farbe) { this.x = x; this.y = y; this.farbe = new String(farbe); } public Kreis(double x, double y, String farbe, double radius){ super(x, y, farbe); Kreis ist Nachfahre von this.radius = radius; GraphObject } © Prof. Dr. Björn Dreher Programmieren 2 - Java 113 Programmieren 2 – Java Überblick: 2. Vererbung 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Vererbung in Java Substitutionsprinzip Methoden überschreiben Basisklasse Object Polymorphismus Abstrakte Klassen © Prof. Dr. Björn Dreher Programmieren 2 - Java 114 20 2 Vererbung 2.7 Abstrakte Klassen Klassen, von der keine Instanzen gebildet werden sollen Wurzelklasse einer Klassenhierarchie Kann/soll vielleicht noch nicht voll ausprogrammiert werden Hält gemeinsame Attribute vor Realisiert schon voll implementierbare Methoden Gibt für abstrakte Methoden die Signatur vor Implementierung liegt bei den Unterklassen Eine konkrete Unterklasse muss diese Methode implementieren Wenn nicht, ist auch sie abstrakt Gegenteil: Konkrete Klasse: Es können davon Instanzen gebildet werden © Prof. Dr. Björn Dreher 115 Programmieren 2 - Java 2 Vererbung 2.7 Abstrakte Klassen Abstrakte Klasse Basisklasse für Container, der alle Nachfahren enthalten können soll Wurzel einer is-a Beziehungshierarchie Gibt Signaturen für Unterklassen vor Bereits „fertige“ Methoden abstract class Kleidung { können hier voll protected String farbe; implementiert werden und public void setFarbe (String farbe = f; werden so geerbt } Andere Methoden werden public String getFarbe() { in Unterklasse überschrieben, return farbe; } wenn sich dort das public String kennung() { Verhalten ändert f) { return "Ich habe die Farbe " + farbe + " und "; } } © Prof. Dr. Björn Dreher Programmieren 2 - Java 116 21 2 Vererbung 2.7 Abstrakte Klassen Abstrakte Methoden Methode, die in der (abstrakten) Klasse noch nicht implementiert werden kann Besitzt keinen Methodenrumpf Gibt jedoch bereits Signatur vor public abstract double flaeche(); Nachfahrenklassen müssen diese Methode implementieren, damit von ihnen Instanzen erzeugt werden können Eine Klasse mit mindestens einer abstrakten Methode muss selbst auch als abstrakt definiert sein © Prof. Dr. Björn Dreher Programmieren 2 - Java 117 2 Vererbung 2.7 Abstrakte Klassen Beispiel Tier alter: int setAlter(a: int): void istSaeuger(): boolean ausgabe(): void Saeugetier istSaeuger(): boolean Delphin Mensch ausgabe(): void ausgabe(): void © Prof. Dr. Björn Dreher abstract class Tier { int alter = -1; void alterSetzen( int a ) { alter = a; } abstract boolean istSaeuger(); abstract void ausgabe(); } abstract class Saeugetier extends Tier { boolean istSaeuger() { return true; } } class Mensch extends Saeugetier { void ausgabe() { System.out.println( "Ich bin ein Mensch" ); } } class Delphin extends Saeugetier { void ausgabe() { System.out.println( "Ich bin ein Delphin" ); } } Programmieren 2 - Java 118 22 2 Vererbung 2.7 Abstrakte Klassen Unser Beispiel Tier m = new Mensch(); Tier d = new Delphin(); Aufgrund des Substitutionsprinzips möglich Standard-Konstruktor wird aufgerufen Auch der der Superklasse Auch wenn sie abstrakt ist Kann jedoch nicht direkt aufgerufen werden Tier s = new Saeugetier(); // geht nicht! Auch Attribute werden initialisiert (alter = -1)! Aufruf von m.ausgabe(); d.ausgabe(); liefert Ich bin ein Mensch Ich bin ein Delphin © Prof. Dr. Björn Dreher Programmieren 2 - Java 119 2 Vererbung 2.7 Abstrakte Klassen abstract und final ? abstract: Keine Instanz final: Keine Vererbung Widerspruch Compiler lässt das nicht zu! © Prof. Dr. Björn Dreher Programmieren 2 - Java 120 23