Vererbung. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Ähnliche Dokumente
Vererbung. Martin Wirsing. Ziele. Vererbung

Beziehungen zwischen Klassen

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Kapitel 6. Vererbung

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

Einstieg in die Informatik mit Java

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

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

Vererbung, Polymorphie

Algorithmen und Datenstrukturen

Spezifikation und Test: Zusicherungen in Klassendiagrammen

12 Vererbung. 12 Vererbung. 12 Vererbung. 12 Vererbung

Einstieg in die Informatik mit Java

12 Abstrakte Klassen, finale Klassen und Interfaces

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

12.1 Das Schlüsselwort super

Assoziation und Aggregation

Java Einführung Vererbung und Polymorphie. Kapitel 13

3 Objektorientierte Konzepte in Java

Programmieren in Java

1 Vererbung. Beobachtung: Oft werden mehrere Klassen von Objekten benötigt, die zwar ähnlich, aber doch verschieden sind. Säugetiere. Hominiden.

4. Vererbung Die Klasse Object. Die Klasse Object

Assoziation und Aggregation

Überschreiben von Methoden

Die Klasse java.lang.object. Thorsten Treffer

5.6 Vererbung. Vererbung

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

1 Abstrakte Klassen, finale Klassen und Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces

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

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

Java Vererbung. Inhalt

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

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

Liste Programmieren Java Überblick

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

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

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

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

6. Globalübung (zu Übungsblatt 8)

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

Objektorientierte Programmierung Studiengang Medieninformatik

Programmieren I. Kapitel 8. Vererbung

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

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

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

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

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

Programmieren 2 Java Überblick

Algorithmen und Datenstrukturen

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

3 Objektorientierte Konzepte in Java

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

Java I Vorlesung Vererbung und Sichtbarkeit

Javakurs für Anfänger

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Objektorientierung (OO)

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

13 Polymorphie. Problem:

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

III. Objektorientierte Programmierung. Aufruf einer Methode. Definition einer Methode. Bezug zur aufrufenden Instanz. Instanzen einer Klasse

Einführung in die Programmierung

Java: Vererbung. Teil 3: super()

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

Einstieg in die Informatik mit Java

Objektorientierte Programmierung Studiengang Medieninformatik

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

1 Klassen und Objekte

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

Programmieren in Java

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

Methoden und Wrapperklassen

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

Algorithmen und Datenstrukturen 07

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

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Vererbung. Oberklassen und Unterklassen

SWE1 / Übung 9 ( )

Interfaces und Vererbung

Kapitel 4: Klassen und Unterklassen

Einstieg in die Informatik mit Java

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

Einführung in die. objektorientierte Programmierung

Tücken der dynamischen Bindung

1. Abstrakte Klassen

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

1 Polymorphie (Vielgestaltigkeit)

Vererbung und Polymorphie

Übungsblatt 7. Was ist die Ausgabe de facto? Entspricht die Ausgabe Ihren Erwartungen?

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Testen mit JUnit. Martin Wirsing. Ziele. Arten von Tests. Testen. Whitebox-Test. Unit-Test

Testen mit JUnit. Martin Wirsing. Ziele. Arten von Tests. Testen. Lernen Unit Tests zu schreiben Lernen mit Unit-Testen mit JUnit durchzuführen

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

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

Transkript:

Vererbung Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang http://www.dbs.ifi.lmu.de/lehre/nfinfosw WS 07/08

2 Ziele Den Begriff der einfachen Vererbung verstehen Vererbung und Redefinition von Oberklassenmethoden verstehen Vererbungspolymorphie verstehen Die Klasse Object kennenlernen

3 Vererbung Klasse D ist Erbe einer Klasse C, falls D alle Attribute und Methoden von C erbt, in UML: C Superklasse von D in Java: class D extends C D Subklasse von C d.h D besitzt alle Methoden und Attribute von C und von allen Oberklassen von C. Man nennt C auch allgemeiner als D bzw. D spezieller als C.

4 Vererbung C T1 m() x m() D T2 y n() Attribute von D = {y Attribute von C Methoden von D = {n() Methoden von C Folgerung: Die Vererbungsbeziehung ist transitiv: Wenn C von B erbt, dann besitzt D auch alle Attribute und Methoden von B

5 Vererbung Beispiel: Sparkonto Ein Sparkonto ist ein Bankkonto, bei dem Zinsen gezahlt werden: type var ist Java-Variante der UML Notation; in Standard UML: var : type Analog in Standard UMl: m(par):restype statt restype m(par) BankAccount SavingsAccount double interestrate SavingsAccount (double rate) void addinterest () double getinterest()

6 public class BankAccount { private double balance; public BankAccount() { balance = 0.0; public BankAccount( double initialbalance) { balance = initialbalance; public void deposit(double amount) { balance = balance + amount; public void withdraw(double amount) { balance = balance - amount; public double getbalance() { return balance; public void transferto(bankaccount other,double amount) { withdraw(amount); other.deposit(amount); BankAccount in Java BankAccount - double balance + void deposit (double amount) + void withdraw (double amount) + double getbalance() + void transferto ( BankAccount other, double amount)

7 Implementierung in Java public class SavingsAccount extends BankAccount { private double interestrate; public SavingsAccount(double rate) { super(0.0); interestrate = rate; public void addinterest() { double interest = getbalance() * interestrate/100; // auf das Attribut balance kann hier //nicht zugegriffen werden deposit(interest); // geerbte Methode Zugriff auf Konstruktor der Oberklasse siehe später

8 Vererbung C Ist D ist Erbe von C, so gilt: D Man kann von D aus nicht direkt auf die privaten Attribute von C zugreifen, sondern nur mittels nichtprivater (geerbter) Zugriffsmethoden von C. Eine Variable der Klasse D kann jede nicht-private Methode von C aufrufen. Einer Variablen der Klasse C kann man ein Objekt eines Nachfahren zuweisen. Beispiel: D d =...; C c = d; Umgekehrt kann man einer Variablen vom Typ D KEIN Objekt einer Vorfahrenklasse zuweisen. Beispiel: D d1 = c; //falsch!

9 Abhängigkeitsrelation (Verwendungsrelation, engl. dependency) Die Klasse A ist abhängig von der Klasse C, wenn A Elemente der Klasse C (i.a. Methoden) benützt, UML C A Beispiel: In unserem Beispiel erhalten wir BankAccount SavingsAccount SavingsAccountTest

SavingsAccountTest in Java 10 Beispiel: public class SavingsAccountTest { public static void main(string)[] args) { SavingsAccount sparkonto = new SavingsAccount(5); BankAccount konto1 = sparkonto; //ok Sparkonto vom //spezielleren Typ konto1.deposit(1000); // ok // konto1.addinterest(); // nicht ok, da konto1 // nicht den Typ einer // Subklasse hat (SavingsAccount)konto1.addInterest(); // ok, wegen Typcast sparkonto.getbalance(); // ok, geerbte Methode konto1.getbalance(); // ok

11 Redefinition von Methoden In vielen Fällen kann man die Implementierung einer Methode m nicht direkt von der Superklasse übernehmen, da z.b. die neuen Attribute in der Superklasse nicht berücksichtigt werden (können). Dann ist es nötig, für die Erbenklasse eine neue Implementierung von m anzugeben. Redefinition von m in UML: Methodenkopf von m wird in der Erbenklasse noch einmal angegeben; Java: neue Implementierung für m im Erben Bemerkung: Bei der Redefinition wird die alte Methode nicht überschrieben; man kann auf sie mit der speziellen Variable super zugreifen. Genauer gesagt, greift man mit super.m() auf die nächste Methodenimplementierung von m in der Vererbungshierarchie zu.

12 Redefinition von Methoden und Konstruktoren Beispiel: Girokonto Bei einem Girokonto werden bei jeder Transaktion Gebühren verlangt BankAccount deposit withdraw getbalance Redefinition nötig CheckingAccount SavingsAccount deductfees deposit withdraw addinterest getinterest

13 Redefinition von Methoden Statische Konstanten, die für jede Instanz public class CheckingAccount extends BankAccount von CheckingAccount { private int transactioncount; gelten. public static final int FREE_TRANSACTIONS = 3; public static final double TRANSACTIONS_FEE = 0.3; public void deposit(double d) { super.deposit(d); // Aufruf von BankAccount::deposit transactioncount++; public void withdraw(double d) { super.withdraw(d); // Aufruf von BankAccount::withdraw transactioncount++;

14 Redefinition von Methoden Fortsetzung public void deductfees() { if (transactioncount > FREE_TRANSACTIONS) { double fees = TRANSACTIONS_FEE * (transactioncount - FREE_TRANSACTIONS); super.withdraw(fees); transactioncount = 0;

15 Redefinition von Konstruktoren Zugriff auf einen Konstruktor einer Superklasse: bzw. super(); super(p 1,...,p n ); // parameterloser Konstruktor // Konstruktor mit n Parametern Bemerkung: Dieser Aufruf muss die erste Anweisung des Subklassenkonstruktors sein.

16 Redefinition von Konstruktoren Beispiel: CheckingAccount public CheckingAccount(double initialbalance) { super(initialbalance); // muss 1. Anweisung sein transactioncount = 0; Äquivalent dazu könnte man die Methode deposit verwenden: public CheckingAccount(double initialbalance) { // super(); Standardkonstruktor wird automatisch // aufgerufen, wenn 1. Anweisung kein Konstruktor ist. transactioncount = 0; super.deposit(initialbalance); // super.m() kann // überall im Rumpf // vorkommen

17 Falscher Zugriff auf super Man kann mit super(...) nur auf den Konstruktor der direkten Oberklasse zugreifen, aber nicht transitiv auf Konstruktoren weiter oben liegender Klasse. Die Compilerausgabe für diesen, im folgenden Beispiel zu findenden Fehler lautet: >javac C.java C.java:17: cannot resolve symbol symbol : constructor B (int,int) location: class B super(a, b); ^ 1 error

18 Redefinition von Methoden und Konstruktoren class A { A(int a, int b) { System.out.println(a); System.out.println(b); A(){ class B extends A { B(int a, int b, int c) { super(a, b); class C extends B { C(int a, int b, int c, int d) { super(a, b); public static void main(string args[]) { C c = new C(1, 2, 3, 4);

19 Vererbungspolymorphie und dynamisches Binden Vererbungspolymorphie Man spricht von Vererbungspolymorphie, wenn eine Methode von Objekten von Subklassen aufgerufen werden kann. Dynamisches Binden Falls eine Methode T m(t 1 x 1,..., T n x n ) mehrere Implementierungen besitzt (die im Vererbungsbaum übereinander liegen), so wird bei einem Aufruf o.m(a 1,..., a n ) die richtige Implementierung dynamisch bestimmt und zwar sucht man ausgehend von der Klasse des dynamischen Typs von o die speziellste Methodendeklaration, auf die der Methodenaufruf anwendbar ist (genauer siehe übernächste Folie). Man nennt dies auch dynamische Bindung, da der Methodenrumpf erst zur Laufzeit ausgewählt wird. Dagegen wird bei statischer Bindung (nicht in Java) der Methodenrumpf zur Übersetzungszeit bestimmt.

20 C m() n() D m() E m() Beispiel für Dynamische Bindung D d = exp1; //exp1 sei vom Typ D d.n(); //Aufruf von n in C F f = exp2; //exp2 sei vom Typ F d = f; //Wert von d ist Instanz von F d.m(); //Aufruf von m in E d.n(); //Aufruf von n in F F n()

21 Vererbungspolymorphie und dynamisches Binden Dynamisches Binden Methodenaufruf in Java von o.m(a 1,...,a n )mit o vom Typ D und a 1,...,a vom Typ T n 1,..., T n. Ein Methodenkopf R m(p 1,..., P n ) der Klasse C heißt anwendbar auf o.m(a 1,...,a n ), wenn C gleich D oder allgemeiner als D ist und wenn jedes P i gleich T i oder allgemeiner als T i ist (für i=1,...,n). Für den Aufruf einer Methode wird zunächst zur Übersetzungszeit der speziellste Methodenkopf R m(p 1,..., P n ) bestimmt, der auf o.m(a 1,...,a n ) anwendbar ist. Zur Laufzeit suche die speziellste Klasse C mit einer Methodendeklaration mit Namen m und Parametertypen P 1,..., P n, so daß C allgemeiner oder gleich D ist. Wähle diese Methodendeklaration für den Aufruf.

22 Vererbungspolymorphie und dynamisches Binden Dynamisches Binden Methodenaufruf in Java von o.m(a 1,...,a n )mit o vom statischen Typ D und a 1,...,a vom Typ T n 1,..., T n. Ein Methodenkopf R m(p 1,..., P n ) der Klasse C heißt anwendbar auf o.m(a 1,...,a n ), wenn C gleich D oder allgemeiner als D ist und wenn jedes P i gleich T i oder allgemeiner als T i ist (für i=1,...,n). C Beispiel m() n() D m() C c = exp1; D d = exp2; c.m(); //m in C anwendbar auf c.m() // aber m in D nicht anwendbar auf c.m() d.n(); //n in C anwendbar auf d.n() d.m(); //m in C und D beide anwendbar auf d.m() //m(d x) ist spezieller als m(c x)

23 Vererbungspolymorphie und dynamisches Binden Dynamisches Binden Methodenaufruf in Java von o.m(a 1,...,a n )mit o vom statischen Typ D und a 1,...,a vom Typ T n 1,..., T n. Ein Methodenkopf R m(p 1,..., P n ) der Klasse C heißt anwendbar auf o.m(a 1,...,a n ), wenn C gleich D oder allgemeiner als D ist und wenn jedes P i gleich T i oder allgemeiner als T i ist (für i=1,...,n). C Beispiel m(c x) int m() n() D m(d x) String n() C c = exp1; D d = exp2; d.m(c); int a = d.n(); d.m(d); //m(c x) in C anwendbar auf d.m(c), aber nicht m(d x) in D // int n() in C anwendbar aber nicht String n() //beide m (in C und D) anwendbar auf d.m(d)

24 Vererbungspolymorphie und dynamisches Binden Dynamisches Binden Zur Übersetzungszeit wird zunächst der speziellste Methodenkopf R m(q 1,..., Q n ) bestimmt, der auf o.m(a 1,...,a n ) anwendbar ist. Zur Laufzeit bestimme den dynamischen Typ D1 von o; wenn D1 eine Methodendeklaration R m(q1,..., Qn) enthält, wende diese Methode an; andernfalls suche die speziellste Klasse C mit Methodendeklaration R m(q1,..., Qn), so daß C allgemeiner oder gleich D1 ist und wähle diese Methodendeklaration für den Aufruf.

25 Formen der Polymorphie Polymorphie Ad hoc Polymorphie Universelle Polymorphie Überladen...... Vererbunngspolymorphie

26 Formen der Polymorphie Polymorphie: aus dem Griechischen: vielgestaltig Überladen 2 oder mehrere Operationen mit demselben Namen, aber verschiedener Implementierung und Semantik Beispiel: Addition auf ganzen Zahlen und Gleitpunktzahlen Vererbungspolymorphie: Eine Methode der Klasse C kann auch von Objekten eines Subtyps von C aufgerufen werden. Beispiel: deposit von BankAccount kann auch von Instanzen von SavingsAccount aufgerufen werden.

Die Klasse Object 27 Object ist die allgemeinste Klasse in Java. Alle Klassen sind Erben von Object. Beispiel Object BankAccount Point Hallo SavingsAccount CheckingAccount

Die Klasse Object 28 Die Klasse Object besitzt u.a. die folgenden Methoden, die man häufig benötigt: Textrepräsentation von this Object String tostring() boolean equals(object o)... n n Vergleich zweier Objekte

Die Klasse Object 29 String tostring(): Die tostring-methode erzeugt eine Textrepräsentation einer Klasse. Im Allgemeinen ist es nötig, für selbstdefinierte Klassen eine tostring-methode zu definieren. Beispiel: BankAccount String tostring() { return BankAccount[balance is + balance + ] ;

30 Die Klasse Object boolean equals(object o): equals vergleicht die Objektreferenzen von this und o. Im Allgemeinen ist es nötig, für selbstdefinierte Klassen eine equals-methode zu definieren, wenn die Attributwerte und nicht Objektreferenzen verglichen werden sollen. :C a = null this.equals(o1) == true this o1 o2 b = 100 this.equals(o2) == false :C a = null b = 100

31 Zusammenfassung (I) Die Abhängigkeitsbeziehung C gibt an, dass D Symbole der Klasse C verwendet. D Die Vererbungsbeziehung hat folgende Eigenschaften: C D Für Variablen gilt: a) Jedes Attribut von C ist automatisch Attribut von D. Möglicherweise kann man aber auch von D nicht direkt darauf zugreifen! b) Ein neu definiertes Attribut von D ist nicht Attribut von C. c) Einer lokalen Variablen oder einem Parameter der Klasse C kann ein Objekt der Klasse D zugewiesen werden (aber nicht umgekehrt, dazu ist ein gültiger Cast nötig!)

32 Zusammenfassung (II) Für Methoden gilt: a) Jede Methode von C ist automatisch eine Methode von D und kann daher mit Objekten von D aufgerufen werden (Vererbungspolymorphie). Eine Methode von D kann aber nicht von einer lokalen Variablen vom Typ C aufgerufen werden. b) Soll in einem Methodenrumpf auf die Methode der Superklasse zugegriffen werden, verwendet man spezielle Variable super. c) In der Subklasse D können Methoden redefiniert werden. Solche Methoden müssen im UML-Diagramm der Klasse D explizit genannt werden. C d) Beim Methodenaufruf wird die passende Methodenimplementierung zur Laufzeit ausgewählt (dynamisches Binden). D