Einführung in die Programmierung mit Java

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

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

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

Javakurs für Anfänger

Javakurs für Anfänger

Kapitel 6. Vererbung

Objektorientierte Programmierung Studiengang Medieninformatik

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Fallstudie: Game of Life

6. Globalübung (zu Übungsblatt 8)

Javakurs für Anfänger

Programmierkurs Java

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

Programmierung Nachklausurtutorium

JAVA 05: Objektorientierte Konzepte

12 Abstrakte Klassen, finale Klassen und Interfaces

II.4.1 Unterklassen und Vererbung - 1 -

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

Algorithmen und Datenstrukturen 07

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

Vererbung, Polymorphismus

Einführung in die Programmierung mit Java

Einführung in die Programmierung

Objekte und Klassen. Eigene Definition von Klassen. Methoden. Konstruktoren. Instanzvariablen. UML Notation. Gleichheit von Objekten

Polymorphie. 15. Java Objektorientierung II

Polymorphie. 15. Java Objektorientierung II

9. Vererbung und Polymorphie. Informatik Vererbung und Polymorphie 1

II.4.1 Unterklassen und Vererbung - 1 -

Objektorientierte Programmierung. Kapitel 14: Interfaces

Vorkurs Informatik WiSe 15/16

Vererbung. Martin Wirsing. Ziele. Vererbung

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

Die Klasse java.lang.object. Thorsten Treffer

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

14 Abstrakte Klassen, finale Klassen, Interfaces

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

14. Java Objektorientierung

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

Informatik II Übung 6

1 Abstrakte Klassen, finale Klassen und Interfaces

Einstieg in die Informatik mit Java

Vererbung, Polymorphie

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

Tafelübung 07 Algorithmen und Datenstrukturen

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

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

14. Java Objektorientierung

Wiederholung. Klassenhierarchie:

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

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

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

Die abstrakte Klasse Expression:

II.4.1 Unterklassen und Vererbung - 1 -

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

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

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

Klassen und ihre Beziehungen II: Einfache Vererbung und Abhängigkeit

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

4. Vererbung Die Klasse Object. Die Klasse Object

Ersetzbarkeit und Verhalten

Kapitel 4: Klassen und Unterklassen

Programmieren in Java

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Vererbung und Polymorphie

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

II.4.1 Unterklassen und Vererbung - 1 -

Liste Programmieren Java Überblick

Java Einführung Vererbung und Polymorphie. Kapitel 13

Tag 8 Repetitorium Informatik (Java)

Java Vererbung. Inhalt

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

Programmierkurs C++ Abstrakte Klassen und Methoden

Das Interface-Konzept am Beispiel der Sprache Java

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots IT I - VO 5 1

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

Klassen und Konstruktoren in Java

IT I: Heute. Nachbetrachtung Wissensüberprüfung. Einführung Vererbung. Roboter in becker.robots. Filialenbelieferung 4.11.

Einführung in die Programmierung mit Java

Algorithmen und Datenstrukturen

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

Java I Vorlesung Vererbung und Sichtbarkeit

Programmieren 1 09 Vererbung und Polymorphie

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

Client-Server-Beziehungen

Interfaces und Vererbung

Erste Java-Programme (Java Wiederholung & Vererbung)

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots. falls Zeit: Scheduling 8.11.

Statische Methoden, Vererbung, Benutzereingabe

Transkript:

Einführung in die Programmierung mit Java Teil 8: Vererbung Martin Hofmann Steffen Jost LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 1. Dezember 2015 Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-293

Inhalt Teil 8: Vererbung 1 Motivation 2 Unterklassen einer Klasse 3 Vererbung von Instanzvariablen und Methoden Instanzvariablen Konstruktoren Methoden 4 Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen 5 Vererbung und Spezifikation 6 Abstrakte Methoden 7 Zusammenfassung Vererbung Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-294

Motivation Motivation Oft hat man sehr ähnliche Klassen, welche ähnlichen Code enthalten. Die Duplikation von Code ist aber generell schlecht (erschwert Wartung, Korrektheitsbeweise, etc.). Java bietet Vererbung an, um die Funktionalität einer Klasse ohne Duplikation von Code zu erweitern oder auch zu spezialisieren. Die Erben einer Klasse behalten die Funktionalität des Vorfahren, aber können neue Funktionalität anbieten. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-295

Motivation Beispiel: Bankkonto public class Bankkonto { private double kontostand; private String besitzer; Wdh. public Bankkonto() { this("steffen", 5.0); public Bankkonto(String besitzer, double betrag) { kontostand = betrag; this.besitzer = besitzer; public double getkontostand() { return kontostand; public boolean istueberzogen() { return kontostand < 0.0; public void einzahlen(double betrag){ kontostand += betrag; public void abheben (double betrag){ kontostand -= betrag; public void ueberweisen(double betrag, Bankkonto empfaenger){ this.abheben(betrag); empfaenger.einzahlen(betrag); Hinweis: Am Anfang eines Konstruktors ruft this(... ) einen anderen Konstruktor der Klasse mit anderen Argumenten auf. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-296

Motivation Beispiel: Bankkonto beerben public class Sparkonto extends Bankkonto { /* Neue Instanzvariablen, z.b. Zinssatz */ /* Neue Methoden, z.b. Zinsen berechnen */ /* Neue Konstruktoren, z.b. mit Angabe des Zinssatzes */ Alle bisherigen Methoden bleiben verfügbar, als hätte man sie in die Definition von Sparkonto() hineinkopiert. Bisherige private Instanzvariablen sind ebenfalls vorhanden, sind aber nicht sichtbar in hier neu definierten Methoden. Für Konstruktoren gelten besondere Regeln. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-297

Motivation Beispiel: Sparkonto Ein Sparkonto ist ein Bankkonto mit zusätzlicher Funktionalität: public class Sparkonto extends Bankkonto { private double zinssatz; public Sparkonto(double satz) { zinssatz = satz; public void zinsenanrechnen() { double zinsen=this.getkontostand()*zinssatz/100.0; this.einzahlen(zinsen); // Aufruf geerbte Methode Man könnte hier überall this. auch weglassen. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-298

Motivation Verwendung Sparkonto johannasspar = new Sparkonto(1.25); johannasspar.einzahlen(200.0); johannasspar.zinsenanrechnen(); System.out.println("Johannas Sparkonto: " + johannasspar.getkontostand()); Ausgabe: Johannas Sparkonto: 207.5625 Erklärung: (200 + 5) (1 + 1.25 100 ) = 207.5625 Der Konstruktor Bankkonto() setzt den Kontostand auf 5.00 (Geschenk der Sparkasse); der geerbte Konstruktor wird also auch noch aufgerufen! Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-299

Motivation Funktionsweise Beim Aufruf johannasspar.zinsenanrechnen(); wird folgender Code ausgeführt: double zinsen = johannasspar.getkontostand() * zinssatz / 100.0; johannasspar.einzahlen(zinsen); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-300

Unterklassen einer Klasse Terminologie Bankkonto ist die Oberklasse (superclass) von Sparkonto. Sparkonto erbt von (inherits from) Bankkonto. Sparkonto ist eine Unterklasse (subclass) von Bankkonto. In Java hat jede Klasse nur genau eine Oberklasse. Eine Klasse kann aber mehrere Unterklassen haben. Beispiel: Bankkonto könnte noch weitere Unterklassen haben, wie etwa Girokonto, Tagesgeldkonto, etc. Auch von Unterklassen kann man weiter vererben. Zum Beispiel ein Prämiensparkonto als Unterklasse von Sparkonto, etc. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-301

Unterklassen einer Klasse UML-Notation Ein Pfeil mit hohler Dreieckspitze von Unterklasse zu Oberklasse zeigt Vererbung im UML-Klassendiagramm an: Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-302

Vererbung von Instanzvariablen Konstruktoren Methoden Vererbung von Instanzvariablen Alle Instanzvariablen der Oberklasse werden vererbt; private-instanzvariablen sind in der Unterklasse vorhanden, aber nicht mehr sichtbar! Allerdings können ererbte Methoden der Oberklasse auf alle vererbten Instanzvariablen zugreifen! Beispiel Ein Sparkonto hat also die Instanzvariablen kontostand, besitzer und zinssatz. Neu geschriebene Methoden können aber nur zinssatz direkt beeinflussen. Hinweis Man kann eine Instanzvariable als protected kennzeichnen. Dann ist sie auch in den Unterklassen sichtbar (und in allen Klassen derselben package). Von Verwendung wird aus diversen Gründen abgeraten! Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-303

Vererbung von Instanzvariablen Konstruktoren Methoden Konstruktoren der Unterklasse Konstruktoren werden nicht vererbt. In einem Konstruktor kann aber ein Konstruktor der Oberklasse mit super(... ) aufgerufen werden. Man sollte einen Konstruktor der Oberklasse immer zu Beginn des Konstruktors der Unterklasse aufrufen, damit die ererbten privaten Instanzvariablen geeignet initialisiert werden! Beispiel: public Sparkonto(String besitzer, double satz) { super(besitzer, 0.0); zinssatz = satz; Geschieht dies nicht (wie im ursprünglichen Sparkonto-Beispiel), so wird der Defaultkonstruktor (ohne Parameter) der Oberklasse automatisch eingefügt. Fehlt er, so gibt es einen Compilerfehler! Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-304

Vererbung von Instanzvariablen Konstruktoren Methoden Überschreiben public-methoden werden vererbt. private-methoden werden nicht vererbt; geerbte public-methoden rufen diese aber weiterhin auf. Geerbte Methoden können überschrieben werden wie bei Interface-Implementierung Überschreiben Definiert man in der Unterklasse eine Methode, die es in der Oberklasse schon gibt (Name und Parameterzahl und -typen stimmen überein), so wird die ererbte Methode überschrieben (engl. overriding). Die neudefinierte Methode ersetzt die alte überall, d.h. auch in unveränderten geerbten Methoden (!!!), welche die überschriebene Methode verwenden. Es empfiehlt sich erneut, die @Override Annotation vor der Definition eine überschriebenen Methode zu schreiben, damit der Kompiler dies prüfen kann. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-305

Vererbung von Instanzvariablen Konstruktoren Methoden Beispiel: Girokonto public class Girokonto extends Bankkonto { private int anzahltransaktionen; private double gebuehrensatz; public Girokonto(double satz) { super(); anzahltransaktionen = 0; gebuehrensatz = satz; @Override public void einzahlen(double betrag) { super.einzahlen(betrag); anzahltransaktionen++;. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-306

Vererbung von Instanzvariablen Konstruktoren Methoden @Override public void abheben(double betrag) { super.abheben(betrag); anzahltransaktionen++;. public void gebuehrenabziehen() { double gebuehren = anzahltransaktionen * gebuehrensatz; super.abheben(gebuehren); anzahltransaktionen = 0; Jede Ein-/Auszahlung erhöht nun einen internen Zähler! super ermöglicht Aufruf der geerbten Methode. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-307

Vererbung von Instanzvariablen Konstruktoren Methoden Bemerkungen Die Pseudovariable super bezeichnet das aktuelle Objekt aufgefasst als Objekt der Oberklasse. super.super.foo() ist nicht erlaubt! Jede Klasse hat nur eine Oberklasse! Hätten wir in gebuehrenabziehen statt super.abheben(betrag); einfach nur this.abheben(gebuehren); geschrieben, so wären für das Abziehen der Gebühren gleich wieder welche fällig geworden.... was vermutlich Realität entspricht?!? Wir können in Girokonto nicht schreiben kontostand = kontostand - gebuehren; da kontostand nicht sichtbar ist. Wir könnten natürlich eine neue Instanzvariable mit Namen kontostand deklarieren, dann hätte aber jedes Objekt zwei verschiedene Instanzvariablen des Namens kontostand Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-308

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Subtyping Ein Objekt der Unterklasse kann immer dort verwendet werden, wo ein Objekt der Oberklasse erwartet wird. Ganz analog zu Interface-Typen! Beispiel: Sparkonto johannasspar = new Sparkonto(1.25); Bankkonto matthiasgiro = new Bankkonto(); matthiasgiro.ueberweisen(200, johannasspar); Zur Erinnerung: public void ueberweisen(double betrag,bankkonto empfaenger) Zwischen der Unterklasse und der Oberklasse besteht eine ist-ein -Beziehung (engl. is a -relationship). Beispiel: Bankkonto-Array kann auch Sparkonten enthalten! In den Anwendungen ergibt sich durch Subtyping oft eine komplexe Klassenhierarchie. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-309

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Klassenhierarchie in UML Ein Pfeil mit hohler Dreieckspitze von Unterklasse zu Oberklasse zeigt Vererbung im UML-Klassendiagramm an: Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-310

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Geschachtelte Vererbung Ist B eine Unterklasse von A, so kann man ohne weiteres eine Unterklasse C von B definieren. Jedes Objekt der Klasse C ist dann automatisch ein Objekt der Klasse B und als solches auch ein Objekt der Klasse A. Die Oberklasse von C ist aber nur B. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-311

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Beispiel: Festgeldkonto public class Festgeldkonto extends Sparkonto { private int restjahre; private double strafgebuehr; @Override public void zinsenberechnen() { restjahre = restjahre-1; super.zinsenanrechnen(); @Override public void abheben(double betrag) { if (restjahre > 0) super.abheben(strafgebuehr); super.abheben(betrag); public Festgeldkonto(int jahre,int gebuehr,double zinssatz){ super(zinssatz); strafgebuehr = gebuehr; restjahre = jahre; Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-312

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Dynamische Bindung Jedes Objekt gehört trotz Subtyping zu einer festen Klasse. Welche Methode bei einem Objekt aufgerufen wird, richtet sich immer nach seiner echten Klasse, auch dann, wenn es per Subtyping als Objekt der Oberklasse benutzt wird. Dies bezeichnet man als dynamische Bindung (engl. dynamic dispatch). Beispiel Bankkonto matthiasgiro = new Girokonto(0.25); Sparkonto johannasspar = new Sparkonto(200.0); johannasspar.ueberweisen(100.0, matthiasgiro); Hier fallen bei matthiasgiro Gebühren an, obwohl die Methode einzahlen in Bankkonto eigentlich keine Gebühren beaufschlagt! Es wird aber die überschriebene Methode verwendet! Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-313

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Typecast und instanceof Hat ein Ausdruck den Typ einer Oberklasse, so kann man ihn explizit auf die Unterklasse konvertieren: Bankkonto matthiasgiro = new Girokonto(0.25); Girokonto y = (Girokonto)matthiasGiro; Wird eine Typkonversion (type cast) der Form (A)e ausgewertet, so wird überprüft, ob die tatsächliche Klasse von e Unterklasse (evtl. über mehrere Ecken) von A ist: Falls ja: Auswertung wird fortgesetzt Falls nein: Programmabbruch Der Typ des Ausdrucks (A)e ist A Der Ausdruck e instanceof A hat den Wert true genau dann, wenn die tatsächliche Klasse von e unterhalb von A liegt. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-314

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Die Klasse Object Die Klasse Object steht an der Spitze jeder Klassenhierarchie. Sie definiert die Methoden String tostring() /* in einen String konvertieren */ boolean equals(object other) /* auf Gleichheit testen */ Object clone() /* Kopie des Objektes anlegen */ Diese Methoden kann man in einer Klasse überschreiben. Dies sollte man auch tun, damit diese Methoden immer sinnvoll funktionieren! Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-315

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Übungen I Was ist b.getkontostand() am Ende? Sparkonto b = new Sparkonto(10); b.einzahlen(4995); b.abheben(b.getkontostand() / 2); b.zinsenanrechnen(); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-316

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Übungen II Was sollte hier Unterklasse sein, was Oberklasse: Angestellter-Vorgesetzter Polygon- Dreieck Doktorstudent-Student Person-Student Angestellter-Doktorstudent Bankkonto-Girokonto Fahrzeug-Pkw Fahrzeug-Van Pkw-Van Lkw-Fahrzeug Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-317

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Übungen III Die Klasse Sub sei Unterklasse von Sandwich. Welche der folgenden Zuweisungen sind erlaubt? Sandwich x = new Sandwich(); Sub y = new Sub(); x = y; y = x; y = new Sandwich(); x = new Sub(); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-318

Subtyping Klassenhierarchie Dynamische Bindung Klasse Object Übungen Übungen IV class A { public void exec() { this.doit(); public void doit() { System.out.println("A"); class B extends A { public void doit() { System.out.println("B"); class C extends B { public void doit() { System.out.println("C"); Was wird ausgegeben bei folgendem Code? A a = new B(); B b = new C(); a.exec(); b.exec(); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-319

Vererbung und Spezifikation Behavioural Subtyping Hat man in einer Oberklasse Methoden durch Vor- und Nachbedingungen spezifiziert, so sollten überschreibende Versionen davon auch dieser Spezifikation genügen. Der Vorteil ist dann, dass Spezifikationen für sämtliche geerbte Methoden fortgelten. Ebenso sollten Invarianten, die in der Oberklasse vereinbart wurden, auch von den Methoden der Unterklasse eingehalten werden. Liegen all diese Bedingungen vor, so sagt man, die Unterklasse sei ein behavioural subtype der Oberklasse. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-320

Vererbung und Spezifikation Verstärkung von Invarianten bei Vererbung Eine Unterklasse kann eine stärkere Invariante verlangen als die Oberklasse z.b. positive breite & hoehe müssen auch noch gleich sein Die Vererbungsregeln für Konstruktoren unterstützen dies. Beispiel: Quadrat als Unterklasse von Rechteck public class Rechteck { private int x, y, breite, hoehe; public Rechteck(int x, int y, int breite, int hoehe) { this.x=x;this.y=y;this.breite=breite;this.hoehe=hoehe; public void verschieben(int dx, int dy) { x=x+dx;y=y+dy; public class Quadrat extends Rechteck { public Quadrat(int x, int y, int seite) { super(x,y,seite,seite); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-321

Vererbung und Spezifikation Verstärkung von Invarianten bei Vererbung Eine Unterklasse kann eine stärkere Invariante verlangen als die Oberklasse z.b. positive breite & hoehe müssen auch noch gleich sein Die Mögliches Vererbungsregeln Problem: für Konstruktoren unterstützen dies. Beispiel: Was, wenn Quadrat Rechteck als Unterklasse Änderung von von Rechteck breite und hoehe erlaubt? public class Rechteck { private int x, y, breite, hoehe; public Rechteck(int x, int y, int breite, int hoehe) { this.x=x;this.y=y;this.breite=breite;this.hoehe=hoehe; public void verschieben(int dx, int dy) { x=x+dx;y=y+dy; public class Quadrat extends Rechteck { public Quadrat(int x, int y, int seite) { super(x,y,seite,seite); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-321

Abstrakte Methoden Abstrakte Klassen und Methoden Man kann eine Methodendeklaration in einer Klasse mit dem Schlüsselwort abstract kennzeichnen und keine Implementierung angeben. Die gesamte Klasse muss dann auch das Schlüsselwort abstract tragen. Man kann dann von dieser Klasse keine Instanzen erzeugen (new ist also verboten). Allerdings kann man von der Klasse erben und dann die abstrakten Methoden konkret implementieren. Verbleiben abstrakte Methode, muss die Klasse abstrakt bleiben. Abstrakte Klassen wurden inzwischen von Interfaces weitestgehend abgelöst. Ein Interface bietet sich meist an, wenn Instanzvariablen für die konkreten Methoden irrelevant sind. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-322

Abstrakte Methoden Beispiel AbstraktesBankkonto I public abstract class AbstraktesBankkonto { private static int naechstenummer = 0; private int kontonummer; public AbstraktesBankkonto() { kontonummer = naechstenummer; naechstenummer++; public int getkontonummer() { return kontonummer; public abstract void writelog(string s);. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-323

Abstrakte Methoden Beispiel AbstraktesBankkonto I public void abheben(double betrag) { writelog("abhebung: "+betrag); public void einzahlen(double betrag) { writelog("einzahlung: "+betrag);. public void ueberweisen(abstraktesbankkonto b,double betrag){ this.abheben(betrag);b.einzahlen(betrag); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-324

Abstrakte Methoden Beispiel AbstraktesBankkonto II public class Bankkonto extends AbstraktesBankkonto { private double kontostand; public double getkontostand() { return kontostand; public Bankkonto() { super(); kontostand = 0;. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-325

Abstrakte Methoden. @Override public void writelog(string s) { System.out.println ("Kontonr.: " + getkontonummer() + "\n" + s + "\nneuer Kontostand: " + getkontostand()); @Override public void einzahlen(double betrag) { kontostand += betrag; super.einzahlen(betrag); @Override public void abheben(double betrag) { kontostand -= betrag; super.abheben(betrag); Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-326

Abstrakte Methoden Verwendung Ausgabe: b.einzahlen(3); c.einzahlen(6); b.ueberweisen(c,4); Kontonr.: 0 Einzahlung: 3.0 Neuer Kontostand: 3.0 Kontonr.: 1 Einzahlung: 6.0 Neuer Kontostand: 6.0 Kontonr.: 0 Abhebung: 4.0 Neuer Kontostand: -1.0 Kontonr.: 1 Einzahlung: 4.0 Neuer Kontostand: 10.0 Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-327

Zusammenfassung Zusammenfassung: Vererbung Man kann zu einer gegebenen Klasse Unterklassen definieren: class NameDerUnterklasse extends NameDerOberKlasse{ neue Konstruktoren neue Instanzvariablen neue Methoden Instanzvariablen, Methoden der Oberklasse werden geerbt. Private Instanzvariablen der Oberklasse sind in der Unterklasse nicht sichtbar. public und protected Methoden der Oberklasse kann man überschreiben. Die neue Definition ersetzt die alte überall, auch in Definitionen von Methoden der Oberklasse. Mit super kann man auf Methoden und Konstruktoren der Oberklasse zugreifen. Konstruktoren werden nicht vererbt. Ausnahme: Defaultkonstruktor ohne Argumente. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-328

Zusammenfassung Vererbung wird benutzt um is a -Beziehungen softwaretechnisch zu realisieren. Die UML-Notation für Vererbung ist ein Pfeil von der Unter- zur Oberklasse. Object ist automatisch Oberklasse jeder Klasse. Die Methoden equals, tostring der Klasse Object können überschrieben werden. Behavioural subtyping: Spezifikationen aus der Oberklasse werden von der Unterklasse respektiert. Abstrakte Methoden in abstrakten Klassen werden nicht implementiert, sie müssen in konkreten Unterklassen überschrieben werden. Der Einsatz von Interfaces hat inzwischen Vererbung in vielen Fällen ersetzt. Martin Hofmann, Steffen Jost Einführung in die Programmierung Vererbung 8-329