INE2 OOP mit Java 2 Vererbung, Polymorphismus. Vererbung zur Erweiterung Vererbung zur Anpassung Oberklassen Aufruf Konstruktoren Polymorphismus

Ähnliche Dokumente
Vererbung, Polymorphismus

Vererbung, Polymorphismus

Objektorientierte Programmierung Studiengang Medieninformatik

Einstieg in die Informatik mit Java

Vererbung, Polymorphie

Kurs OPR. Objektorientierte Programmierung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

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

Programmieren in Java

Algorithmen und Datenstrukturen 07

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

Javakurs für Anfänger

JAVA 05: Objektorientierte Konzepte

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

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

Programmieren in Java

Algorithmen und Datenstrukturen

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

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Arten von Klassen-Beziehungen

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

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

Javakurs für Anfänger

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

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

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

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

Tafelübung 07 Algorithmen und Datenstrukturen

4. Vererbung Die Klasse Object. Die Klasse Object

6. Globalübung (zu Übungsblatt 8)

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

Abstrakte Klassen, Interfaces

Programmierung Nachklausurtutorium

Objektorientierte Programmierung Studiengang Medieninformatik

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

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

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

Grundelemente objektorientierter Sprachen (1)

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

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

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

Vererbung und Polymorphie

Fragen zur OOP in Java

Vorkurs Informatik WiSe 15/16

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

Objektorientierung (OO)

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Java Einführung Vererbung und Polymorphie. Kapitel 13

Klassen und Konstruktoren in Java

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

Repetitorium Informatik (Java)

Objektorientierte Programmierung und Klassen

Objektorientierte Programmierung III

Grundelemente objektorientierter Sprachen (1)

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

Grundelemente objektorientierter Sprachen (1)

C++ - Objektorientierte Programmierung Vererbung

Programmieren in Java

Algorithmen und Datenstrukturen II

1. Abstrakte Klassen

Gliederung. Algorithmen und Datenstrukturen II. Java: Objektorientierung. Java: Objektorientierung. Objektorientierung in JAVA. D.

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

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

Programmiertechnik Klassenvariablen & Instantiierung

Implementieren von Klassen

Die Klasse java.lang.object. Thorsten Treffer

Einführung in die Programmiersprache Java II

Einführung in die Programmierung

Programmierkurs Java

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

Vererbung. Oberklassen und Unterklassen

Kapitel 4: Klassen und Unterklassen

Begriffe 1 (Wiederholung)

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

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

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung (OOP)

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

Arten von Klassen-Beziehungen

7. Übung Informatik II - Objektorientierte Programmierung

Java I Vorlesung Vererbung und Sichtbarkeit

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Vererbung. Martin Wirsing. Ziele. Vererbung

Programmierung und Angewandte Mathematik

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

Informatik II Übung 6

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

Einstieg in die Informatik mit Java

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

12 Abstrakte Klassen, finale Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces

II.4.1 Unterklassen und Vererbung - 1 -

Info B VL 8: Abstrakte Klassen & Interfaces

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

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Transkript:

INE2 OOP mit Java 2 Vererbung, Polymorphismus Vererbung zur Erweiterung Vererbung zur Anpassung Oberklassen Aufruf Konstruktoren Polymorphismus

Einführung Beispiel Automobilbau: Eine Firma produziert eine Limousine Ein Kunde möchte einen solchen PW, aber als Kombi Was macht die (gute) EntwicklungsingenieurIn? Mögliche Alternativen: Sie/er baut ein neues Auto von Grund auf Sie/er übernimmt möglichst viel von der bestehenden Limousine Am besten ist sie/er dran, wenn sie bereits das erste Auto so modular (mit Hilfe von Komponenten) entwickelt hat, dass die Umwandlung in einen Kombi einfach möglich ist 2 von 50

Lösung Beispiel Automobilbau: Autokonzern entwickelt eine Grundplattform Auf dieser Plattform können verschiedene Modelle verschiedener Marken aufgebaut werden Individualisierung geschieht über unterschiedliche Ausrüstung (=Erweiterung) Motorisierung (=Anpassung), etc. Vorteile: Hohe Entwicklungskosten können besser amortisiert werden Neue Modelle können schneller zur Marktreife gebracht werden 3 von 50

Ziele bei der Softwareentwicklung Ziele bei der Softwareentwicklung: A) Software möglichst aus bestehenden Bausteinen (Klassen) zusammenbauen B) Bei Bedarf diese Bausteine an die spezifischen Anforderungen anpassen selten passen die Bausteine zu 100% Anpassen von Software erweitern und modifizieren Lösung 1: Anpassen in der Quelle, oft möglich aber: Quelle kann nicht (mehr) vorhanden sein Änderungen sind schwierig, weil Quellen sehr umfangreich und Zusammenhänge u.u. nicht klar Änderungen (z.b. Bug Fix) müssen später u.u. an verschiedenen Quellen nachgeführt werden Änderungen können Einfluss auf bestehende Systeme haben 4 von 50

Wiederverwendung von Software (Teilen) spart Zeit (z.b. die Klasse Math und die Collections - später) Meist existiert schon Software/Bibliotheken, die einen Teil der Funktionalität aufweist Ändern einer bestehenden Software in der Quelle ist aufwendig: Quellen muss zuerst verstanden werden Neue Fehler, Inkompatibilitäten mit anderen Komponenten können entstehen Umfangreiche Tests auch der bestehenden Teile werden daher nötig Lösungsansatz der OOP: Die verwendeten Teile der Software werden belassen wie sie sind Nötige Änderungen und Ergänzungen erreicht man durch Vererbung und Erweiterung 5 von 50

Objektorientierte Programmierung Die Objektorientiert Programmierung ermöglicht die Anpassung von Klassen, ohne dass man die Quellen benötigt Open-Closed Prinzip: Software-Einheiten sollten offen für Erweiterungen, aber geschlossen für Modifikationen sein Bestehende Bausteine dürfen nicht verändert werden Die Modifikation der Funktionalität sollte immer eine Erweiterung sein Bsp: z.b. eine Ampel unterstützt 3 statt 2 Phasen -> bestehende Steuerungen müssen nicht angepasst werden. Der Mechanismus für die Erweiterung und Modifikation von Klassen heisst Vererbung 6 von 50

Vererbung zur Erweiterung 7 von 50

Vererbung in Java Es seien zwei Klassen gegeben: Klasse Kugel Klasse Ballon // gleich wie Kugel aber Position kann nachträglich verändert werden public class Kugel { private int x, y; public draw(graphics g) { g.filloval(..) public class Ballon { private int x, y; public draw(graphics g) { g.filloval(..) Code Code Verdoppelung Verdoppelung public Kugel (int x, int y) {... public Balloon(int x, int y) {... public void setpos(int newx, int newy){ x = newx; y = newy; 8 von 50

Vererbung zur Erweiterung Die Klasse Ballon ist gleich wie die Klasse Kugel, mit dem Unterschied, dass die Position nachträglich verändert werden kann. Die Klasse Ballon erweitert die Klasse Kugel(Klasse Ballon ist von der Klasse Kugel abgeleitet) Terminologie: Die Klasse Kugel heisst entsprechend Oberklasse (superclass) von der Klasse Ballon Die Klasse Ballon heisst Unterklasse (subclass) von der Klasse Kugel Kugel superclass, superclass, Oberklasse Oberklasse Basisklasse Basisklasse Symbol Symbol für für Vererbung Vererbung Ballon subclass subclass Unterklasse Unterklasse abgeleitete Klasse abgeleitete Klasse 9 von 50

Vererbung in Java: extends Die Klasse Ballon erbt von Kugel Klasse Kugel (ev.vorbereitet für Vererbung) Klasse Ballon // gleich wie Kugel aber Position kann nachträglich verändert werden protected: protected: sind sind in in abgeleiteten abgeleiteten Klassen Klassen sichtbar sichtbar (aber (aber nicht nicht in in andern andern Klassen) Klassen) Ballon Ballon erbt erbt von von Kugel; Kugel; sämtliche sämtliche public public und und protected protected Methoden Methoden und und Attribute Attribute können können innerhalb innerhalb der der Klasse Klasse angesprochen angesprochen werden werden public class Kugel { protected int x, y; public draw(graphics g) { g.filloval(..) public Kugel(int x, int y) { this.x = x; this.y = y; public class Ballon extends Kugel { public void setpos(int newx, int newy){ x = newx; y = newy; public Ballon (int x, int y) { 10 von 50

Vererbung in Java Klasse Ballon erbt Attribute (Instanzvariablen und Klassenvariablen) und Operationen (Methoden) von der Klasse Kugel Attribute und Operationen der Klasse Kugel sind auch in der Klasse Ballon (wie die eigenen) zugreifbar. In Java kann nur von einer Klasse geerbt werden (Einfachvererbung ) im Gegensatz zu z.b. C++ (siehe Anhang) Kugel Kugel Ballon Methoden Methoden Ballon 11 von 50

Vererbung in Java Die Unterklasse erhält keine Kopien der Variablen und Methoden, sondern den Zugriff auf die Attribute und Methoden der Oberklasse Die Unterklasse kann sodann beliebig zusätzliche Methoden und Instanzvariablen deklarieren (wie bei jeder Klasse) Allgemeine Deklaration einer Unterklasse: class Unterklassenname extends Oberklassenname { Instanzvariablendeklarationen Konstruktorendeklarationen Methodendeklarationen 12 von 50

Vererbung zur Anpassung 14 von 50

Vererbung zur Anpassung Es seien zwei Klassen gegeben: Klasse Kugel Klasse Billard // gleich wie Kugel aber es wird noch eine Zahl angezeigt Konkret: die Methode draw soll angepasst werden Kugel Billardkugel Billardkugel Methoden Methoden Kugel 15 von 50

Überschreiben von Methoden Falls eine Methode in der Unterklasse genau den gleichen Namen und die gleichen Parameter (Signatur) aufweist, wie eine Methode in der Oberklasse, so wird die Methode der Oberklasse überschrieben. Wie die Funktionalität damit angepasst werden kann, wird im Abschnitt Polymorphismus genauer beschrieben Vorsicht: Falls die Deklaration nicht genau mit der in der Oberklasse übereinstimmt, wird die Methode überladen statt überschrieben! D.h. beide Methoden würden dann in der Unterklasse nebeneinander existieren, die geerbte und die neu geschriebene Überladen (overloading)!= Überschreiben (overriding) (siehe Anhang) 16 von 50

Überschreiben von Methoden Es seien zwei Klassen gegeben: Klasse Kugel Klasse Billardkugel // gleich wie Kugel aber sie wird anders gezeichnet public class Kugel { protected int x, y; @Override @Override optional optional aber empfohlen aber empfohlen public void draw(graphics g) { g.filloval(..) public Kugel(int x, int y) { public class Billardkugel extends Kugel { @Override public void draw(graphics g) { g.filloval(..); g.drawstring (..); public Billardkugel (int x, int y) { 17 von 50

Überschreiben von Methoden Eine Methode einer Oberklasse ist überschrieben, wenn in einer ihrer Unterklassen eine Methode mit demselben Methodenkopf (Signatur) steht Falls die ursprüngliche Methode in der Oberklasse von der Unterklasse aus aufgerufen werden soll, so muss der Objektname super verwendet werden: super.methodenname(...); super bezeichnet das aktuelle Objekt, das aber als Objekt der Oberklasse interpretiert wird entsprechend wird die Methode der Oberklasse aufgerufen Beispiel: innerhalb der Klasse Billardkugel kann die draw Methode der Oberklasse aufgerufen werden @Override public void draw (g) { super.draw(g); g.drawstring(..); 18 von 50

Überschreiben (shadowing) von Attributen Falls in der Unterklasse eine (public oder protected) Instanzvariable mit gleichem Namen wie in der Oberklasse deklariert wird, ist die Instanzvariable der Oberklasse in der Unterklasse nicht mehr zugreifbar. Dies wird auch als "Überschatten" (shadowing) bezeichnet public class Kugel { protected int x, y;... public class Billardkugel extends Kugel { private int x, y;... Führt oft zu Problemen Das Überschreiben von Attributen sollte vermieden werden! 19 von 50

Zugriffsmodifikator: protected protected-methoden/instanzvariablen sind sichtbar in allen Unterklassen der Klasse, in der die Variable/Methode deklariert ist Zur Erinnerung: lokale Variablen (innerhalb Methoden deklariert) sind nur innerhalb derselben Methode sichtbar Billardkugel Kugel 20 von 50

Zugriffsmodifikatoren Übersicht Zugriffsmodifikator Sichtbarkeit gleiche Klasse Unterklasse andere Klasse private ja nein nein protected ja ja nein public ja ja ja Grundsatz: Variablen immer mit den minimal möglichen/sinnvollen Sichtbarkeit deklarieren. Laufvariablen: for (int i = 0; lokale Variablen: void foo() {int i;... private Instanzvariablen: public class T {private int i; protected Instanzvariablen: public class T {protected int i; public Instanzvariablen: public class T {public int i;... 21 von 50

Klassen Vererbungshierarchie Vererbungs-Hierarchie Eine Klasse ohne explizite Oberklasse erbt in Java implizit von der Klasse Object Jede Unterklasse kann seinerseits von weiteren Unterklassen erweitert werden Dadurch entsteht eine baumartige Hierarchie von Unterklassen (Baum steht aber auf dem Kopf) Object equals() Kugel int x,y void draw() Diese Vererbungs-Hierarchie kann in einem sog. Klassendiagramm dargestellt werden Beispiel UML-Klassendiagramm: Vererbungs-Hierarchie der Klasse Kugel Ballon void setpos() Billardkugel void draw() Zeppelin void move() 22 von 50

Die Oberklasse Object Jede Klasse in Java erbt automatisch und implizit von der Klasse java.lang.object Object Zwei Methoden somit in allen Klassen vorhanden (später mehr) Kugel String tostring() // Returns a string representation of the object. boolean equals(object obj) // Indicates whether some other object is "equal to" this one. 23 von 50

Oberklassen Methodenaufruf 24 von 50

Aufruf von Methoden der Oberklasse Innerhalb einer Klasse kann jede beliebige Methode einer Oberklasse (wie eine eigene) aufgerufen werden. sofern sie public oder protected ist Beispiel: innerhalb der Klasse Zeppelin kann ich setpos() der Oberklasse (Ballon) aufrufen public void move (int dx) { setpos(x+dx, y); 25 von 50

Konstruktoren 26 von 50

Konstruktoren Repetition: Beim Erzeugen eines Objekts wird der entsprechende Konstruktor ausgeführt Instanzvariablen des erzeugten Objekts werden initialisiert Kugel kugel = new Kugel( ); Jede Klasse hat einen oder mehrere Konstruktoren (heissen gleich wie Klasse) mit unterschiedlichen Parameterlisten Neu: Beim Erzeugen eines Objekts der Unterklasse, muss der entsprechende Konstruktor der Oberklasse ausgeführt werden, um dessen Instanzvariablen zu initialisieren public class Kugel { protected int x, y; public Kugel(int x, int y) { this.x = x; this.y = y;? public class Billardkugel extends Kugel { private int zahl; public Billardkugel (int x, int y, int zahl) {... 27 von 50

Konstruktor ohne Parameter Automatismus: Instanz- und Klassenvariablen werden automatisch d.h. von der Java Laufzeitumgebung zu 0 (null, false) initialisiert. Automatismus: Falls ein Konstruktor ohne Parameter (=Standardkonstruktor) in der Oberklasse vorhanden ist, dann wird dieser automatisch vor der Ausführung des Konstruktors der Unterklasse aufgerufen automatisch, automatisch, implizit implizit public class Kugel { protected int x, y; public Kugel() { this.x = 100; this.y = 100; public class Billardkugel extends Kugel { private int zahl; public Billardkugel (int x, int y, int zahl) { this.zahl = zahl; Initialisierung Initialisierung der der Unterklasse Unterklasse 28 von 50

Konstruktoren: super Falls ein anderer als der Standardkonstruktor in der Oberklasse ausgeführt werden soll, so muss der Programmierer selbst diesen Oberklassen Konstruktur aufrufen. public class Kugel { protected int x, y; public class Billardkugel extends Kugel { private int zahl; public Kugel(int x, int y;) { this.x = x; this.y = y; explizit explizit public Billardkugel (int x, int y, int zahl) { super(x,y); this.zahl = zahl; Und zwar als erste Anweisung im Konstruktor der Unterklasse 29 von 50

Konstruktoren Automatismus: Falls eine Klasse keinen Konstruktor aufweist, wird von Java automatisch ein Standard-Konstruktor eingefügt. Wird aber wieder entfernt, sobald ein eigener Konstruktor vorhanden ist Dieser macht nichts anderes, als den Oberklassen Konstruktor aufzurufen und sieht dementsprechend folgendermassen aus: Klassenname(){ super(); Mit diesen Mechanismen garantiert Java, dass beim Erzeugen eines Objekts einer Klasse die Konstruktoren aller Oberklassen der Klasse ausgeführt werden, bevor der Konstruktor der Klasse selbst ausgeführt wird. Der erste Konstruktor, der immer ausgeführt wird ist also der Konstruktor der Oberklasse Object. Danach werden die Konstruktoren der direkten Unterklassen der Reihe nach ausgeführt bis zur aktuellen Klasse. 30 von 50

Konstruktoren Aufruf- Reihenfolge Ausführungs- Reihenfolge Object Beispiel: equals() Wird im Klassendiagramm ein Objekt der Klasse Zeppelin Kugel erzeugt, so werden der Reihe nach int x,y void draw() folgende Konstruktoren ausgeführt: 1.Object(); 2.Kugel(); 3.Ballon(); Ballon Billardkugel 4.Zeppelin(); void setpos() Zeppelin void move() void draw() Die Konstruktoren werden von unten nach oben aufgerufen (explizit oder impliziert). Die Ausführungsreihenfolge ist dann aber von oben nach unten! 31 von 50

Kontrollfrage Was passiert, wenn die Unterklasse keinen Konstruktor hat und die Oberklasse hat einen, aber keinen ohne Aufrufparametern??!! 32 von 50

final bei Attributen und Methoden Manchmal möchte man vermeiden, dass Instanzvariablen oder Methoden einer Klasse überschrieben werden können. Vorgehen: Variable oder Methode als final deklarieren final-methode oder -Variable kann nicht mehr überschrieben werden. public final static int DEFAULTX = 100; public final void setpos(int newx, int newy){ x = newx; y = newy; static final Variablen: entsprechen Konstanten in anderen Sprachen Klassenvariablen, die nicht überschrieben werden können. Java-Konvention: Namen von Konstanten in GROSSBUCHSTABEN schreiben Beispiel: Die Konstante Pi = 3.1415 ist in der Klasse Math definiert und kann von überall her mit dem Namen Math.PI verwendet werden 33 von 50

final bei Klassen Es können auch ganze Klassen als final deklariert werden: Klasse kann nicht mehr erweitert (subclassed) werden Alle Methoden der Klasse sind dann automatisch auch final public final class Billardkugel extends Kugel { private int zahl;.. Erschwert/verhindert Erweiterbarkeit: sparsam einsetzen Beispiel: Die Klasse System ist als final deklariert. 34 von 50

Erweitern von Java-Bibliotheksklassen Auch (alle nicht final) Klassen in Java-Bibliotheken können durch selbst programmierte Klassen erweitert werden (ohne den Java-Code kennen zu müssen!) Beispiel: Klasse JForm Um ein Form zu schreiben, haben wir jeweils eine Unterklasse der Klasse Form geschrieben: public MyProgram extends JForm {... MyProgram erbt alle Methoden von der Klasse Form und deren Oberklassen Die Methoden paint(graphics g) der Klasse Form müssen in MyProgram überschrieben werden Wird mit @Override gekenntzeichnet (guter Stil aber nicht verlangt) Wie findet man die nötigen Informationen über Bibliotheksklassen? In der Online-Dokumentation nachschauen "Java ist auch eine Insel" online mit guten Code-Beispielen 35 von 50

Entwurfsgrundsatz: Vererbung Vererbung sollte nur verwendet werden, wenn eine "ist-ein"-beziehung zur Oberklasse besteht Bsp: Billarkugel ist eine Kugel d.h. gesamte Funktionalität der Kugel macht auch bei der Billardkugel einen Sinn. Aber: Bsp: Billardkugel ist kein Ballon: Ballon kann Grösse verändern, steigen und sinken "Zeppelin ist Ballon" ist eigentlich schon ein Grenzfall 36 von 50

Übung Vererbungen in der Praxis Entwickeln Sie aus: Fahrzeug, PKW, Taxi, Nutzfahrzeug, Bus, Bagger, Lastwagen, VW, Golf, Ferrari, Testerossa einen Vererbungsbaum. Zeichnen Sie das dazugehörige Klassendiagramm. 37 von 50

Polymorphismus 38 von 50

Die Prinzipien der OOP Die zentralen Konzepte von OOP sind: Kapselung (encapsulation): Zusammengehörige Informationen in Objekten gruppieren und sie gegenüber der Aussenwelt abschirmen: letzte Vorlesung Erweiterung durch Vererbung (inheritance): Neue Klassen können aus existierenden Klassen abgeleitet werden, ohne dass die Integrität der Originalklasse beeinträchtigt wird (Open-closed Prinzip): die vorhergehenden Folien dieser Vorlesung Polymorphismus (polymorphism): folgende Folien dieser Vorlesung 39 von 50

"Vielgestaltigkeit" Polymorphismus Polymorphismus ("Vielgestaltigkeit" ) beschreibt eine Eigenschaft objektorientierter Sprachen, bei der die korrekte Methode von mehreren gleichnamigen Methoden (im Bsp.: draw (Graphics g) ) durch den Objekttyp bestimmt wird, auf dem sie arbeiten soll. class Figure { protected int x,y,w,h; public void draw(graphics g){... class Circle extends Figure { @Override public void draw(graphics g){ g.drawoval(x,y,w,h)... class Rectangle extends Figure { @Override public void draw(graphics g){ g.drawrect(x,y,w,h)... 40 von 50

Prinzipien des Polymorphismus Ein Objekt behält immer die Identität der Klasse, aus der es erzeugt wurde. Figure (Ein Objekt kann nie in ein Objekt int x,y,w,h einer anderen Klasse konvertiert werden!) void draw() Wenn eine Methode auf ein Objekt aufgerufen wird, wird immer die Methode verwendet, die mit der Klasse des Objekt verbunden ist Rectangle void draw() Line int x2,y2 void draw() Circle int mx,my void draw() 41 von 50

Dynamischer, statischer Typ Welche draw() Methode wird aufgerufen? Figure fig = new Rectangle( ); fig.draw(g); Antwort: Es wird die draw Methode von Rectangle aufgerufen Regel: es wird immer die Methode der Klasse aufgerufen, die (dynamisch) der Variablen zugewiesen wurde. Statischer Typ: Typ der Variablen, wie sie deklariert wurde Dynamischer Typ: Typ (Klasse) des Objekts, das der Variablen zugewiesen wurde; Referenztyp -> auf den die Variable zeigt. 42 von 50

Casting up Erzeugen von Objekten und Zuweisen an Variable Figure int x,y,w,h Figure fig = new Figure(.); Rectangle rect = new Rectangle(.); void draw() Upcast Figure fig = new Rectangle( ); Rectangle void draw() Line int x2,y2 void draw() Circle int mx,my void draw() In der Klassenhierarchie eine Referenz nach oben geben(casting up) Da jede erbende Klasse alle Methoden der Oberklassen besitzt ist das "sicher". es es kann kann nicht nicht zu zu Fehlern Fehlern führen führen 43 von 50

Casting down In der Klassenhierarchie eine Referenz nach unten geben (casting down, unsafe casting ) Figure fig = new Rectangle( ); in in fig fig könnte könnte auch auch Line, Line, Circle Circle oder oder Figure Figure sein sein Rectangle rect = fig; Rectangle Der Downcast ist "unsicher" und muss deshalb explizit angeben werden void draw() Figure int x,y,w,h void draw() Line Circle int x2,y2 int mx,my void draw() void draw() Rectangle rect = (Rectangle) fig; 44 von 50

ClassCastException, instanceof Folgende Sequenz führt zu einem Laufzeitfehler: ClassCastException Figure fig = new Circle( ); Rectangle rect = (Rectangle) fig; Vorher testen, ob ein Objekt zu einer bestimmten Klasse gehört oder nicht instanceof ist ein Schlüsselwort Verwendung if (fig instanceof Rectangle){Rectangle rect = (Rectangle) fig; 45 von 50

Zusammenfassung Vererbung zur Erweiterung Vererbung zur Anpassung Oberklassen Aufruf Konstruktoren Polymorphismus 46 von 50

Noch Fragen? 47 von 50

Anhang: overloading und overriding Overloading bedeutet, dass es zwei oder mehr Methoden mit dem gleichen Namen (innerhalb einer Klasse) gibt, die sich durch Parameter unterscheiden. Der Unterschied kann in der Anzahl der Parameter oder dem Typ oder beidem bestehen. Der Java-Compiler wählt aufgrund der Parameter die richtige aufzurufende Methode aus ("most specific" algorithm) Overriding (Überschreiben) einer Methode in einer Unterklasse bedeutet, dass eine Methode mit dem gleichen Namen und Parameter wie in der Oberklasse geschrieben wird. Das Java-Laufzeitsystem nimmt immer die Methode, die zur Klasse des Objekts gehört. [Quelle: Java für Studenten] 48 von 50

Beispiel einer Anwendung Ein kleines Zeichenprogramm (innerhalb einem Form) Figure [] figs = new Figure[4]; public void init () { figs[0] = new Circle(...); figs[1] = new Line(...); figs[2] = new Line(...); figs[3] = new Rectangle(...); public void paint(graphics g) { for (int i = 0; i < figs.length; i++) { figs[i].draw(g)); 49 von 50

Anhang: Mehrfachvererbung bei z.b. C++ Einfachvererbung (single inheritence): Eine Unterklasse kann in Java nur von einer Oberklasse erben, nicht von mehreren wie z.b. in C++ Transportmittel Problem: diamond inheritance Erbt die Klasse Wasserflugzeug die Methoden von Flugzeug oder von Boot? Flugzeug Boot Für Mehrfachvererbung gibt es in Java zu diesem Zweck das Konzept der Interfaces: Nur Deklaration der Schnittstelle, keine Implementation der Klasse Problem wird umgangen! Wasser- Flugzeug << 50 von 50