Vererbung, Polymorphie

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

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

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

Objektorientierte Programmierung und Klassen

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

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

Einstieg in die Informatik mit Java

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Klassen mit Instanzmethoden

Einstieg in die Informatik mit Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

5 Vererbung. Subklassen, Superklassen, Pakete Zugriffsrechte

Java Einführung Vererbung und Polymorphie. Kapitel 13

Einführung in die Programmierung

Programmieren in Java

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

Vererbung und Polymorphie

Kapitel 6. Vererbung

12 Abstrakte Klassen, finale Klassen und Interfaces

Vererbung, Polymorphismus

Programmieren I. Kapitel 8. Vererbung

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 6. Vererbung

Einstieg in die Informatik mit Java

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

5.6 Vererbung. Vererbung

Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

C++ - Objektorientierte Programmierung Vererbung

Java Vererbung. Inhalt

1 Abstrakte Klassen, finale Klassen und Interfaces

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

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

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Implementieren von Klassen

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

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

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Vererbung. Was versteht man unter dem Begriff Vererbung?

Klassen als Datenstrukturen

Einstieg in die Informatik mit Java

Überschreiben von Methoden

Algorithmen und Datenstrukturen

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

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung Studiengang Medieninformatik

Kapitel 6. Vererbung

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmieren in Java

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

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

Programmieren in Java

Programmierung und Angewandte Mathematik

Tafelübung 07 Algorithmen und Datenstrukturen

Klassenvariablen, Klassenmethoden

6. Globalübung (zu Übungsblatt 8)

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Einstieg in die Informatik mit Java

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

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Einstieg in die Informatik mit Java

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Einführung in die Programmiersprache Java II

Einstieg in die Informatik mit Java

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

Repetitorium Informatik (Java)

II.4.1 Unterklassen und Vererbung - 1 -

Java Einführung Methoden in Klassen

Java für Bauingenieure

Vererbung. Martin Wirsing. Ziele. Vererbung

Objektorientierung (OO)

EINFÜHRUNG IN DIE PROGRAMMIERUNG

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

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

Programmierkurs Java

Übersicht. Bisherige Verwendung von Klassen Vererbung. Zeiger auf Objekte (abgeleiteter) Klassen Virtuelle Funktionen Konstruktoren/Destruktoren

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

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

Algorithmen und Datenstrukturen 07

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

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

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Informatik II Übung 06. Benjamin Hepp 5 April 2017

4. Vererbung Die Klasse Object. Die Klasse Object

Programmieren 2 Java Überblick

Vorlesung Datenstrukturen

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

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Objektorientierte Programmierung. Kapitel 14: Interfaces

Tücken der dynamischen Bindung

Transkript:

Vererbung, Polymorphie Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 21.1.08 G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 1 / 23

Übersicht 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren und Vererbung 5 Klassen und final 6 Zugriffsrechte und Vererbung 7 Abstrakte Methoden und Klassen 8 Vergleich zu Schnittstellen G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 2 / 23

Grundlagen Durch Vererbung werden von einer allgemeinen Klasse (Superklasse, Basisklasse) spezielle Klassen (Subklassen, abgeleitete Klassen) abgeleitet. Diese erben die Komponenten der Superklasse und besitzen ggfs. weitere Methoden und Variablen. Syntax class Subklasse extends Superklasse { // eigene Methoden und Variablen G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 3 / 23

Grundlagen In Java ist keine Mehrfachvererbung möglich, d.h. die Subklasse kann nur von einer Superklasse abgeleitet werden. Allerdings ist bei Schnittstellen Mehrfachvererbung wieder erlaubt. Es darf über mehrere Stufen hinweg vererbt werden. Man spricht dann von indirekten Sub und Superklassen, andernfalls von direkten. Alle Klassen ohne Angabe von extends sind abgeleitet von der Superklasse Object. Konstruktoren, static Initialisierer und private Komponenten werden nicht vererbt. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 4 / 23

Grundlagen Beispiel Student matrikelnr... Kursteilnehmer bearbaufgaben... Person name vorname... Beamter dienstalter gehaltsstufe... G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 5 / 23

Verdeckte Variablen Neben den in Kapitel "OOP" schon erwähnten Modifizierern existiert zusätzlich der Modifizierer protected. Der Zugriff auf die entsprechende Komponente ist dabei im gleichen Paket (d.h. allgemein im gleichen Verzeichnis) und in allen Subklassen erlaubt. Achtung Zugriffsrechte beziehen sich auf die Klasse, nicht auf die Instanzen und werden zur Übersetzungszeit geprüft, nicht erst zur Laufzeit! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 6 / 23

Verdeckte Variablen Gleichnamige Variablen in Sub und Superklasse mit gleichem oder verschiedenem Typ sind erlaubt. Die Variablen aus der Superklasse bleiben erhalten, sie werden lediglich verdeckt, d.h. der direkte Zugriff aus der Subklasse heraus ist nicht möglich. Abhilfe schafft der Zugriff mit... Syntax Klassenname.Variablenname super.variablenname ((Superklasse)Instanz).Variablenname bei Klassenvariablen bei Instanzvariablen und direkter Superklasse in beiden Fällen und auch bei indirekter Superklasse Achtung Zwischen Methodennamen und Variablennamen besteht kein Problem. Diese dürfen sowohl innerhalb einer Klasse als auch in Sub und Superklasse den gleichen Namen tragen! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 7 / 23

Verdeckte Variablen Beispiel class Super { int x = 1; int x() { return 2; class Sub extends Super { int x = 3; int x() { return 4; void info() { System.out.println(""+ x + x() + super.x + super.x()); public static void main (String s){ Sub instanz = new Sub(); instanz.info(); // ergibt 3412 Achtung Anstatt super.x kann man auch ((Super) this).x verwenden! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 8 / 23

Verdeckte Methoden Methoden können auch im Zusammenhang mit Vererbung überladen werden, d.h. sie tragen den gleichen Namen, aber eine andere Signatur. Hat in der Subklasse eine Methode den gleichen Namen und die gleiche Signatur wie in der Superklasse, so wird bei einer Objektreferenz automatisch die Methode der Subklasse verwendet (Polymorphie). Der Zugriff auf die Methode der Superklasse erfolgt dann über super.methodenname Achtung Außerhalb der Subklasse ist ein Zugriff nicht möglich, da der Typ von Klassen dynamisch zur Laufzeit bestimmt wird und somit eine Referenz der Superklasse auch auf die Subklasse verweisen darf! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 9 / 23

Verdeckte Methoden Beispiel class Basis { void info() { System.out.println ("Basis"); class Abgeleitet extends Basis { void info() { System.out.println ("abgeleitet"); public static void main (String s){ Abgeleitet a = new Abgeleitet(); a.info(); ((Basis)a).info(); // abgeleitet // auch: abgeleitet // Fehler! Abgeleitet b = new Basis(); Basis b = new Abgeleitet(); // ok! b.info(); // abgeleitet G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 10 / 23

Verdeckte Methoden ref Basis zusätzliche Komponenten Abgeleitet Damit gelten offenbar die folgenden Regeln für Konversionen zwischen Basisklasse und abgeleiteter Klasse: (1) Ein Objekt der abgeleiteten Klasse kann automatisch in ein Objekt der Basisklasse konvertiert werden, da es alle notwendigen Komponenten enthält (Up Cast). (2) Dagegen kann ein Objekt der Basisklasse nicht automatisch in ein Objekt der abgeleiteten Klasse konvertiert werden, da Komponenten fehlen. Ist es aber in Wirklichkeit ein Objekt der abgeleiteten Klasse, dann geht eine explizite Konversion mittels eines Down Cast. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 11 / 23

Verdeckte Methoden Beispiele Basis b = new Basis(); Abgeleitet a = b; // Fehler! Abgeleitet a = (Abgeleitet) b; // Fehler! Abgeleitet a = new Abgeleitet(); Basis b = a; // ok. implizite // Konversion der Referenz Abgeleitet c = (Abgeleitet) b; // ok. b referenziert // Objekt vom Typ Abgeleitet G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 12 / 23

Verdeckte Methoden Programmbeispiel class Basis { void info() { System.out.println("Basis"); class Abgeleitet extends Basis { void info() { System.out.println("abgeleitet"); class Haupt { public void static main (String [] args) { Basis [] a = {new Abgeleitet(), new Basis(), new Abgeleitet() ; for (int i=0; i<a.length; i++){ a[i].info(); // ergibt: abgeleitet Basis abgeleitet // Der Typ der Klasse, zu der die Methode info() gehört, wird erst zur Laufzeit bestimmt (späte Bindung). Bei Methoden mit den Wortsymbolen final, static oder private erfolgt die Bestimmung bereits zur Kompilerlaufzeit (frühe Bindung) keine Polymorphie. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 13 / 23

Konstruktoren und Vererbung Konstruktoren werden nicht vererbt, allerdings kann der Konstruktor der direkten Superklasse aufgerufen werden. Syntax super(parameterliste); Der Aufruf muss als erste Anweisung im Konstruktor der Subklasse stehen. Ohne expliziten Aufruf wird am Anfang der Standardkonstruktor der Superklasse aufgerufen, d.h. der Konstruktor der Subklasse wird ergänzt um super(); Das bedeutet, dass jeder Konstruktor implizit mit dem Aufruf von super() beginnt. Bei der Superklasse wird der Konstruktor der Klasse Object aufgerufen. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 14 / 23

Beispiel class Basis { int x; Basis() { x = 5; // Standardkonstruktor class Abgeleitet extends Basis { int y; Abgeleitet() { // Standardkonstruktor super(); // Standardkonstruktor der y = 6; // Superklasse public static void main(string s){ Abgeleitet a = new Abgeleitet(); System.out.println (a.x); // ergibt 5 System.out.println (a.y); // ergibt 6 Achtung Nicht erlaubt ist der Aufruf der Konstruktors der Superklasse innerhalb von bedingten Anweisungen, da dann der Aufruf nicht an erster Stelle erfolgt! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 15 / 23

Konstruktoren und Vererbung Ablauf der Instanziierung class Vater { int x = 1; class Sohn extends Vater { int y = 2;... Sohn s = new Sohn(); (1) Die Referenz wird angelegt und mit null initialisiert. (2) Es wird Speicher für zwei Werte vom Typ int auf dem Heap (Freispeicher) beschafft. (3) Die Komponenten x und y werden mit Null initialisiert. (4) Den Komponenten x und y werden die Werte 1 bzw. 2 zugewiesen, und es werden ggfs. weitere Initialisiererblöcke ausgeführt. (5) Der Konstruktor (hier: Standardkonstruktor) der Klasse Sohn wird aufgerufen. Dieser ruft als erstes den Standardkonstruktor der Basisklasse Vater und der wiederum den Standardkonstruktor der Klasse Object auf. (6) Die Variable s erhält eine Referenz auf das neu erzeugte Objekt. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 16 / 23

Klassen und final Die Angabe von final ist bei Klassen, Methoden und Instanzen möglich. Dies ist bei Klassen und Methoden sinnvoll, die nicht weiter spezialisiert werden können. Es erhöht die Effizienz, da eine frühe Bindung erfolgen kann. Das bedeutet, dass Methoden eventuell auch inline erzeugt werden (kein Aufruf, keine Parameterübergabe usw.). Desweiteren bietet es einen Schutz vor trojanischen Pferden, die die Funktionalität der Klasse ersetzen könnten. (1) Klassen mit dem Wortsymbol final dürfen nicht vererbt werden. (2) Methoden mit dem Wortsymbol final dürfen nicht vererbt werden, d.h. bei einer Methode mit gleicher Signatur in der abgeleiteten Klasse tritt ein Fehler auf, dagegen ist eine Methode mit einer anderen Signatur erlaubt. (3) Instanzen mit dem Wortsymbol final sind konstant und dürfen folglich nicht verändert werden. Achtung Die Komponenten der Instanz sind damit allerdings nicht automatisch konstant! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 17 / 23

Klassen und final Beispiel class Punkt { int x, y; final void verschiebe (int dx, int dy) { x += dx; y += dy; class FarbPunkt extends Punkt { Color c; void verschiebe (Punkt p) { // ok! x += p.x; y += p.y; // andere Signatur void verschiebe (int dx, int dy) { // Fehler! x += dx; y += dy; // gleiche Signatur public static void main(string s){ final Punkt p = new Punkt (); p = new Punkt (); // Fehler! p = null; // Fehler! p.x = 7; // erlaubt! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 18 / 23

Zugriffsrechte und Vererbung Die Zugriffsrechte von Methoden dürfen beim Überschreiben in der abgeleiteten Klasse nicht reduziert werden. Die Reihenfolge lautet dabei: Achtung private default protected public Die Umkehrung der Reihenfolge ist verboten, da aufgrund der Polymorphie ein Objekt der Basisklasse in Wirklichkeit zur abgeleiteten Klasse gehören kann! In diesem Fall müssen polymorphe Methoden zugreifbar bleiben! Bei Variablen und überladenen Methoden existiert diese Einschränkung nicht! G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 19 / 23

Zugriffsrechte und Vererbung Beispiel class Mutter { private void a() { void b() { protected void c() { public void d() { class Tochter extends Mutter { // Ueberschreiben von Methoden der Superklasse Mutter Folgende Varianten sind beim Überschreiben der Methoden aus der Superklasse Mutter möglich: a(): kein Überschreiben möglich, allerdings ist eine Neudefinition mit beliebigen Rechten möglich. b(): Überschreiben mit default, protected oder public möglich. c(): Überschreiben mit protected oder public möglich. d(): Überschreiben mit public möglich. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 20 / 23

Abstrakte Methoden und Klassen Syntax Achtung abstract class Klassenname { abstract Modifizierer Ergebnistyp Methodenname (...); Abstrakte Methoden dürfen keinen Rumpf besitzen! Ist eine Methode einer Klasse abstrakt, so muss auch die Klasse selber abstrakt sein. Von abstrakten Klassen dürfen keine Instanzen gebildet werden. Die Klassen dienen nur zur Vorlage bei der Vererbung. Die abgeleitete Klasse kann abstrakt sein, muss aber nicht, falls alle abstrakten Methoden durch konkrete Implementierungen überschrieben werden. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 21 / 23

Abstrakte Methoden und Klassen Beispiel Vertrag KaufVertrag VersicherungsVertrag Eine abstrakte Klasse kann auch als Protokollklasse aufgefaßt werden, sie definiert nur ein Interface, keine Implementierung. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 22 / 23

Vergleich zu Schnittstellen Ähnlich zu abstrakten Klassen verhalten sich die beiden folgenden Fälle: Sind alle Konstruktoren private, so können ebenfalls keine Instanzen gebildet werden Schnittstellen (Interfaces) Schnittstelle alle Methoden implizit abstrakt nur Konstanten erlaubt Mehrfachimplementierung Instanziierbare Klasse muss alle Methoden des Interfaces implementieren. abstrakte Klasse Mischung abstrakte/implementierte Methoden erlaubt Variablen, Konstanten, usw. erlaubt Einfachvererbung Instanziierbare Klasse muss alle abstrakten Methoden überschreiben. G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08 23 / 23