Programmieren 2 Java Überblick

Ähnliche Dokumente
Liste Programmieren Java Überblick

Java Einführung Vererbung und Polymorphie. Kapitel 13

4. Vererbung Die Klasse Object. Die Klasse Object

Programmieren 2 Java Überblick

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Java Vererbung. Inhalt

Programmieren in Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen

12 Abstrakte Klassen, finale Klassen und Interfaces

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Einstieg in die Informatik mit Java

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Programmierkurs Java

9. Vererbung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Interfaces und Vererbung

Einführung in die Programmiersprache Java II

Java Schulung (Java 2 Java Development Kit 5 / 6)

3 Objektorientierte Konzepte in Java

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Die Klasse java.lang.object. Thorsten Treffer

Programmierkurs C++ Abstrakte Klassen und Methoden

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Programmieren in Java

Einführung in C# Teil 3. Matthias Nübling

3 Objektorientierte Konzepte in Java

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Kapitel 4: Klassen und Unterklassen

Vererbung. Martin Wirsing. Ziele. Vererbung

Kapitel 6. Vererbung

Einführung in die Programmierung

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Java für Computerlinguisten

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

SWE1 / Übung 9 ( )

Objektorientierte Programmierung Studiengang Medieninformatik

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Zusatzmaterial DIE KLASSE OBJECT. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Einführung in die Programmierung für NF. Vererbung

1 Abstrakte Klassen, finale Klassen und Interfaces

Javakurs für Anfänger

6. Globalübung (zu Übungsblatt 8)

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Java I Vorlesung Vererbung und Sichtbarkeit

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmieren 2 Java Überblick

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

1. Abstrakte Klassen

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Javakurs für Anfänger

Java für Bauingenieure

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung Studiengang Medieninformatik

Programmieren I. Kapitel 8. Vererbung

Objektorientierung (OO)

Objektorientierte Programmierung. Kapitel 14: Interfaces

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Programmieren in Java

Vererbung. Was versteht man unter dem Begriff Vererbung?

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Algorithmen und Datenstrukturen

Vererbung. Oberklassen und Unterklassen

Einstieg in die Informatik mit Java

Objektorientierte Programmierung und Klassen

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Spezifikation, Klassen, Schnittstellen in Java. 2.4 Datenabstraktion, Objektorientierung, Java

Vererbung und Polymorphie

Programmieren in Java -Eingangstest-

Überschreiben von Methoden

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Vererbung und Polymorphie

Grundlagen der Objektorientierung

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Einstieg in die Informatik mit Java

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Programmiertechnik Objektorientierung

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Einstieg in die Informatik mit Java

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Transkript:

Programmieren 2 Java Überblick 1 Klassen und Objekte 3 Schnittstellen 4 Innere Klassen 5 Exceptions 6 Funktionsbibliothek 7 Datenstrukturen und Algorithmen 8 Ein-/Ausgabe 9 Graphische Benutzeroberflächen 10 Applets 11 Internet-Anwendungen Prof. Dr. Björn Dreher Programmieren 2 - Java 75 Programmieren 2 Java Überblick: 2. Vererbung 2.1 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 76

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 Superklasse, allgemeiner Nadelbaum 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.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.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 Basisklasse Basisklasse muss geändert werden. Durch die Vererbung greifen alle untergeordnete Klassen zwangsläufig auf die richtige, geänderte Methode zu. Subklasse 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 Änderung 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

Programmieren 2 Java Überblick: 2. Vererbung 2.1 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 81 2. 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

2. in Java Klassendefinitionen Artikel, Buch, CD public class Article { private int code; // Artikelnummer private String label; // Kurzbeschreibung private int price; public void showinfo() {... 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() {... public class CD extends Article { private String artist; private String[] song; public void showinfo() {... Eine Zeile Kurzinfo über Artikel: code, label, price Informationen zu dem Artikel aufbereitet zur Darstellung in einem separaten Fenster: Verschieden für Bücher und CDs Prof. Dr. Björn Dreher Programmieren 2 - Java 83 2. in Java Klassendefinitionen in UML-Notation Article - code: int - label: String - price: int + showinfo(): void + getarticleline(): String Book - author: String - title: String - publisher: String - year: int + showinfo(): void CD - artist: String - song: String [ ] + showinfo(): void Prof. Dr. Björn Dreher Programmieren 2 - Java 84

2. 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 Sehr wichtig! Eine CD ist ein Artikel Prof. Dr. Björn Dreher Programmieren 2 - Java 85 2. in Java Ein etwas einfacheres Beispiel: Kleidungsstücke Kleidung # farbe: String + setfarbe(string f): void + getfarbe(): String Socke Hose + kennung(): String + kennung(): String class Kleidung { protected String farbe; public void setfarbe (String f) { farbe = f; public String getfarbe() { return farbe; class Socke extends Kleidung { return "Ich bin eine Socke " + "der Farbe " + farbe; class Hose extends Kleidung { return "Ich bin eine Hose " + "der Farbe " + farbe; Prof. Dr. Björn Dreher Programmieren 2 - Java 86

2. 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. 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

Programmieren 2 Java Überblick: 2. Vererbung 2.1 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 89 Zuweisungskompatibilität innerhalb einer Vererbungshierarchie Referenz auf Vorfahrenklasse kann Referenz auf Nachfahrenklasse aufnehmen Kleidung kann Socke oder Hose zugewiesen werden Beide sind Kleidung Wichtiges Konzept der Objektorientierung Überall, wo Oberklasse gefordert ist, kann auch ein Objekt der Unterklasse verwendet werden Unterklasse hat alles, was Oberklasse erwartet, ist nur spezieller Socke + kennung(): String Kleidung # farbe: String + setfarbe(string f): void + getfarbe(): String Hose + kennung(): String Oberklasse kann speziellere Eigenschaften der Unterklasse (ohne besondere Vorkehrungen) nicht nutzen Prof. Dr. Björn Dreher Programmieren 2 - Java 90

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 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

Unser Beispiel Kleidungsstücke modifiziert Kleidung # farbe: String + setfarbe(string f): void + getfarbe(): String + kennung(): String Socke Hose + kennung(): String + kennung(): String class Kleidung { protected String farbe; public void setfarbe (String f) { farbe = f; public String getfarbe() { return farbe; return "Ich bin eine Kleidung"; class Socke extends Kleidung { return "Ich bin eine Socke " + "der Farbe " + farbe; class Hose extends Kleidung { return "Ich bin eine Hose " + "der Farbe " + farbe; Prof. Dr. Björn Dreher Programmieren 2 - Java 93 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]; // Geht nicht! Socke s1 = (Socke) kl[0]; // So geht's Typumwandlung Richtigkeit wird zur Laufzeit geprüft Prof. Dr. Björn Dreher Programmieren 2 - Java 94

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 Klassenzugehörigkeit überprüfen Operator instanceof boolean b; String str = "Mein String"; b = ( str instanceof String ); // true b = ( str instanceof Object ); // true b = ( str instanceof Date ); // 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

Programmieren 2 Java Überblick: 2. Vererbung 2.1 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 97 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) Unterklasse implementiert die Methode der Oberklasse neu Neue Methode verändert das bisherige Verhalten Spezialisierung Basis für Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 98

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 (Code- Wiederverwendung)? Abhilfe: Schlüsselwort super class Kleidung { protected String farbe; public void setfarbe (String f) { farbe = f; public String getfarbe() { return farbe; return "Ich habe die Farbe " + farbe + " und "; class Socke extends Kleidung { return super.kennung() + " ich bin eine Socke!"; class Hose extends Kleidung { return super.kennung() + " ich bin eine Hose!"; Prof. Dr. Björn Dreher Programmieren 2 - Java 99 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

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 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 102

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 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

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 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

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 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

Programmieren 2 Java Überblick: 2. Vererbung 2.1 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 109 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; return "Ich habe die Farbe " + farbe + " und "; class Socke extends Kleidung { return super.kennung() + " ich bin eine Socke!"; class Hose extends Kleidung { return super.kennung() + " ich bin eine Hose!"; Prof. Dr. Björn Dreher Programmieren 2 - Java 110

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 Programmieren 2 - Java 111 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() ); // --- class Ober { private int furcht() { return 2; int bar() { return furcht(); Hier wird in bar() furcht() von Ober aufgerufen! furcht() wird statisch gebunden! class Unter extends Ober { int furcht() { return 1; Kein Compilerfehler: Unterklasse weiß nichts von privater Methode der Oberklasse Prof. Dr. Björn Dreher Programmieren 2 - Java 112

2.6 Polymorphismus Konstruktoren in der Vererbung Konstruktoren werden nicht vererbt Zu Beginn eines Konstruktors wird immer automatisch der Standard- Konstruktor 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); this.radius = radius; Kreis ist Nachfahre von GraphObject Prof. Dr. Björn Dreher Programmieren 2 - Java 113 Programmieren 2 Java Überblick: 2. Vererbung 2.1 Einleitung 2. in Java 2.4 Methoden überschreiben 2.6 Polymorphismus Prof. Dr. Björn Dreher Programmieren 2 - Java 114

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 Programmieren 2 - Java 115 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 können hier voll implementiert werden und werden so geerbt Andere Methoden werden in Unterklasse überschrieben, wenn sich dort das Verhalten ändert abstract class Kleidung { protected String farbe; public void setfarbe (String f) { farbe = f; public String getfarbe() { return farbe; return "Ich habe die Farbe " + farbe + " und "; Prof. Dr. Björn Dreher Programmieren 2 - Java 116

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 Beispiel Delphin ausgabe(): void Saeugetier alter: int istsaeuger(): boolean Tier setalter(a: int): void istsaeuger(): boolean ausgabe(): void Mensch ausgabe(): void 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" ); Prof. Dr. Björn Dreher Programmieren 2 - Java 118

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 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