29
Einführung in die objektorientierte Programmierung für die Wirtschaftsinformatik Prof. Dr. Bernd Krämer Kurs 20022 LESEPROBE

Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

Embed Size (px)

Citation preview

Page 1: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

Einführung in die objektorientierte Programmierung für die Wirtschaftsinformatik

Prof. Dr. Bernd Krämer

Kurs 20022

LESEPROBE

Page 2: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

Das Werk ist urheberrechtlich geschutzt. Die dadurch begrundeten Rechte, insbesondere das Recht der Vervielfaltigung

und Verbreitung sowie der Ubersetzung und des Nachdrucks bleiben, auch bei nur auszugsweiser Verwertung, vorbe-

halten. Kein Teil des Werkes darf in irgendeiner Form (Druck, Fotokopie, Mikrofilm oder ein anderes Verfahren) ohne

schriftliche Genehmigung der FernUniversitat reproduziert oder unter Verwendung elektronischer Systeme verarbeitet,

vervielfaltigt oder verbreitet werden.

Page 3: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

iii

Vorwort

Willkommen im KursObjektorientierte Programmierung . Der Kurs führt Siein die Grundlagen der Programmierung mit Objekten, kurz objektorientierte Pro-grammierung oder OOP, ein. Diese Programmiertechnik hat sich nicht zuletzt auchdeshalb in vielen Anwendungsbereichen durchgesetzt, weilsie Gegenstände derRealität in ihren Eigenschaften und Verhaltensweisen gut nachbildet und durch einVererbungskonzept die systematische Wiederverwendung von Programmteilen er-möglicht.

Grundlegende Strukturbegriffe wie Objekt, Klasse, Vererbung, Schnittstelle und allewichtigen Programmierkonzepte im Kleinen werden an Hand einer Fallstudie undanderer Beispiele motiviert, dann allgemein bestimmt und anschließend konkret inder Java-Syntax eingeführt.

Dieser Kurs will Ihnen nicht nur erste Fertigkeiten im Schreiben von Java-Programmen beibringen, sondern soll Sie auch in die Lage versetzen, eine gegebeneAufgabe inhaltlich zu durchdringen, d. h. die vorgegebene oder erwünschte Funk-tionalität zu verstehen, sie exakt, verständlich und umfassend zu dokumentierenund dabei auch die bei der Programmentwicklung zu berücksichtigenden Randbe-dingungen zu erfassen. Die so gewonnene Aufgabenbeschreibung wird dann syste-matisch in ein lauffähiges Java-Programm umgesetzt.

Das Kursmaterial wird sowohl im HTML-Format für die Online-Nutzung als auchim PDF-Format für einen Ausdruck auf Papier angeboten.

Dieser Kurs

• bietet eineEinführung in die Programmierungan Hand der Programmier-spracheJava,

• erläutert dieGrundlagen des objektorientierten Programmentwurfs,

• vermitteltKenntnisse elementarer Sprachkonzepteund

• behandeltDatenstrukturenundAlgorithmen.

Die Kurseinheiten sind nicht als Programmieranleitung fürJava ausgelegt. VieleEinzelheiten der Sprache Java werden deshalb hier nicht behandelt, denn die Beto-nung des Kurses liegt auf der Vermittlung grundlegender Programmierbegriffe undMethoden der objektorientierten Programmierung (OOP). Java dient vor allem alskonkrete Schreibweise für die Beispiele und Übungen des Kurses. Alle Sprachkon-strukte, die wir dafür benötigen, werden auch im Kurs erläutert.

Weitergehende Java-Kenntnisse können Sie aus einer ganzenReihe ausgezeichneterLehrbücher erwerben, die Sie in alle Details der Sprache einführen.

Sie werden im Rahmen des Kurses auch Teile der Unified Modeling Language(UML) kennen lernen. Wir werden auch hier nur die für den Kursnötigen Elementekennen lernen.

Im Abschnitt Material finden Sie kommentierte Hinweise auf deutsche und engli-sche Lehrbücher zu Java und zur UML sowie auf Online-Quellenim Internet.

Page 4: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

iv Vorwort

Bevor Sie sich mit den eigentlichen Kurseinheiten befassen, sollten Sie sich denAbschnitt Informationen zum Kurs ansehen. Alle Materialien und weitere Informa-tionen finden Sie auf der Webseite des Kurses.

Page 5: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

v

Lernziele

Nach Abschluss dieses Kurses sollen Sie:

• die Grundbegriffe und besonderen Merkmale der objektorientierten Program-mierung erklären und anwenden können,

• für eine gegebene Aufgabe geeignete Datenstrukturen und Algorithmen ent-wickeln können, d. h. den Umgang mit Daten systematisch gestalten und pro-grammierbare Lösungsmethoden entwerfen, um eine Aufgabe in endlichenSchritten bewältigen zu können,

• Grundkenntnisse der Sprache Java beherrschen und in der Lage sein, die Da-tenstrukturen und Algorithmen Ihres Entwurfs in Java umzusetzen,

• ein gegebenes Java-Programm lesen und verändern können,

• das Prinzip der Rekursion in Programmen verstehen und anwenden könnenund

• die vorgestellen UML-Diagramme verstehen und verwenden können.

Page 6: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

vi Studierhinweise

Studierhinweise

Dieser Kurs führt in die Grundbegriffe und Techniken der objektorientierten Pro-grammierung ein. Er beschreibt den Weg der Programmentwicklung von der Auf-gabenanalyse, über den objektorientierten Entwurf bis hinzur Konstruktion aus-führbarer Programme. Zur Darstellung der Ergebnisse der Aufgabenanalyse undProgrammentwürfe verwenden wir verschiedene Diagrammarten der standardisier-ten Beschreibungstechnik UML.

Programmbeispiele und Übungen werden in der Programmiersprache Java angege-ben. Eine Einführung in grundlegende Sprachkonstrukte und-konstruktionen vonJava runden den Kurs ab.

Wir erwarten, dass Sie regelmäßig und selbständig das Kursmaterial und die Aufga-ben bearbeiten. Anfängern raten wir, den Kurs sequenziell durchzuarbeiten, da dieeinzelnen Abschnitte inhaltlich aufeinander aufbauen.

Falls Sie mit dem Stoff schon vertraut sind, können Sie sich mit Hilfe des Inhalts-verzeichnisses frei durch den Lernstoff bewegen.

Um einige der Aufgaben bearbeiten zu können, ist es notwendig, die entsprechendeSoftware zu installieren und einzusetzen.

Weitere Information über erwartete Vorkenntnisse und notwendige technische Vor-aussetzungen, Kursautor und Betreuer finden Sie auf den folgenden Seiten.

Da es eine Vielzahl hervorragender Lehrbücher und im Internet verfügbarer Infor-mationen über Java gibt, halten wir die Ausführungen zum Aufbau der SpracheJava und ihren zahlreichen Sprachkonstrukten kurz. Sie sind deshalb gehalten, sichweitere Details zur Sprache selbst zu beschaffen.

Eine kommentierte Liste weiterführender Lehrmaterialienmag Sie bei der Auswahlleiten.

In diesem Kurs gibt es einige Exkurse, die Ihnen zusätzlicheInformationen zu be-stimmten Themen bieten, aber nicht klausurrelevant sind.

Zudem bieten wir auf den Webseiten noch offene Übungsaufgaben ohne Muster-lösungen, die Ihnen Anregungen für eine Vertiefung und die Klausurvorbereitungbieten sollen.

Page 7: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

vii

Autoren- und Betreuervorstellung

Abb. 1: Prof. Dr.-Ing. Bernd J. KrämerLeiter des Lehrgebiets DVT

Professor Krämer ist der Autor dieses Kurses. Er leitet das Lehrgebiet Datenverar-beitungstechnik1 der Fakultät für Mathematik und Informatik der FernUniversitätin Hagen.

Abb. 2: Dipl.-Inf. Silvia SchreierWissenschaftliche Mitarbeiterin am Lehrgebiet DVT

Silvia Schreier ist wissenschaftliche Mitarbeiterin am Lehrgebiet Datenverarbei-tungstechnik. Sie hat gemeinsam mit Helga Huppertz den Kursergänzt und überar-beitet und ist die Hauptbetreuerin für diesen Kurs.

An dieser und vorangegangenen Versionen des Kurses haben außerdem Herr Wink-ler, Frau Poerwantoro und Herr Kötter mitgearbeitet.

1 http://www.fernuni-hagen.de/dvt/

Page 8: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

viii Material

Material

Software

Alle Informationen und Hinweise für die notwendige Software finden Sie auf derWebseite des Kurses.

Lehrbücher

[Arnold99] Ken Arnold and James Gosling.The Java Programming LanguageAddison-Wesley Longman (es erscheinen regelmäßig neue Ausgaben).

Gosling ist der Kopf hinter Java; umfangreiches Referenzwerk aus der Java-Serie der Fa. Sun, die die Java-Entwicklung betreibt und dieRechte an derSprache besitzt.

[Barnes02] David J. Barnes and Michael Kölling.Objects First with Java: A Practical Introduction using BlueJ.Prentice Hall 2006 (erste Ausgabe 2002).

Die Einführung objektorientierter Programmiertechnikenam Beispiel von Ja-va folgt dem Grundgedanken der BlueJ-Programmierumgebungund stellt denUmgang mit Objekten in den Vordergrund; eine empfehlenswerte Ergänzungzum Kurs.

[Doberkat99] Ernst-Erich Doberkat und Stefan Dißmann:Einführung in die objektorientierte Programmierung mit Java.Oldenbourg 1999.

Entstand aus einer Lehrveranstaltung an der Universität Dortmund; stellt denEntwurf sequenzieller Algorithmen und wichtiger Datenstrukturen in denVordergrund und erläutert die Vorgehensweise bei der objektorientierten Ana-lyse und beim Entwurf.

[Echtle00] Klaus Echtle und Michael Goedicke:Lehrbuch der Programmierung mit Java.dpunkt Verlag 2000.

Wird als Lehrbuch an der Universität Essen in der Programmierausbildungfür Informatikerinnen und Nicht-Informatiker eingesetzt; beschreibt die Me-thoden der objektorientierten Programmierung und illustriert sie an Java-Beispielen; beginnt mit einer gut gelungenen Einführung indie Grundbegriffeder Informatik.

Page 9: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

Lehrbücher ix

[Gries-Gries05] David Gries and Paul Gries:Multimedia Introduction to Programming Using Java.Springer Verlag 2005.

Das Lehrbuch wird ergänzt um eine CD mit zusätzlichen Textteilen, Videos,in denen die Autoren Programmierkonzepte schrittweise erklären, interaktiveÜbungen, ein Glossar u.v.m. Der Aufbau des Buchs mag für Anfänger schwerzu handhaben sein.

[Hitz05] Martin Hitz, Gerti Kappel, Elisabeth Kapsammer, Werner Retschitzegger:UML @ Work. Objektorientierte Modellierung mit UML 2.Dpunkt Verlag, 3. (aktualisierte) Auflage, 2005

Dieses Buch bietet einen umfassenden Überblick über die verschiedenen Ele-mente der UML.

[Horstmann08] Cay Horstmann:Big Java.John Wiley & Sons, 3. Auflage, 2008.

Bietet eine umfangreichen Einstieg in die objektorientierte Programmierungmit Java und behandelt auch weiterführende, in diesem Kurs nicht angespro-chene Themen.

[Sedgewick02] Robert Sedgewick:Algorithms in Java.Addisson Wesley 2002.

Behandelt die Grundlagen von Datenstrukturen und untersucht zahlreiche Va-rianten von Such- und Sortieralgorithmen.

[Züllighoven98] Heinz Züllighoven:Das objektorientierte Konstruktionshandbuch.dpunkt.verlag 1998.

Dieses Buch ist keine Einführung in die Programmierung und bezieht sichauch nicht auf Java. Es ist ein Handbuch zur Entwicklung großer objektori-entierter Softwaresysteme, das die Begriffe Werkzeug und Material in denVordergrund der Betrachtung stellt.

Page 10: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

x Material

Quellen im Internet

Für die Gültigkeit der Verweise können wir über einen längeren Zeitraum hinwegleider keine Gewähr übernehmen.

1. The Java Language Specification2

2. The Java Virtual Machine Specification3

3. The Java Tutorial4

4. Guido Krüger, Thomas Stark: Handbuch der Java-Programmierung5

5. Christian Ullenbloom: Java ist auch eine Insel (8. Auflage)6

2 http://java.sun.com/docs/books/jls/

3 http://java.sun.com/docs/books/jvms/

4 http://java.sun.com/docs/books/tutorial/

5 http://www.javabuch.de/

6 http://openbook.galileocomputing.de/javainsel8/

Page 11: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

iii

Inhaltsverzeichnis

Kurseinheit 1

1 Von der Aufgabenstellung zum Programm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 11.2 Softwareentwicklung . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 21.3 EXKURS: Unified Modeling Language (UML) . . . . . . . . . . . . . .. . . . . . 4

2 Anforderungsanalyse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 92.1 Fallstudie .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 92.2 Analyse der Anwendungswelt . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 102.3 Anwendungsfälle und Akteure . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 102.4 Beziehung zwischen Akteuren . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 132.5 Beziehung zwischen Anwendungsfällen . . . . . . . . . . . . . . .. . . . . . . . . . . . . 142.6 Anwendungsfallbeschreibungen . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 162.7 Datenlexikon .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 212.8 Pflichtenheft. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 22

3 Einführung in die Objektorientierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233.1 Objekte und Klassen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 233.2 Beziehungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 253.3 Kommunikation.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 283.4 Objektorientierte Analyse und Entwurf . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 293.5 UML-Klassendiagramm.. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 313.6 UML-Objektdiagramm .. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 33

4 Einführung in die Algorithmik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .354.1 Algorithmen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 354.2 Verhaltensbeschreibung und Kontrollstrukturen . . . . .. . . . . . . . . . . . . . . 40

5 Programmiersprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . 445.1 EXKURS: Entwicklungsgeschichte von Programmiersprachen . . . 445.2 Eingabe, Verarbeitung, Ausgabe .. . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 465.3 Interaktive Programme .. . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 47

6 Einführung in die Java-Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .496.1 Entwicklung und Eigenschaften der ProgrammierspracheJava .. . . 496.2 Erstellen, Übersetzen und Ausführen von Java-Programmen .. . . . . 50

7 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 54

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . 57

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 69

Kurseinheit 2

Page 12: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

iv

8 Praktischer Einstieg in die Java-Programmierung. . . . . . . . . . . . . . . . . . . . . . 718.1 Ein erstes Programm .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 718.2 Klassen für die Praxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 738.3 Programmier- und Formatierhinweise . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 75

9 Primitive Datentypen und Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .769.1 Ganze Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 769.2 Gleitkommazahlen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 799.3 Operatoren und Ausdrücke .. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 819.4 Auswertung von Ausdrücken . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 839.5 Datentyp boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 869.6 Datentyp char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 87

10 Variablen und Zuweisungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8910.1 Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 8910.2 Zuweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 92

11 Typanpassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 9811.1 Implizite Typanpassung . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 9811.2 Explizite Typanpassung . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 103

12 Anweisungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . .10812.1 Blöcke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 10812.2 Kontrollstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 110

13 Bedingungsanweisungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 11113.1 Die einfache Fallunterscheidung .. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 11113.2 Die Mehrfach-Fallunterscheidung . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 116

14 Wiederholungs- und Sprunganweisungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11914.1 Bedingte Schleifen: while und do ... while . . . . . . . . . . .. . . . . . . . . . . . . . . 11914.2 Die Zähl- oder for-Schleife . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 12214.3 Strukturierte Sprunganweisungen: break und continue.. . . . . . . . . . . . 126

15 Gültigkeitsbereich und Sichtbarkeit von lokalen Variablen . . . . . . . . . . . .131

16 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . .134

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .137

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .153

Kurseinheit 3

17 Objekttypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .15717.1 Ein Objekt verwenden .. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 15717.2 Erzeugung und Lebensdauer von Objekten . . . . . . . . . . . . .. . . . . . . . . . . . 16117.3 Wertvariablen und Verweisvariablen . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 16217.4 Zusammenspiel von Objekten . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 167

Page 13: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

v

18 Klassenelemente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .17218.1 Klassenvereinbarung . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 17218.2 Attributdeklaration . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 17318.3 Methodendeklaration . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 17418.4 Konstruktordeklaration .. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 186

19 Klassenvariablen und -methoden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18919.1 Klassenvariablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 18919.2 Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 191

20 Felder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . .19420.1 Felder einführen und belegen . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 19420.2 Mehrdimensionale Felder . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 19920.3 Erweiterte for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 202

21 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . .204

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .207

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .229

Kurseinheit 4

22 Vererbung und Klassenhierarchien. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23522.1 Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 23522.2 Vererbung in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 23622.3 Substitutionsprinzip . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 23922.4 Überschreiben und Verdecken . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 24422.5 Die Klasse Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 25022.6 Konstruktoren und Erzeugung von Objekten einer Klasssenhier-

archie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 25122.7 Polymorphie, dynamisches und statisches Binden . . . . .. . . . . . . . . . . . . 254

23 Pakete. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . .26023.1 Vereinbarung von Paketen.. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 26023.2 Klassennamen und Import . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 261

24 Geheimnisprinzip und Zugriffskontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26424.1 Geheimnisprinzip .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 26424.2 Zugriffskontrolle bei Paketen und Klassen .. . . . . . . . .. . . . . . . . . . . . . . . . 26424.3 Zugriffskontrolle bei Klassenelementen .. . . . . . . . . .. . . . . . . . . . . . . . . . . . 266

25 Abstrakte Einheiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . 27725.1 Abstrakte Klassen und Methoden.. . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 27725.2 Schnittstellen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 283

26 Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . .28826.1 Die Klasse String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 28826.2 Die Klasse StringBuilder . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 295

Page 14: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

vi

27 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . .298

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .301

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .313

Kurseinheit 5

28 Ausnahmen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .31928.1 Ausnahmetypen.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 31928.2 Ausnahmen erzeugen und werfen. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 32128.3 Ausnahmen behandeln und weiterreichen . . . . . . . . . . . . .. . . . . . . . . . . . . . 323

29 Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . .329

30 Testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . .33230.1 Teststufen und Testarten . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 33330.2 Testplanung und -durchführung. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 33430.3 Klassen dynamisch testen . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 33530.4 Testen mit JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 33830.5 Testfälle identifizieren . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 343

31 Umgang mit Fehlern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 34731.1 Häufige Programmierfehler . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 34731.2 Fehler lokalisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 34931.3 Fehler vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 35031.4 EXKURS: Weiterführende Konzepte . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 351

32 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . .353

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .355

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .367

Kurseinheit 6

33 Suchen und Sortieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 37533.1 Suchen in Feldern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 37533.2 Sortieren von Feldern. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 379

34 Rekursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .384

35 Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .39835.1 Lineare Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 39835.2 Verkettete Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 39935.3 Spezielle Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 412

36 Graphen und Bäume. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 41636.1 Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 41636.2 Bäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 41936.3 Durchlaufstrategien für Bäume . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 421

Page 15: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

vii

36.4 Binäre Bäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 42336.5 Suche in Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 427

37 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . .432

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .433

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .455

Kurseinheit 7

38 API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . .465

39 Ein- und Ausgabe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . .468

40 Generische Typen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . .47140.1 Verwendung generischer Typen.. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 47140.2 Iteratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 47340.3 Weitere generische Typen . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 47540.4 EXKURS: Deklaration generischer Typen . . . . . . . . . . . . .. . . . . . . . . . . . . 476

41 Fallbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .47941.1 Verwendung generischer Datenstrukturen . . . . . . . . . . .. . . . . . . . . . . . . . . . 47941.2 Verwendung des Dateisystems .. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 48141.3 Erzeugung einer eigenständigen Anwendung .. . . . . . . . .. . . . . . . . . . . . . 484

42 Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . .486

Lösungshinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . .487

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .495

Page 16: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

384 34 Rekursion

34 Rekursion

Bisher entwickelten wir Algorithmen auf der Basis von Programmstrukturen, dieaus Folgen von Anweisungen, aus Verzweigungen und aus Schleifen bestanden.Schleifen wurden insbesondere dann verwandt, wenn Datenstrukturen mit einer va-riierenden Anzahl von Elementen iterativ zu verarbeiten waren. In diesem Kapitelwollen wir unser Inventar an Programmstrukturen um das Prinzip der RekursionRekursion

erweitern.

Definition 34-1: Rekursiver AlgorithmusEin Algorithmus ist rekursiv, wenn er Methoden (oder Funktionen) enthält, die sichRekursiver Algorithmus

selbst aufrufen.

Jede rekursive Lösung umfasst zwei grundlegende Teile:

• den Basisfall, für den das Problem auf einfache Weise gelöstwerden kann, undBasisfall

• die rekursive Definition.rekursive Definition

Die rekursive Definition besteht aus drei Facetten:

1. die Aufteilung des Problems in einfachere Teilprobleme,

2. die rekursive Anwendung auf alle Teilprobleme und

3. die Kombination der Teillösungen in eine Lösung für das Gesamtproblem.

Bei der rekursiven Anwendung ist darauf zu achten, dass wir uns mit zunehmenderRekursionstiefe an den Basisfall annähern. Wir bezeichnendiese Eigenschaft alsKonvergenz der Rekursion.Konvergenz

2

Eine rekursive algorithmische Lösung bietet sich immer dann an, wenn man einProblem in einfachere Teilprobleme aufspalten kann, die mit dem Originalproblemnahezu identisch sind und die man zuerst nach dem gleichen Verfahren löst.

Nehmen wir an, dass wir die Summe der ersten n natürlichen Zahlen berechnenwollen. Dies können wir mit unserem bisherigen Wissen iterativ mit Hilfe einerSchleife lösen.

int summeIterativ(int n) {

int ergebnis = 0;

for (int i = 1; i <= n; i++) {ergebnis += i;

}return ergebnis;

}

Wir können es aber auch als rekursives Problem definieren, denn die Summe derersten n Zahlen lässt sich berechnen, indem zunächst die Summe der ersten n-1

Page 17: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

385

Zahlen berechnet wird und anschließend die n-te Zahl hinzuaddiert wird. Das Pro-blem wird dadurch von n Zahlen auf n-1 Zahlen reduziert. Natürlich müssen wirauch einen Basisfall identifizieren. Dieser ist erreicht, wenn keine Zahl mehr übrigist. Wir können das Problem folgendermaßen mathematisch beschreiben:

summe(n) =

{

0 wennn == 0

summe(n − 1) + n sonst

In Java können wir eine solche Lösung formulieren, indem wirdie Methode selbstwieder aufrufen:

int summeRekursiv(int n) {// Basisfall: keine Zahl übrig

if (n == 0) {return 0;

}

// sonst: rekursiver Aufrufreturn summeRekursiv(n - 1) + n;

}

Wird nun die MethodesummeRekursiv() mit dem Wert 5 aufgerufen, so findendie folgenden Berechnungen statt:

summeRekursiv(5) =

summeRekursiv(5 - 1) + 5 =

(summeRekursiv(4 - 1) + 4) + 5 =((summeRekursiv(3 - 1) + 3) + 4) + 5 =

(((summeRekursiv(2 - 1) + 2) + 3) + 4) + 5 =((((summeRekursiv(1 - 1) + 1) + 2) + 3) + 4) + 5 = // Basisfall

((((0 + 1) + 2) + 3) + 4) + 5 =

(((1 + 2) + 3) + 4) + 5 =((3 + 3) + 4) + 5 =

(6 + 4) + 5 =10 + 5 =

15

Selbsttestaufgabe 34-1:

Was passiert, wenn die MethodesummeRekursiv() mit negativen Werten auf-gerufen wird? Wie kann dieses Problem gelöst werden?

Eine weiteres Beispiel ist die Fakultätsfunktion. Sie spielt bei vielen mathemati- Fakultätsfunktion

schen Anwendungen eine wichtige Rolle. Sie wird typischerweise durch das Aus-rufezeichen „!“ symbolisiert. Die Fakultätsberechnung ist für Eingabewerten ≥ 0

wie folgt definiert:

n! =

{

n ∗ (n − 1)! wennn > 1

1 wennn <= 1

Page 18: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

386 34 Rekursion

Selbsttestaufgabe 34-2:

Implementieren Sie eine MethodefakultaetIterativ(int n), die iterativdie Fakultät berechnet und eine MethodefakultaetRekursiv(int n), diedie Fakultät rekursiv berechnet. Die Methoden sollen dabeinur Werten ≥ 0 akzep-tieren.

Selbsttestaufgabe 34-3:

Begründen Sie, warum die Lösung fürfakultaetRekursiv() konvergiert.

Selbsttestaufgabe 34-4:

Schreiben Sie die Methodedouble power(int p, int n), die für zweiganze Zahlenp und n rekursiv den Wertpn berechnet. Testen Sie Ihr Programmund vergleichen Sie es mit der Lösung von Selbsttestaufgabe14.1-2, die eine itera-tive Variante aufzeigt.

Die bisher betrachteten rekursiven Methoden hatten die Eigenschaft, dass sie nureinen rekursiven Aufruf pro Ablaufpfad beinhalten. Allerdings gibt es auch einigeProbleme, die mehrere rekursive Aufrufe benötigen. Ein bekanntes Beispiel sind dieFibonacci-Zahlen. Die Fibonacci-Zahlen berechnen sich nach der folgenden For-Fibonacci-Zahlen

mel:

fib(n) =

{

n wenn0 ≤ n ≤ 1

fib(n − 1) + fib(n − 2) wennn > 1

Selbsttestaufgabe 34-5:

Berechnen Sie alle Fibonacci-Zahlen bisfib(8).

Die Implementierung einer passenden Methode ist nach dem gleichen Muster wieoben möglich. Negative Werte fürn sind nicht zulässig; bei negativen Werten wer-fen wir eineIllegalArgumentException .

long fibRekursiv(int n) {if (n < 0) {

throw new IllegalArgumentException();}

// Basisfall: n ist 0 oder 1if (n == 0 || n == 1) {

Page 19: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

387

return n;

}// sonst: rekursiver Aufruf

return fibRekursiv(n - 1) + fibRekursiv(n - 2);

}

Selbsttestaufgabe 34-6:

Implementieren Sie eine iterative Lösung für die Berechnung der Fibonacci-Zahlenin der Methodelong fibIterativ(int n).

Selbsttestaufgabe 34-7:

In der Programmierung werden bisweilen Zufallszahlen benötigt. Es gibt Formelnzur Erzeugung sogenannter Pseudozufallszahlen, die eine Folge zufälliger Zahlen Pseudozufallszahlen

simulieren. Eine mögliche Formel zur Erzeugung solcher Zahlen ist die folgende:

f(n) =

{

n + 1 wennn < 3

1 + (((f(n − 1) − f(n − 2)) ∗ f(n − 3)) mod100) sonst

Implementieren Sie eine Methodelong zufallszahl(int n), die rekursivf(n) berechnet.

Implementieren Sie außerdem eine Methodevoid gebeZufallszahlenAus(),die die Pseudozufallszahlenf(5) bis einschließlichf(30) ausgibt.

Bisher haben wir noch nicht weiter darüber nachgedacht, wiees funktionieren kann,dass eine Methode sich selbst aufruft. In Java wird bei einemMethodenaufruf einMethodenrahmen erzeugt. In diesem Methodenrahmen sind alle aktuellen Werte der Methodenrahmen

Parameter und lokalen Variablen gespeichert sowie ein Verweis auf die aufrufendeMethode (siehe Abb. 34-1). Die Anweisungen einer Methode existieren nur einmal,sie sind nicht in jedem Methodenrahmen gespeichert.

Aufrufer:

Name:

Parameter:

Lokale Variablen:

Abb. 34-1: Ein Methodenrahmen

Page 20: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

388 34 Rekursion

Ruft nun eine Methode eine andere auf, so wird ein neuer Methodenrahmen erzeugt,und die Parameter und lokalen Variablen werden mit ihren Werten initialisiert. Da-bei macht es keinen Unterschied, ob eine Methode eine andereoder eben sich selbstaufruft. Ist die aufgerufene Methode beendet, so wird dies dem Aufrufer – ggf. zu-sammen mit einem Rückgabewert – mitgeteilt.

Gegeben seien die beiden folgenden Methoden:

int a(int x) {

int y = 2 * x;

int z = 3;int w = b(y, z) + x;

return w;}

int b(int c, int d) {

int e = c + 2 * d;

return e;}

Beim Aufruf der Methodea() mit dem Argument3 wird ein Methodenrahmen fürden Aufrufa(3) erzeugt (Abb. 34-2).

Aufrufer:

Name: a()

Parameter:

x = 3

Lokale Variablen:

y = 6

z = 3

w =

Abb. 34-2: Methodenrahmen füra(3)

Erreicht die Ausführung vona(3) den Aufruf vonb(6, 3) , so wird auch dafürein Methodenrahmen erzeugt (Abb. 34-3).

Page 21: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

389

Aufrufer:

Name: a

Parameter:

x = 3

Lokale Variablen:

y = 6

z = 3

w =

Aufrufer:

Name: b

Parameter:

c = 6

d = 3

Lokale Variablen:

e = 12

Abb. 34-3: Methodenrahmen füra(3) undb(6, 3)

Ist die Ausführung vonb(6,3) beendet, kann der zugehörige Methodenrahmenwieder gelöscht werden und die Ausführung vona(3) wird an der entsprechendenStelle fortgesetzt.

Bei einer rekursiven Methode passiert das gleiche, nur dassdort die Methoden-rahmen alle von der gleichen Methode stammen. Sie werden jeweils mit eigenenParametern und lokalen Variablen erzeugt. Abb. 34-4 veranschaulicht die Schrittebei der Ausführung vonsummeRekursiv(4) .

Aufrufer:

Name: summeRekursiv()

Parameter:

n = 4

Lokale Variablen:

Aufrufer:

Name: summeRekursiv()

Parameter:

n = 3

Lokale Variablen:

Aufrufer:

Name: summeRekursiv()

Parameter:

n = 2

Lokale Variablen:

Aufrufer:

Name: summeRekursiv()

Parameter:

n = 1

Lokale Variablen:

Aufrufer:

Name: summeRekursiv()

Parameter:

n = 0

Lokale Variablen:

Abb. 34-4: Methodenstapel bei der Ausführung vonsummeRekursiv(4)

Wenn eine Methode eine andere aufruft, so entsteht ein sogenannter MethodenstapelMethodenstapel

(engl. stack). Vom Methodenstapel wird immer nur die oberste, also die zuletzt auf-gerufene Methode ausgeführt. Erst wenn diese beendet ist und wieder vom Stapelentfernt wurde, kann die Methode darunter fortgesetzt werden. Die Datenstrukturdes Stapels findet auch in anderen Bereichen Anwendung (siehe Kapitel 35).

Bemerkung: StackOverflowErrorWenn nicht mehr genug Speicherplatz für neue Methodenrahmen vorhanden ist,

StackOverflowErrorerzeugt die virtuelle Maschine in Java einenStackOverflowError. Dieser Fall

Page 22: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

390 34 Rekursion

tritt auf, wenn eine Rekursion niemals den Basisfall erreicht oder den Basisfall erstnach zu vielen Schritten erreichen würde.

2

Rekursionen können nicht nur bei mathematischen Funktionen verwendet werden,sondern auch in vielen anderen Bereichen.

Ein Palindrom ist ein Wort, dass sowohl vorwärts als auch rückwärts gelesen dasPalindrom

gleiche ist.

Selbsttestaufgabe 34-8:

Implementieren Sie die Methodeboolean istPalindromIterativ

(String s), die iterativ prüft ob es sich bei der Zeichenkette um ein Palin-drom handelt.

Der Begriff Palindrom lässt sich auch rekursiv definieren. Ein Wort aus einem oderkeinen Zeichen ist immer ein Palindrom. Ein längeres Wort ist dann ein Palindrom,wenn der erste und letzte Buchstabe identisch sind und der Rest der Zeichenkette,also ohne den ersten und letzten Buchstaben, auch ein Palindrom ist.

Selbsttestaufgabe 34-9:

Implementieren Sie die Methodeboolean istPalindromRekursiv

(String s), die mit Hilfe der rekursiven Definition prüft, ob es sich beiderZeichenkette um ein Palindrom handelt.

Auch für das Suchen in und das Sortieren von Feldern gibt es einige rekursive Al-gorithmen. Bisher haben wir ein sortiertes Feld immer iterativ von einem Endezum anderen durchsucht. Dieses Verfahren wird auch lineareSuche genannt. Wirlineare Suche

können jedoch auch das mittlere Element eines sortierten Feldes betrachten undentscheiden, in welcher der beiden Hälften sich unser gesuchtes Element befindet.Anschließend halbieren wir die Hälfte wieder und treffen die gleiche Entscheidung.Wir gehen solange so vor, bis die zu durchsuchende Menge maximal noch 2 Ele-mente beinhaltet. Abb. 34-5 veranschaulicht dieses Verfahren.

2 4 5 11 13 19 3022

Suche: 32

32 37 45 51 53 60 7768

30>32?

51>32?

nur noch

2 Elemente

Abb. 34-5: Binäre Suche

Page 23: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

391

Wir können die Methodeboolean istEnthalten(int wert, int[]

feld, int start, int ende) , die im Bereichstart bis einschließlichende im Feld nach dem Wert sucht, folgendermaßen rekursiv implementieren:

// wir gehen von einem sortierten Feld ausboolean istEnthalten(int wert, int[] feld,

int start, int ende) {

// Basisfall: Bereich enthält maximal 2 Elementeif (ende - start <= 1) {

return feld[start] == wert || feld[ende] == wert;}

// sonst: rekursive Aufteilung

// Mitte bestimmenint mitte = start + (ende - start) / 2;

if (feld[mitte] == wert) {// wert gefunden

return true;}

if (feld[mitte] > wert) {

// in linker Hälfte suchenreturn istEnthalten(wert, feld, start, mitte - 1);

} else {// in rechter Hälfte suchen

return istEnthalten(wert, feld, mitte + 1, ende);

}}

Wir stellen fest, dass die Methode zwei Parameter hat, die für eine Überprüfung,ob ein Element in einem Feld enthalten ist, nicht wirklich notwendig sind. Wirkönnen die Methode mit vier Parametern alsprivate deklarieren und zusätzlicheine öffentliche Methode mit zwei Parametern anbieten, diedie private Methodedann aufruft.

public class Binaersucher {

public boolean istEnthalten(int wert, int[] feld) {

return istEnthalten(wert, feld, 0, feld.length - 1);

}

private boolean istEnthalten(int wert, int[] feld,int start, int ende) {

// ...

}}

Dieser Algorithmus wird als binäre Suche (engl. binary search) bezeichnet. Natür- binäre Suchebinary searchlich könnte auch schon bei größeren Restmengen auf ein anderes, zum Beispiel

iteratives Suchverfahren umgeschaltet werden.

Page 24: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

392 34 Rekursion

Ein ähnliches Verfahren wenden wir auch häufig an, wenn wir zum Beispiel in ei-nem Lexikon nach einem bestimmten Begriff suchen. Wir schlagen eine Seite auf,sehen nach, ob wir uns vor oder nach dem gesuchten Wort im Alphabet befinden,und wählen dann aus, in welchem Teil wir weitersuchen. Dabeilassen wir jedochbei der Auswahl der nächsten Seite unser Wissen über die Position der Buchstabenim Alphabet mit einfließen, so dass wir nicht immer genau die Mitte des entspre-chenden Teils auswählen. Dieses Wissen steht bei der binären Suche nicht zur Ver-fügung. Wird Wissen über die Verteilung bei der Suche berücksichtigt, so sprichtman von einer Interpolationsuche.Interpolationsuche

Selbsttestaufgabe 34-10:

Führen Sie auf dem folgenden Feld eine binäre und eine lineare Suche nach demElement 38 aus. Wie viele Vergleiche benötigen Sie, bis Sie das Element gefundenhaben?

int[] y = {3, 7, 14, 16, 18, 22, 27, 29, 30, 34, 38, 40, 50};

Selbsttestaufgabe 34-11:

Ergänzen Sie die KlasseBinaersucher um eine MethodebooleanistEnthalten(String s, String[] feld), die mit Hilfe einer bi-nären Suche prüft, ob die Zeichenkette in dem Feld enthaltenist. Sie können sichdabei Hilfsmethoden definieren. Hilfsmethoden sollten nach dem Geheimnisprinzipgekapselt sein.

Für das Sortieren von Feldern gibt es beispielsweise den Algorithmus Quicksort.Sortieren von FeldernQuicksort Bei diesem Verfahren wird zufällig ein Element des Feldes als sogenanntes

Pivotelement ausgewählt. Anschließend werden die Elemente des Feldes aufgeteilt.Pivotelement

In dem einen Teil befinden sich alle Elemente, die kleiner alsdas Pivotelement sindund im anderen alle, die größer als das Pivotelement sind. Anschließend werden bei-de Teile wiederum mit dem gleichen Verfahren aufgeteilt. Bei Teilen mit maximalzwei Elementen kann die Sortierung dann direkt vorgenommenwerden. Anschlie-ßend ist das gesamte Feld sortiert. Abb. 34-6 veranschaulicht dieses Verfahren.

Um dieses Verfahren zu implementieren teilen wir den Algorithmus in zwei Teile.Das Aufteilen des Feldes implementieren wir in der Methodeaufteilen() unddas Sortieren in der Methodequicksort()

Dafür prüfen wir zunächst, ob das Feld weniger als 3 Elementebeinhaltet. Ist diesder Fall, so werden die beiden Elemente, wenn nötig, vertauscht. Bei einem grö-ßeren Feld wird das Feld mit Hilfe der Methodeaufteilen() umsortiert. An-schließend werden die beiden Teile rekursiv mit dem gleichen Verfahren sortiert.

Page 25: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

393

Pivotelement

7 35 17 67 5 2 1123 3 15 4521

7 35 17 67 23 11 2115 455 32

> 7<= 7

32

<= 5

werden direkt

sortiert

17 23 11 15 21

<= 35

5 7 35 67 45

werden direkt

sortiert

> 35

32 45 675 7 351711 15 23 21

werden direkt

sortiertwerden direkt

sortiert

32 45 675 7 351711 15 21 23

2 3 5 7 11 15 2117 23 35 6745

<= 17 > 17

Abb. 34-6: Quicksort

Um zu wissen, in welchem Bereich sie sortieren soll, benötigt die Methodequicksort() zwei zusätzliche Parameter, ähnlich wie bei der binären Suche.

void quicksort(int[] feld, int start, int ende) {

// Basisfall: leeres Feldif (ende < start) {

return;}

// Basisfall: maximal 2 Elemente,

if (ende - start <= 1) {// wenn nötig die beiden Werte vertauschen

if (feld[start] > feld[ende]) {int temp = feld[start];

feld[start] = feld[ende];

feld[ende] = temp;}

return;}

// Feld aufteilenint grenze = aufteilen(feld, start, ende);

// linken Teil (ohne Pivot) Sortieren

quicksort(feld, start, grenze - 1);// rechten Teil (ohne Pivot) Sortieren

quicksort(feld, grenze + 1, ende);}

Um das Feld entsprechend aufzuteilen, wählen wir das erste Element als Pivotele-ment. Anschließend beginnen wir, vom zweiten Element an aufsteigend, ein Ele-ment zu suchen, das größer als das Pivotelement ist. Ebenso beginnen wir, vom

Page 26: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

394 34 Rekursion

letzten Element an absteigend, ein Element zu suchen, dass kleiner ist als das Pivot-element. Haben wir diese beiden Elemente gefunden, so vertauschen wir sie und su-chen von den Positionen aus weiter. Das Vertauschen endet, sobald sich die Suchin-dizes von links und rechts treffen. Das Element an der Grenzewird anschließendmit dem Pivotelement vertauscht. Dieses Vorgehen ist in Abb. 34-7 dargestellt.

Pivotelement

7 35 17 67 5 2 1123 3 15 4521

l rr

7 3 17 67 5 2 1123 35 15 4521

l r

r r

l rrr

7 3 2 67 5 17 1123 35 15 4521

l l r r

7 3 2 5 67 17 1123 35 15 4521

l rl

Suchindizes haben

sich getroffen,

Pivotelement an

richtige Stelle tauschen

5 3 2 7 67 17 1123 35 15 4521

Abb. 34-7: Aufteilen eines Feldes an Hand des Pivotelements

// teilt die Elemente auf und liefert die

// Position des Pivotelements zurück

int aufteilen(int[] feld, int start, int ende) {// Index von links

int l = start + 1;// Index von rechts

int r = ende;

// Pivotelementint pivot = feld[start];

// Umsortierungwhile (l < r) {

// erstes Element größer als Pivot findenwhile(feld[l] <= pivot && l < r) {

l++;

}

Page 27: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

395

// erstes Element kleiner als Pivot finden

while(feld[r] > pivot && l < r) {r--;

}

// Elemente vertauschenint temp = feld[l];

feld[l] = feld[r];feld[r] = temp;

}// Indizes haben sich getroffen

// prüfen ob Grenze korrekt

if(feld[l] > pivot) {// Grenze anpassen

l--;}

// Grenze gefunden, Pivot entsprechend vertauschen

feld[start] = feld[l];feld[l] = pivot;

return l;}

Selbsttestaufgabe 34-12:

Versuchen Sie, die einzelnen Schritte in der Implementierung mit Hilfe des folgen-den Beispielaufrufs nachzuvollziehen.

int[] x = {12,2,6,1,8,34,10,7,20};

quicksort(feld, 0, feld.length - 1);

Ein weiteres rekursives Sortierverfahren ist das „Sortieren durch Verschmelzen“ Sortieren durchVerschmelzen(engl. merge sort). Bei diesem Verfahren wird im Gegensatz zu Quicksort nichtmerge sortbeim Aufteilen sortiert, sondern erst wieder beim Zusammenfügen. Das Feld wird

in zwei möglichst gleich große Hälften aufgeteilt, die nachdem gleichen Verfahrensortiert werden. Die beiden sortierten Teilfelder werden nun zu einer sortierten Ge-samtliste vereint, indem die beiden ersten Elemente verglichen und das kleinere ausseinem Teil entnommen und in das Zielfeld übernommen wird. Das wird solangefortgesetzt, bis beide Teilfelder leer sind. Abb. 34-9 veranschaulicht die Aufteilungund Verschmelzung der Felder.

Page 28: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

396 34 Rekursion

7 35 17 67 5 2 1123 3 15 4521

1123 3 15 45217 35 17 67 5 2

1123 367 5 27 35 17 15 4521

7 35 17 67 5 2 11 3 45211523

113 232 5 677 17 35 15 4521

113 15 21 45232 5 7 17 35 67

7 17 35 67 2 5 3 11 45211523

werden direkt

sortiert

werden direkt

sortiert

werden direkt

sortiert

werden direkt

sortiert

2 3 5 7 11 15 2117 23 35 6745

V

E

R

S

C

H

M

E

L

Z

E

N

A

U

F

T

E

I

L

E

N

Abb. 34-9: Sortieren durch Verschmelzen (merge sort)

Das Verschmelzen der beiden TeilfelderL = 〈l1, l2, . . . , lm〉 und R =

〈r1, r2, . . . , rn〉 ist in Abb. 34-10 dargestellt und kann folgendermaßen definiert

werden:

merge(L, R) =

L wennR leer ist

R wennL leer ist

l1 + merge(〈l2, . . . , lm〉, R) wennl1 ≤ r1

r1 + merge(L, 〈r2, . . . , rn〉) sonst

Das Zeichen „+“ soll hier bedeuten, dass das Element vorne inein Feld eingefügtwird.

Page 29: Kurs 20022 Einführung in die objektorientierte ... · Abb. 2: Dipl.-Inf. Silvia Schreier Wissenschaftliche Mitarbeiterin am Lehrgebiet DVT Silvia Schreier ist wissenschaftliche Mitarbeiterin

397

113 15 21 45232 5 7 17 35 67

2

min(2,3)

113 15 21 45235 7 17 35 67

2

min(5,3)

3

11 15 21 45235 7 17 35 67

2

min(5,11)

3 5

Abb. 34-10: Verschmelzen zweier sortierter Felder

Bei einer Implementierung würden wir feststellen, dass dasVerschmelzen der Fel-der sehr mühsam ist, da wir immer wieder neue Felder erzeugenmüssten, in die wirdie Elemente hinein kopieren. Im folgenden Kapitel 35 werden wir Datenstrukturenkennen lernen, die die dafür notwendigen Operationen, wie zum Beispiel das Ein-fügen und Löschen von Elementen, das wir beim Verschmelzen benötigen, besserunterstützen.

Selbsttestaufgabe 34-13:

Versuchen Sie, das folgende Feld mit Hilfe des Algorithmus „Sortieren durch Ver-schmelzen“ von Hand zu sortieren.

int[] x = {12,2,6,1,8,34,10,7,20};