Kurs OPR. Objektorientierte Programmierung



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

Java: Vererbung. Teil 3: super()

Programmieren in Java

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Kurs für Anfänger Einheit 5 Methoden

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Vererbung, Polymorphismus

Vererbung, Polymorphismus

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Objektorientierte Programmierung OOP

Kapitel 6. Vererbung

Folge 18 - Vererbung

Einführung in die Java- Programmierung

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Vorkurs C++ Programmierung

Kapitel 6. Vererbung

Einführung in die Programmierung

Objektorientierte Programmierung

Kapitel 6. Vererbung

Prinzipien Objektorientierter Programmierung

Klassendiagramm. Kurzer Überblick über UML - Stand BlaBla

Vererbung & Schnittstellen in C#

Arbeiten mit UMLed und Delphi

EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0. EDV Kurs 13/2

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

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

3. Konzepte der objektorientierten Programmierung

Software Engineering Klassendiagramme Assoziationen

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Grundlagen von Python

Klassenbeziehungen & Vererbung

5. Abstrakte Klassen

Javakurs 2013 Objektorientierung

Objektorientierte Programmierung für Anfänger am Beispiel PHP

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung

Einführung in die Programmierung für NF

Einführung in die Java- Programmierung

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Einstieg in die Informatik mit Java

4 Vererbung, Polymorphie

Einführung in die. objektorientierte Programmierung

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

1 Mathematische Grundlagen

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

13. Tutorium zu Programmieren

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Kurzanleitung. Toolbox. T_xls_Import

Vgl. Oestereich Kap 2.7 Seiten

Innere Klassen in Java

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

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

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Abschnitt 12: Strukturierung von Java-Programmen: Packages

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

SWE5 Übungen zu Software-Engineering

OO Softwareentwicklung

Professionelle Seminare im Bereich MS-Office

Java Einführung Methoden in Klassen

Programmierkurs Java

Zeichen bei Zahlen entschlüsseln

5.6 Vererbung. Vererbung

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Software Engineering Interaktionsdiagramme

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Software Engineering Klassendiagramme Einführung

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Code wiederverwenden: Objektorientierte Programmierung (OOP) sinnvoll nutzen Roland Wagner Automatisierungstreff IT & Automation 2015

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

1 Vom Problem zum Programm

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

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Die Lernumgebung des Projekts Informationskompetenz

Einstieg in die Informatik mit Java

Datensicherung. Beschreibung der Datensicherung

Übungen zur Softwaretechnik

Computeranwendung und Programmierung (CuP)

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Applet Firewall und Freigabe der Objekte

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Client-Server-Beziehungen

Internet Explorer Version 6

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten

4. AuD Tafelübung T-C3

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Bilder zum Upload verkleinern

Transkript:

Kurs OPR Objektorientierte Programmierung Lektion: 005-Vererbung, Polymorphismus Zürcher Hochschule für Angewandte Wissenschaften Mitglied der Fachhochschule Zürich Version 1.4

Inhaltsverzeichnis 1 Vererbung 3 1.1 Ziele 3 1.2 Einführung 3 1.3 Beispiel Ballon 3 1.4 Sichtbarkeitsbereiche 7 1.5 Klassendiagramm (class diagram) 8 1.6 Überschriebene Methoden 12 1.7 Überschriebene Attribute 13 1.8 Konstruktoren 13 1.9 Schlüsselwort final 14 1.10 Erlaubte Operationen auf Objekte 15 1.11 Erweitern von Bibliotheksklassen 15 1.12 Polymorphismus 15 1.13 Wiederverwendung von Software 19 1.14 Professionelles Programmieren 19 Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 2

1 Vererbung 1.1 Ziele Sie können das Prinzip der Vererbung in eigenen Worten erklären. Sie können ein bestehendes Klassendiagramm interpretieren. Sie können selbständig ein einfaches Klassendiagramm aufstellen. Sie können die Sichtbarkeitsregeln anhand eines solchen Diagramms erklären. Sie können bestehende Klassen durch Vererbung erweitern. Sie können die Grundidee des Polymorphismus anhand eines Beispiels erklären. 1.2 Einführung Beispiel Auto: Eine Firma stellt einen PW her, 4-türig, mit Stufenheck Ein Kunde möchte einen solchen PW, aber als Caravan Was macht Entwicklungs-Ing.? Er hat folgende Alternativen: Er entwickelt ein neues Auto von Grund auf Unsinn!! Er übernimmt möglichst viel vom bestehendem PW. Noch besser ist er dran, wenn er bereits das erste Auto so modular entwickelt hat, dass die Umwandlung in einen Caravan einfach möglich ist. Dasselbe gilt für Softwareentwicklung: Nicht bei jedem neuen Programm soll das Rad wieder neu erfunden werden. Ein neues Programm soll möglichst aus bestehenden Softwarebausteinen aufgebaut werden: Die Bausteine bestehen bereits, sind getestet, haben sich bewährt. Alles andere ist häufig zu aufwändig, dauert zu lange und ist zu teuer! Ziele bei der Softwareentwicklung: Software möglichst aus bestehenden Komponenten aufbauen. Die wiederverwendeten Bausteine müssen dabei meistens an die neuen Anforderungen angepasst werden. Möglichst wiederverwendbare Softwarebausteine entwickeln. Objektorientierte Programmierung Die wiederverwendbaren Softwarebausteine sind die Klassen Ein Mechanismus für die Wiederverwendung ist die sogenannte Vererbung. 1.3 Beispiel Ballon Es seien zwei Klassen gegeben: Klasse Kugel Klasse Ballon, die von der Klasse Kugel abgeleitet ist. Die Klasse Ballon heisst Subklasse (Unterklasse) von der Klasse Kugel. Die Klasse Kugel heisst entsprechend Superklasse (Oberklasse) von der Klasse Ballon. Vererbungsmechanismus: Klasse Ballon erbt alle Attribute (Instanzvariablen) und Operationen (Methoden) von Klasse Kugel. Attribute und Operationen werden nicht einfach in die Subklasse kopiert, sondern alle Attribute Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 3

und Operationen der Klasse Kugel sind auch in der Klasse Ballon verfügbar. Abbildung 1: Graphische Darstellung der Klassenbehiehung zwischen Klasse Kugel und Klasse Ballon in UML (Unfied Modeling Language) Die Klasse Ballon erweitert die Klasse Kugel. Sie deklariert dazu zusätzliche Attribute: Color farbe zusätzliche Operationen: up(), down(), setfarbe(color col) Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 4

Die Klasse Ballon kann auch Operationen (und Attribute) der Klasse Kugel sogenannt überschreiben (override). Dazu wird in der Subklasse einfach nochmals eine Methode mit dem gleichen Methodenkopf wie die geerbte Methode geschrieben. Beispiel: Die Methode display(graphics g), die die Klasse Ballon von der Klasse Kugel erbt wird in der Klasse Ballon überschrieben. Achtung: Verwechseln Sie das Überschreiben einer Methode nicht mit dem Überladen (overloading) der Methode! Beachten Sie: Die Klasse Kugel wird durch die Vererbung nicht verändert! Objekte der Klasse Ballon haben somit folgende Attribute und Methoden: Abbildung 2: Ballon-Objekt Die Objekte besitzen alle Attribute und Operationen der Klasse Ballon und zudem die der Klasse Kugel. Zwischen der Klasse Ballon und der Klasse Kugel besteht eine sogenannte ist-ein - Beziehung: Jedes Ballon-Objekt ist gleichzeitig auch eine Kugel-Objekt, denn es besitzt alle Attribute und Methoden eines Kugel-Objekts. Objekte der Klasse Ballon können überall dort eingesetzt werden, wo ein Objekt der Klasse Kugel(Superklasse) erwartet wird, da sie dieselbe Schnittstelle (public-methoden und Variablen) nach aussen besitzt. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 5

4.4 Vererbung in Java Das Erweitern einer Klasse ist in Java denkbar einfach: Bei der Deklaration der Subklasse muss nach dem Schlüsselwort extends die Superklasse angegeben werden, die erweitert werden soll. Die Subklasse erbt alle Instanzvariablen und Methoden der Superklasse. Allerdings kann die Subklasse nur auf Methoden und Attribute direkt zugreifen, die nicht private deklariert sind. Die Subklasse erhält keine Kopien der Variablen und Methoden, sondern den Zugriff auf die Instanzvariablen und Methoden der Superklasse. Die Subklasse kann sodann beliebig zusätzliche Methoden und Instanzvariablen deklarieren (wie bei einer normalen Klasse) Methoden überschreiben (overriding): Falls eine Methode in der Subklasse genau den gleichen Methodenkopf (Signatur) aufweist, wie eine Methode in der Superklasse, so wird die Methode der Superklasse überschrieben. Der Methodenkopf in der Subklasse muss genau mit demjenigen in der Superklasse übereinstimmen (gleicher Methodenname, gleiche Anzahl und gleicher Typ der Parameter, gleicher Rückgabetyp, gleiche Sichtbarkeit, static, falls überschriebene Methode auch static). Falls die Deklaration nicht genau mit der in der Superklasse übereinstimmt, wird die Methode überladen statt überschrieben! D.h. beide Methoden würden dann in der Subklasse nebeneinander existieren, die geerbte und die neu geschriebene. Einfachvererbung (single inheritence): Eine Subklasse kann in Java nur von einer direkten Superklasse erben, nicht von mehreren wie z.b. in C++. In Java gibt es dafür das Konzept der Interfaces. Deklaration einer Subklasse allgemein: class Subklassenname extends Superklassenname { Instanzvariablendeklarationen Methodendeklarationen Konstruktorendeklarationen EBNF 1: Deklaration einer Subklasse Beispiel: Die Klasse Ballon soll gemäss Abbildung 1von der Klasse Kugel abgeleitet werden: Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 6

Klasse Kugel: class Kugel { protected int x = 100, y = 100, radius = 40; public void setpos(int newx, int newy){ x = newx; y = newy; public void display(graphics g){ g.drawoval(x,y,radius,radius); Klasse Ballon: class Ballon extends Kugel { protected Color farbe = Color.green; public void setfarbe(color col){ farbe = col; public void up(){ y = y - 10; public void down(){ y = y + 10; public void display(graphics b){ Color fg = null; fg = b.getcolor(); b.setcolor(farbe); super.display(b); b.setcolor(fg); Programm 1: Klasse Ballon von Kugel abgeleitet 1.4 Sichtbarkeitsbereiche Im Zusammenhang mit Subklassen wird ein zusätzlicher Zugriffsmodifikator protected definiert. Ein Überblick über die bisher behandelten Zugriffsmodifikatoren zusammen mit den entsprechenden Sichtbarkeitsbereichen sind in folgender Tabelle zusammengefasst. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 7

Sichtbarkeit Zugriffsmodifikator gleiche Klasse Subklasse andere Klasse private ja nein nein protected ja ja nein public ja ja ja Tabelle 1: Sichtbarkeitsbereiche Der Sichtbarkeitsbereich gilt jeweils für die Klasse selbst und alle Objekte der Klasse. D.h.eine private-instanzvariable ist nur innerhalb desselben Objekts sichtbar, eine private static Variable ist innerhalb der gleichen Klasse und allen Objekten davon sichtbar. public: public-methoden sind überall sichtbar, d.h. können von überall aus aufgerufen werden. public-instanzvariablen sind überall sichtbar, d.h. sie können von überall her gelesen und verändert werden. private: private-methoden/instanzvariablen sind nur innerhalb derselben Klasse sichtbar. abgeleitete und andere Klassen können auf diese Variablen nur indirekt via Methoden zugreifen. protected: protected-methoden/instanzvariablen sind sichtbar in allen Subklassen der Klasse, in der die Variable/Methode deklariert ist. Zur Erinnerung: lokale Variablen sind nur innerhalb derselben Methode sichtbar. Regeln für die Verwendung der Zugriffmodifikatoren: Nur Methoden, die einen Service für Benützer der Klasse bieten, als public deklarieren. Alle Instanzvariablen als private deklarieren. Zugriff nur via Methoden ermöglichen. Ausnahme: Private Instanzvariablen/Methoden, die aber auch in abgeleiteten Klassen gebraucht werden, müssen protected anstatt private deklariert werden. 1.5 Klassendiagramm (class diagram) Ganz allgemein zeigt ein Klassendiagramm die Beziehungen von Klassen untereinander. Sie stellt somit eine statische Sicht eines Systems dar. Vererbungs-Hierarchie Eine Klasse ohne explizite Superklasse ist in Java Subklasse von der Klasse Object. Jede Subklasse kann seinerseits von weiteren Subklassen erweitert werden. Dadurch entseht eine baumartige Hierarchie von Subklassen. Diese Vererbungs-Hierarchie von Klassen wird typischerweise in einem Klassendiagramm dargestellt. Beispiel: Abbildung 3 zeigt die Vererbungshierarchie der Klassen Kugel, Ball, Ballon, Billardkugel und Fussball als Klassendiagramm. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 8

Die Subklassen erben alle Attribute (Instanzvariablen) und Operationen (Methoden) aller ihrer Superklassen. So erbt beispielsweise die Klasse Fussball die Methoden kick, updatepos und setradius von der Klasse Ball, die Methoden setpos und display von Kugel und die Methode equals von der Klasse Object. Die Klasse Fussball überschreibt die Methode display der Klasse Kugel und die Methode updatepos der Klasse Ball. Zudem wir die geerbte Methode kick überladen. Die Klasse Fussball erbt zudem die Attribute x, y und radius von der Klasse Kugel und vx und vy von der Klasse Ball. Die Klasse Fussball deklariert zusätzlich die Attribute z und vz. Ablauf der Suche einer Methode (oder Variablen) beim Aufruf: Falls eine Operation (oder Attribut) eines bestimmten Objekts aufgerufen wird, so wird diese in folgender Reihenfolge in den verschiedenen Klassen gesucht: zuerst in der Klasse des aktuellen Objekts. Falls sie nicht gefunden wird, in der direkten Superklasse in der nächst höheren Superklasse usw. schliesslich in der Klasse Object. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 9

Object equals() Kugel int x, y, radius setpos(int x, int y) display(graphics g) int vx, vy Ball kick(int vx, int vy) updatepos(int dt) setradius(int r) Ballon Color farbe setfarbe(color col) up() down() display(graphics b) Billardkugel Color farbe int zahl display(graphics k) Fussball int z, vz kick(int vx, int vy, int vz) updatepos(int dt) display(graphics g) Abbildung 3: Klassendiagramm (Vererbungshierarche) der Klasse Kugel Aufgaben Lösen Sie anhand des Klassendiagramms in Abbildung 3 folgende Aufgaben: Welche Attribute und Operationen weist ein Objekt der Klasse Billardkugel auf? Schreiben Sie die Klasse Billardkugel. Sie soll einen Konstruktor enthalten, mit dem eine Billardkugel mit einer bestimmten Zahl an der gewünschten Stelle und in der gewünschten Farbe erzeugt werden kann. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 10

Lösung: Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 11

1.6 Überschriebene Methoden Eine Methode einer Superklasse ist überschrieben, wenn in einer ihrer Subklassen eine Methode mit demselben Methodenkopf (Signatur) steht. Beim Überschreiben einer Methode ist die ursprüngliche Methode in der Superklasse von der Subklasse aus nicht mehr direkt aufrufbar. super.methodenname([argumentliste]); EBNF 2: Aufruf einer Methode in der Superklasse Falls die ursprüngliche Methode in der Superklasse von der Subklasse aus aufgerufen werden soll, so muss der Objektname super verwendet werden: super bezeichnet das aktuelle Objekt, das aber als Objekt der Superklasse interpretiert wird Dementsprechend wird die Methode der Superklasse aufgerufen. Beispiel: Methode display in Klasse Ballon public void display(graphics b){ Color fg; fg = b.getcolor(); b.setcolor(farbe); super.display(b); // ruft display in der Klasse Kugel auf b.setcolor(fg); super.super.methodenname(...) ist nicht erlaubt. Aufgabe Stellen Sie anhand des Klassendiagramms von Abbildung 3 fest, aus welcher Klasse die aufgerufene Methode stammt, falls Sie: die Methode up() eines Ballon-Objekts aufrufen die Methode display(graphics g) eines Ball-Objekts aufrufen. die Methode display(graphics g) eines Fussball-Objekts aufrufen. die Methode kick(int vx, int vy) eines Fussball-Objekts aufrufen. die Methode super.display(graphics g) eines Fussball-Objekts aufrufen. Lösung up() // Ballon-Obj. : display(graphics g) // Ball-Obj. : display(graphics g) // Fussball-Obb. : kick(int xv, int vy) // Fussball-Obj. : super.display(graphics g) // Fussball-Obj.: Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 12

1.7 Überschriebene Attribute Falls in der Subklasse eine Instanzvariable mit gleichem Namen wie in der Superklasse deklariert wird, ist die Instanzvariable der Superklasse in der Subklasse nicht mehr sichtbar (Shadowing). Die beiden Instanzvariablen haben ansonsten nichts miteinander zu tun. Das Überschreiben von Attributen sollte man möglichst vermeiden. 1.8 Konstruktoren Beim Erzeugen eines Objekts wird bekanntlich der entsprechende Kontstruktor ausgeführt. Dort werden normalerweise die Instanzvariablen des erzeugten Objekts initialisiert. Beim Erzeugen eines Objekts einer Subklasse, wird ebenfalls der entsprechende Kontstruktor ausgeführt, um dessen Instanzvariablen zu initialisieren. Damit nun aber auch die Instanzvariablen aller Superklassen der Klasse richtig initialisiert werden, läuft folgender Vorgang ab: Vor dem Ausführen der ersten Anweisung im Konstruktor der Subklasse wird der Standard- Konstruktor der Superklasse, Superklassenname(), ausgeführt. Konkret wird von Java automatisch die Anweisung super(); vor die erste Anweisung im Konstruktor der Subklasse eingefügt, was den Aufruf des Superkonstruktors bewirkt. Falls ein anderer als der Standard-Konstruktor in der Superklasse ausgeführt werden soll, so muss der Programmierer selbst diesen Superkonstruktor aufrufen, und zwar als erste Anweisung im Konstruktor der Subklasse. Diese Anweisung muss sogar vor allfälligen Variablendeklara-tionen stehen. Dies macht der Programmierer, indem er als erste Anweisung den Befehl super([parameterliste]); EBNF 3: Aufruf des Superkonstruktors im Konstruktor der Subklasse schreibt. Falls Java keine solche erste Anweisung findet, ruft es automatisch den Standard-Konstruktor der Superklasse auf, d.h. super(). Falls die Su perklasse keinen solchen Konstruktor besitzt, tritt ein Compilierungsfehler auf. Falls eine Klasse überhaupt keinen Konstruktor aufweist, wird von Java automatisch ein Standard-Konstruktor eingefügt. Dieser macht nichts anderes, als den Superkonstruktor aufzurufen und sieht dementprechend folgendermassen aus: Klassenname(){ super(); EBNF 4: Standard-Konstruktor Mit diesen Mechanismen garantiert Java, dass beim Erzeugen eines Objekts einer Klasse die Konstuktoren aller Superklassen der Klasse ausgeführt werden, bevor der Konstruktor der Klasse selbst ausgeführt wird. Der erste Konstruktor, der ausgeführt wird ist also der Konstruktor der Basisklasse Object, die Superklasse aller Klassen. Danach werden die Konstruktoren der direkten Subklassen der Reihe nach ausgeführt bis zur aktuellen Klasse. Beispiel: Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 13

Wird im Klassendiagramm von Abbildung 3 ein Objekt der Klasse Fussball erzeugt, so werden der Reihe nach folgende Konstruktoren ausgeführt: 1. Object(); 2. Kugel(); 3. Ball(); 4. FussBall(); Aufgabe: Zeichnen Sie den Programmablauf beim Erzeugen eines Objekts der Klasse Billardkugel auf, falls die Klassen folgende Konstruktoren definieren: public class Object { Object(){... public class Kugel { Kugel(){... Kugel(int radius){... class Billardkugel extends Kugel { Billardkugel(int inix, int iniy, Color col){ super(20); farbe = col; x = inix; y = iniy; 1.9 Schlüsselwort final Manchmal möchte man vermeiden, dass Instanzvariablen oder Methoden einer Klasse überschrieben werden. Dies kann man tun, indem man die Variable oder Methode als final deklariert. Folge: Eine final-methode oder -Variable kann nicht mehr überschrieben werden. Es können auch ganze Klassen als final deklariert werden: Folge: Die Klasse kann nicht mehr erweitert (subclassed) werden. Alle Methoden der Klasse sind dann automatisch auch final. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 14

Beispiel: Die Klasse System ist als final deklariert. static final Variablen: Dies sind Klassenvariablen, die nicht überschrieben werden können. Diese Variablen entsprechen den Konstanten in anderen Sprachen. 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. 1.10 Erlaubte Operationen auf Objekte Bisher haben wir folgende Operationen auf Objekte kennen gelernt: Erzeugen eines Objekts aus seiner Klasse. Zuweisung zu einer Variablen derselben Klasse. Verwendung als Parameter und Rückgabewert bei einer Methode. Aufruf von Methoden der Klasse des Objekts. Mit der Vererbung kommen neu dazu: Methodenaufruf aller public- und protected-methoden in allen Superklassen des Objekts. Zuweisung eines Objekts einer Subklasse zu einer Variablen (d.h. einem Objekt) einer der Superklassen dieser Klasse. 1.11 Erweitern von Bibliotheksklassen Klassen in Bibliotheken können wie die selbst programmierten Klassen erweitert werden. Beispiel: Klasse Applet Um ein Applet zu schreiben, haben wir jeweils eine Subklasse der Klasse Applet geschrieben: public MyProgram extends Applet {... MyProgram erbt alle Methoden von der Klasse Applet und deren Superklassen. Die Methoden add() und repaint() z.b. werden von den Superklassen von Applet zur Verfügung gestellt. Die Methoden init() und paint(graphics g) der Klasse Applet müssen in MyProgram überschrieben werden. Wie findet man die nötigen Informationen über Bibliotheksklassen? In der Online-Dokumentation nachschauen (normalerweise direkt von der IDE aus möglich) In Java-Büchern (z.b. Java in a Nutshell ) 1.12 Polymorphismus Bei der Erzeugung eines Objekts wird Folgendes ein für allemal festgelegt: Die Identität des Objekts (eindeutige Kennzeichnung). Innerhalb des Programms ist dies die Referenz auf das Objekt. Die Klassenzugehörigkeit Sie bleibt erhalten, solange das Objekt existiert. Beachten Sie: Wird das Objekt einer Variablen einer Superklasse zugeordnet, so ändert nur die Interpretation des Objekts, nicht dessen Klassenzugehörigkeit! Wir wissen: Methoden einer Klasse können überschrieben oder überladen werden: Im Beispiel der Klasse Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 15

Tier in Figur wird die Methode display(graphics g) überschrieben in den Subklassen Schwein und Kuh. Objekte einer Subklasse können Objekten der Superklasse zugewiesen werden: Wir können deshalb ein Objekt einekuh der Klasse Kuh einer Variablen vom Typ Tier, z.b. der Variablen Tier meintier, zuweisen: Kuh einekuh = new Kuh(); Tier meintier = einekuh; Frage: Was passiert nun, wenn die Methode display(graphics g) des Objekts meintier aufgerufen wird? Tier display(grapics g) Schwein int beine = 4; Kuh int beine = 4; Schlange display(grapics g) display(grapics g) Abbildung 4: Polymorphismus Antwort: Die richtige Methode wird erst beim Aufruf der Methode anhand der Klassenidentität des aktuellen Objekts gesucht (dynamisches Binden). Ablauf der Suche: Zuerst wird in der Klasse (die bei der Erzeugung festgelegt wurde) des Objekts, in vorherigen Beispiel in der Klasse Kuh, nach einer passenden Methode gesucht (passender Name und Parameterliste). Falls nichts Passendes gefunden wurde, wird in der entsprechenden Superklasse gesucht. Falls nichts Passendes gefunden wurde, wird in der darüberliegenden Superklasse gesucht usw. Folge: Dieses dynamische Binden bewirkt, dass der gleiche Methodenaufruf (gleicher Objektname und gleicher Methodenname) je nach Klassenzugehörigkeit des Objekts zur Ausführung verschiedener Methoden führt! Dieses Verhalten ist eine mögliche Form von Polymorphismus (Vielgestaltigkeit). Beispielprogramm Tiere Die Auswirkungen der Polymorphismus sollen am Beispiel von veranschaulicht werden. Das BeispielpProgramm 2 (Tiere) basiert auf dem Klassendiagramm von Abbildung 4. Wird das Programm ausgeführt, so entsteht die Bildschirmausgabe gemäss Abbildung 5. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 16

Abbildung 5: Bildschirmausgabe der Programms Tiere Erklärungen zum Programmablauf: Die Methode display(...) der Klasse Tier wird von den Subklassen Kuh und Schwein überschrieben, nicht jedoch von Schlange. Ein Objekt der Klasse Kuh kann nun dem Objekt meintier der Klasse Tier zugewiesen werden, da Tier Superklasse der Klasse Kuh ist. Wird nach dieser Zuweisung die Methode meintier.display (...) aufgrufen, so bestimmt Java die richtige display-methode dynamisch anhand der Klasse des aktuellen Objekts. Da das Objekt meintier nach der obigen Zuweisung eigentlich eine Instanz der Klasse Kuh ist, wird in diesem Fall Kuh.display(...) ausgeführt. Das Gleiche spielt sich ab, wenn ein Objekt der Klasse Schwein dem Objekt meintier zugewiesen wird. Wird ein Objekt der Klasse Schlange dem Objekt meintier zugewiesen, so wird die display-methode der Klasse Tier ausgeführt, da die Klasse Schlange diese Methode nicht überschrieben hat. Der gleiche Methodenaufruf meintier.display(...)führt also je nach der Klassen-zugehörigkeit des Objekts eine Methode einer anderen Klasse aus. Polymorphismus funktioniert nur für Methoden (polymorphe Operationen), nicht aber für Instanzvariablen. Man spricht deshalb bei Variablen häufig von Überdecken (Shadowing) anstatt Überschreiben. Das Progamm Tiere: import java.awt.*; import java.applet.applet; public class Tiere extends Applet { Tier meintier, tier1; Kuh berta; Schwein franz; Schlange rosa; public void init(){ tier1 = new Tier(); berta = new Kuh(); franz = new Schwein(); rosa = new Schlange(); Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 17

public void paint(graphics g) { meintier = tier1; meintier.display(g); // ruft Tier.display() auf meintier = berta; meintier.display(g); // ruft Kuh.display() auf meintier = franz; meintier.display(g); // ruft Schwein.display() auf meintier = rosa; meintier.display(g); // ruft Tier.display() auf class Tier { protected static int y = 20; public void display(graphics g){ g.drawstring("ich bin ein Tier",20,y); y = y + 20; class Kuh extends Tier { private int beine = 4; public void display(graphics g){ g.drawstring("ich bin eine Kuh",20,y); y = y + 20; class Schwein extends Tier { private int beine = 4; public void display(graphics g){ g.drawstring("ich bin ein Schwein",20,y); y = y + 20; class Schlange extends Tier { private boolean giftig; Programm 2: Tiere Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 18

1.13 Wiederverwendung von Software Wiederverwendung von Software spart Zeit (z.b. die Klassen von AWT und Klasse Math). Meist existiert schon Software, die 90% der Funktionalität aufweist. Ändern einer bestehenden Software ist aufwändig: Neue Fehler, Inkompatibilitäten mit anderen Komponenten können entstehen Umfangreiche Tests auch der bestehenden Teile werden daher nötig. Lösungsansatz des OOP: Die verwendeten Teile der Software werden belassen wie sie sind. Nötige Änderungen und Ergänzungen erreicht man durch Vererbung und Erweiterung. Empfohlenes Vorgehen bei der Softwareentwicklung: Anforderungen an das Programm studieren. Klassen in der Bibliothek suchen, die die Funktionalität am ehesten erfüllen. Klasse erweitern, um die nötigen Erweiterungen zu programmieren. Prüfen, ob Subklasse in einer ist-ein -Beziehung zur Superklasse steht. 1.14 Professionelles Programmieren Keine überschriebenen Methoden im Super-Konstruktor aufrufen. Keine Referenzen auf final-objekte nach aussen geben, da nur Referenz konstant ist, Objektdaten können geändert werden. Klassen, die beerbt werden sollen, müssen entsprechend designed und dokumentiert (z.t. mit Implementierungsdetails) werden. Vererbung, Polymorphismus.doc 2010 InIT/ZHAW 19