Das Lehrbuch vermittelt die Grundlagen der Programmierung auf Basis der Programmiersprache Java. Es richtet sich an Studenten und alle Programmiereinsteiger. Nach den elementaren Schritten der Programmierung erläutern die Autoren in Band 1 die grundlegenden Strukturen von Java. Darauf folgen die Grundzüge der Objektorientierung. Alle Themenkomplexe werden anhand von Praxisbeispielen mit Übungsaufgaben illustriert.Im Internet: Links zu Software und Tools, zusätzliche Übungen mit Lösungshinweisen und mehr
Dieses Lehrbuch vermittelt die Grundlagen der Programmierung auf Basis der Programmiersprache Java, wie sie in Einführungsvorlesungen an Hochschulen gelehrt werden.Der erste von zwei Bänden konzentriert sich auf die Grundlagen der Programmierung und der Objektorientierung. Nach den elementaren Sprachelementen, Datentypen und Kontrollstrukturen behandeln die Autoren die Themen Referenzdatentypen (Felder, Klassen) und Methoden. Danach folgen die Grundzüge der Objektorientierung (Klassen, Vererbung, Polymorphismus, Modellierung mit der UML) und die Ausnahmebehandlung.Alle Themenkomplexe werden anhand von Praxisbeispielen illustriert. Jedes Kapitel enthält Übungsaufgaben. Die Highlights: - Setzt wirklich keine Programmierkenntnisse voraus- Mit zahlreichen Übungsaufgaben und Praxisbeispielen- Berücksichtigt den Sprachstandard 1.4 und gibt einen Ausblick auf Java 5.0.- "Die goldenen Regeln der Code-Formatierung" zum Heraustrennen und überall hin MitnehmenIm Internet: Unter www.grundkurs-java.de finden Sie Links zu Software und Tools, alle Beispiel-Programme, zusätzliche Übungen, Lösungen zu allen Übungsaufgaben, Aktualisierungen und mehr.Fortsetzung folgt: Der zweite Band "Programmierung kommerzieller Systeme" konzentriert sich auf Themen, die für kommerzielle Anwendungen relevant sind, wie Applets, AWT- und Swing-Komponenten, Ereignis-Verarbeitung, Threads, Ein-/Ausgabe über Streams und Client- und Server-Socket-Programmierung.
Inhaltsverzeichnis
Vorwort 15
1 Einleitung 17
1.1 Java - mehr als nur kalter Kaffee? . . . . . . . . . . . . . . . . . . . . 17
1.2 Java f Ür Anf¨anger - Das Konzept dieses Buches . . . . . . . . . . . 18
1.3 Weitere Infos und Kontakt zu den Autoren . . . . . . . . . . . . . . 19
1.4 Verwendete Schreibweisen . . . . . . . . . . . . . . . . . . . . . . . . 20
2 Einige Grundbegriffe aus der Welt des Programmierens 21
2.1 Computer, Software, Informatik und das Internet . . . . . . . . . . 21
2.2 Was heißt Programmieren? . . . . . . . . . . . . . . . . . . . . . . . 24
I Einstieg in das Programmieren in Java 29
3 Aller Anfang ist schwer 31
3.1 Mein erstes Programm . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Formeln, AusdrÜcke und Anweisungen . . . . . . . . . . . . . . . . 32
3.3 Zahlenbeispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4 Verwendung von Variablen . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 ”Auf den Schirm!' . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6 Das Programmger¨ust . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.7 Eingeben, Übersetzen und ausf ¨uhren . . . . . . . . . . . . . . . . . . 36
3.8 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4 Grundlagen der Programmierung in Java 39
4.1 Grundelemente eines Java-Programms . . . . . . . . . . . . . . . . . 39
4.1.1 Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.2 Bezeichner und Namen . . . . . . . . . . . . . . . . . . . . . 43
4.1.3 Literale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.4 Reservierte W¨orter, Schl Üsselw¨orter . . . . . . . . . . . . . . 45
4.1.5 Trennzeichen . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.6 Interpunktionszeichen . . . . . . . . . . . . . . . . . . . . . . 46
8 Inhaltsverzeichnis
4.1.7 Operatorsymbole . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.8 import-Anweisungen . . . . . . . . . . . . . . . . . . . . . . 47
4.1.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2 Erste Schritte in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.1 Grundstruktur eines Java-Programms . . . . . . . . . . . . . 50
4.2.2 Ausgaben auf der Konsole . . . . . . . . . . . . . . . . . . . . 51
4.2.3 Eingaben von der Konsole . . . . . . . . . . . . . . . . . . . . 53
4.2.4 Sch¨oner Programmieren in Java . . . . . . . . . . . . . . . . 53
4.2.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.3 Einfache Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.3.1 Ganzzahlige Datentypen . . . . . . . . . . . . . . . . . . . . . 56
4.3.2 Gleitkommatypen . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3.3 Der Datentyp char f Ür Zeichen . . . . . . . . . . . . . . . . 59
4.3.4 Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.3.5 Der Datentyp boolean f ÜrWahrheitswerte . . . . . . . . . 60
4.3.6 Implizite und explizite Typumwandlungen . . . . . . . . . . 60
4.3.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 62
4.3.8 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.4 Der Umgang mit einfachen Datentypen . . . . . . . . . . . . . . . . 63
4.4.1 Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.4.2 Operatoren und AusdrÜcke . . . . . . . . . . . . . . . . . . . 67
4.4.2.1 Arithmetische Operatoren . . . . . . . . . . . . . . 68
4.4.2.2 Bitoperatoren . . . . . . . . . . . . . . . . . . . . . . 70
4.4.2.3 Zuweisungsoperator . . . . . . . . . . . . . . . . . 72
4.4.2.4 Vergleichsoperatoren und Logische Operatoren . . 74
4.4.2.5 Inkrement- und Dekrementoperatoren . . . . . . . 75
4.4.2.6 Priorit¨at und Auswertungsreihenfolge der Operatoren
. . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.4.3 Allgemeine AusdrÜcke . . . . . . . . . . . . . . . . . . . . . 77
4.4.4 Ein- und Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 78
4.4.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 80
4.4.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.5 Anweisungen und Ablaufsteuerung . . . . . . . . . . . . . . . . . . 83
4.5.1 Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.5.2 Bl¨ocke und ihre Struktur . . . . . . . . . . . . . . . . . . . . . 84
4.5.3 Entscheidungsanweisung . . . . . . . . . . . . . . . . . . . . 85
4.5.3.1 Die if-Anweisung . . . . . . . . . . . . . . . . . . 85
4.5.3.2 Die switch-Anweisung . . . . . . . . . . . . . . . 86
4.5.4 Wiederholungsanweisungen, Schleifen . . . . . . . . . . . . 88
4.5.4.1 Die for-Anweisung . . . . . . . . . . . . . . . . . . 88
4.5.4.2 Die while-Anweisung . . . . . . . . . . . . . . . . 89
4.5.4.3 Die do-Anweisung . . . . . . . . . . . . . . . . . . 90
Inhaltsverzeichnis 9
4.5.4.4 Endlosschleifen . . . . . . . . . . . . . . . . . . . . 91
4.5.5 Sprungbefehle und markierte Anweisungen . . . . . . . . . 92
4.5.6 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 94
4.5.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 94
5 Praxisbeispiele 99
5.1 Worum geht es in diesem Kapitel? . . . . . . . . . . . . . . . . . . . 99
5.2 Teilbarkeit zum Ersten . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 99
5.2.3 Algorithmische Beschreibung . . . . . . . . . . . . . . . . . . 100
5.2.4 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . 101
5.2.5 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.2.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.3 Teilbarkeit zum Zweiten . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.3.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.3.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 103
5.3.3 Algorithmische Beschreibung . . . . . . . . . . . . . . . . . . 104
5.3.4 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . 104
5.3.5 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.3.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.4 Dreierlei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 108
5.4.3 Algorithmische Beschreibung . . . . . . . . . . . . . . . . . . 108
5.4.4 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . 108
5.4.5 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.4.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 112
6 Referenzdatentypen 117
6.1 Felder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.1.1 Was sind Felder ? . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.1.2 Deklaration, Erzeugung und Initialisierung von Feldern . . 123
6.1.3 Felder unbekannter L¨ange . . . . . . . . . . . . . . . . . . . . 126
6.1.4 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
6.1.5 Ein besserer Terminkalender . . . . . . . . . . . . . . . . . . 133
6.1.6 Mehrdimensionale Felder . . . . . . . . . . . . . . . . . . . . 134
6.1.7 Mehrdimensionale Felder unterschiedlicher L¨ange . . . . . 138
6.1.8 Vorsicht, Falle: Kopieren von mehrdimensionalen Feldern . 140
6.1.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 141
6.1.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.2.1 Was sind Klassen? . . . . . . . . . . . . . . . . . . . . . . . . 145
6.2.2 Deklaration und Instantiierung von Klassen . . . . . . . . . 146
10 Inhaltsverzeichnis
6.2.3 Komponentenzugriff bei Objekten . . . . . . . . . . . . . . . 147
6.2.4 Ein erstes Adressbuch . . . . . . . . . . . . . . . . . . . . . . 148
6.2.5 Klassen als Referenzdatentyp . . . . . . . . . . . . . . . . . . 150
6.2.6 Felder von Klassen . . . . . . . . . . . . . . . . . . . . . . . . 153
6.2.7 Vorsicht, Falle: Kopieren von geschachtelten Referenzdatentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.2.8 Auslagern von Klassen . . . . . . . . . . . . . . . . . . . . . . 157
6.2.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 159
6.2.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 160
7 Unterprogramme, Methoden 161
7.1 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.1 Was sind Methoden? . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.2 Deklaration von Methoden . . . . . . . . . . . . . . . . . . . 163
7.1.3 Parameter Übergabe und -r Ückgabe . . . . . . . . . . . . . . . 164
7.1.4 Aufruf von Methoden . . . . . . . . . . . . . . . . . . . . . . 166
7.1.5 Überladen von Methoden . . . . . . . . . . . . . . . . . . . . 167
7.1.6 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.1.7 Sichtbarkeit und Verdecken von Variablen . . . . . . . . . . 171
7.1.8 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 173
7.1.9 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.2 Rekursiv definierte Methoden . . . . . . . . . . . . . . . . . . . . . . 174
7.2.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.2.2 Das Achtdamenproblem . . . . . . . . . . . . . . . . . . . . . 177
7.2.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . 177
7.2.2.2 Lösungsidee . . . . . . . . . . . . . . . . . . . . . . 177
7.2.2.3 Erste Vorarbeiten: Die Methoden ausgabe und bedroht . . . . . . . . . . . . . . . . . . . . . . . . 177
7.2.2.4 Die Rekursion . . . . . . . . . . . . . . . . . . . . . 179
7.2.2.5 Die L¨osung . . . . . . . . . . . . . . . . . . . . . . . 182
7.2.3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 184
7.2.4 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.3 Die Methode main . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.3.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 186
7.3.2 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.4 Methoden aus anderen Klassen aufrufen . . . . . . . . . . . . . . . . 188
7.4.1 Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.4.2 Die Methoden der Klasse java.lang.Math . . . . . . . . . 190
7.5 Methoden von Objekten aufrufen . . . . . . . . . . . . . . . . . . . . 191
7.5.1 Instanzmethoden . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.5.2 Die Methoden der Klasse java.lang.String . . . . . . . 192
7.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Inhaltsverzeichnis 11
8 Praxisbeispiele 201
8.1 Mastermind zum Ersten . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.1.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 202
8.1.3 Unterteilen einer Zahl . . . . . . . . . . . . . . . . . . . . . . 202
8.1.4 GÜltigkeit einer Zahl . . . . . . . . . . . . . . . . . . . . . . . 203
8.1.5 Finden einer gÜltigen Zahl . . . . . . . . . . . . . . . . . . . 204
8.1.6 Anzahl der Treffer . . . . . . . . . . . . . . . . . . . . . . . . 205
8.1.7 Ein- und Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 206
8.1.8 Zum Hauptprogramm . . . . . . . . . . . . . . . . . . . . . . 207
8.1.9 Das komplette Programm im Überblick . . . . . . . . . . . . 208
8.2 Mastermind zum Zweiten . . . . . . . . . . . . . . . . . . . . . . . . 211
8.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 211
8.2.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 211
8.2.3 Verwendete Datenstrukturen . . . . . . . . . . . . . . . . . . 211
8.2.4 Vergleich der Versuche . . . . . . . . . . . . . . . . . . . . . . 212
8.2.5 Zum Hauptprogramm . . . . . . . . . . . . . . . . . . . . . . 213
8.2.6 Das komplette Programm im Überblick . . . . . . . . . . . . 214
8.3 Black Jack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
8.3.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 216
8.3.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 217
8.3.3 Mischen eines Kartenspiels . . . . . . . . . . . . . . . . . . . 219
8.3.4 Die Pflichten des Gebers . . . . . . . . . . . . . . . . . . . . . 219
8.3.5 Zum Hauptprogramm . . . . . . . . . . . . . . . . . . . . . . 221
8.3.6 Das komplette Programm im Überblick . . . . . . . . . . . . 224
8.3.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 227
II Objektorientiertes Programmieren in Java 229
9 Die objektorientierte Philosophie 233
9.1 Die Welt, in der wir leben . . . . . . . . . . . . . . . . . . . . . . . . 233
9.2 Programmierparadigmen - Objektorientierung im Vergleich . . . . 234
9.3 Die vier Grundpfeiler objektorientierter Programmierung . . . . . . 236
9.3.1 Generalisierung . . . . . . . . . . . . . . . . . . . . . . . . . . 237
9.3.2 Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
9.3.3 Kapselung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
9.3.4 Polymorphismus . . . . . . . . . . . . . . . . . . . . . . . . . 243
9.3.5 Weitere wichtige Grundbegriffe . . . . . . . . . . . . . . . . . 244
9.4 Modellbildung - von der realenWelt in den Computer . . . . . . . 245
9.4.1 Grafisches Modellieren mit UML . . . . . . . . . . . . . . . . 245
9.4.2 CRC-Karten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.4.3 Entwurfsmuster . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
9.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
12 Inhaltsverzeichnis
10 Der grundlegende Umgang mit Klassen 251
10.1 Vom Referenzdatentyp zur Objektorientierung . . . . . . . . . . . . 251
10.2 Instanzmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
10.2.1 Zugriffsrechte . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
10.2.2 Was sind Instanzmethoden? . . . . . . . . . . . . . . . . . . . 254
10.2.3 Instanzmethoden zur Validierung von Eingaben . . . . . . . 257
10.2.4 Instanzmethoden als erweiterte Funktionalit¨at . . . . . . . . 259
10.3 Statische Komponenten einer Klasse . . . . . . . . . . . . . . . . . . 260
10.3.1 Klassenvariablen und -methoden . . . . . . . . . . . . . . . . 260
10.3.2 Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
10.4 Instantiierung und Initialisierung . . . . . . . . . . . . . . . . . . . . 266
10.4.1 Konstruktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
10.4.2 Überladen von Konstruktoren . . . . . . . . . . . . . . . . . 268
10.4.3 Der statische Initialisierer . . . . . . . . . . . . . . . . . . . . 270
10.4.4 Der Mechanismus der Objekterzeugung . . . . . . . . . . . . 273
10.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
10.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
11 Vererbung und Polymorphismus 299
11.1 Wozu braucht man Vererbung? . . . . . . . . . . . . . . . . . . . . . 299
11.1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 299
11.1.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 300
11.1.3 Ein erster Ansatz . . . . . . . . . . . . . . . . . . . . . . . . . 300
11.1.4 Eine Klasse f Ür sich . . . . . . . . . . . . . . . . . . . . . . . . 301
11.1.5 St¨arken der Vererbung . . . . . . . . . . . . . . . . . . . . . . 302
11.1.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 305
11.2 Die super-Referenz . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
11.3 Überschreiben von Methoden und Variablen . . . . . . . . . . . . . 308
11.4 Die Klasse java.lang.Object . . . . . . . . . . . . . . . . . . . . 310
11.5 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
11.6 Abstrakte Klassen und Interfaces . . . . . . . . . . . . . . . . . . . . 314
11.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
11.8 Weiteres zum Thema Objektorientierung . . . . . . . . . . . . . . . 323
11.8.1 Erstellen von Paketen . . . . . . . . . . . . . . . . . . . . . . 323
11.8.2 Zugriffsrechte . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
11.8.3 Innere Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . 325
11.8.4 Anonyme Klassen . . . . . . . . . . . . . . . . . . . . . . . . 330
11.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
11.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
12 Praxisbeispiele 345
12.1 Streng geheim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
12.1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 345
12.1.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 346
Inhaltsverzeichnis 13
12.1.3 Verschl Üsselung durch Aufbl¨ahen . . . . . . . . . . . . . . . 347
12.1.4 XOR-Verschl Üsselung . . . . . . . . . . . . . . . . . . . . . . 349
12.1.5 Ein einfacher Test . . . . . . . . . . . . . . . . . . . . . . . . . 351
12.1.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 353
12.2 Mastermind zum Dritten . . . . . . . . . . . . . . . . . . . . . . . . . 354
12.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 354
12.2.2 Die Klassen GameModel und GameEngine . . . . . . . . . . 354
12.2.3 Wir bauen ein Modell . . . . . . . . . . . . . . . . . . . . . . 358
12.2.3.1 Grundlegende Datenstruktur . . . . . . . . . . . . 358
12.2.3.2 Implementierung des Interfaces, Teil 1 . . . . . . . 359
12.2.3.3 Implementierung des Interfaces, Teil 2 . . . . . . . 360
12.2.4 Programmstart . . . . . . . . . . . . . . . . . . . . . . . . . . 362
12.2.5 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
12.2.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 364
12.3 Game of Life . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
12.3.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 364
12.3.2 Designphase . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
12.3.3 Die Klasse Zelle . . . . . . . . . . . . . . . . . . . . . . . . . 368
12.3.4 Die Klasse Petrischale . . . . . . . . . . . . . . . . . . . . 370
12.3.4.1 Interne Struktur und einfacher Datenzugriff . . . . 370
12.3.4.2 Erster Konstruktor: Zuf¨allige Belegung der Zellen 371
12.3.4.3 Zweiter Konstruktor: Die neue Generation . . . . . 374
12.3.4.4 Die komplette Klasse im Überblick . . . . . . . . . 375
12.3.5 Die Klasse Life . . . . . . . . . . . . . . . . . . . . . . . . . 377
12.3.6 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
12.3.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 380
13 Exceptions und Errors 383
13.1 Eine Einf Ührung in Exceptions . . . . . . . . . . . . . . . . . . . . . 384
13.1.1 Was ist eine Exception? . . . . . . . . . . . . . . . . . . . . . 384
13.1.2 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 386
13.1.3 Abfangen von Exceptions . . . . . . . . . . . . . . . . . . . . 386
13.1.4 Ein Anwendungsbeispiel . . . . . . . . . . . . . . . . . . . . 388
13.1.5 Die RuntimeException . . . . . . . . . . . . . . . . . . . . 391
13.1.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 393
13.2 Exceptions f Ür Fortgeschrittene . . . . . . . . . . . . . . . . . . . . . 396
13.2.1 Definieren eigener Exceptions . . . . . . . . . . . . . . . . . . 396
13.2.2 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 398
13.2.3 Vererbung und Exceptions . . . . . . . . . . . . . . . . . . . 399
13.2.4 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 403
13.2.5 Der finally-Block . . . . . . . . . . . . . . . . . . . . . . . 404
13.2.6 Die Klassen Throwable und Error . . . . . . . . . . . . . . 409
13.2.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 411
13.2.8 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 411
14 Inhaltsverzeichnis
13.3 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
13.3.1 Zusicherungen im Programmcode . . . . . . . . . . . . . . . 412
13.3.2 Compilieren des Programmcodes . . . . . . . . . . . . . . . 413
13.3.3 Ausf Ühren des Programmcodes . . . . . . . . . . . . . . . . 414
13.3.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 414
14 Zu guter Letzt . . . 415
14.1 Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
14.2 Sortieren von Feldern . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
14.3 Grafische Oberfl¨achen in Java . . . . . . . . . . . . . . . . . . . . . . 421
A Der Weg zum guten Programmierer . . . 429
A.1 Die goldenen Regeln der Code-Formatierung . . . . . . . . . . . . . 430
A.2 Die goldenen Regeln der Namensgebung . . . . . . . . . . . . . . . 433
A.3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
B Die IOTools - Tastatureingaben in Java 439
B.1 Kurzbeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
B.2 Anwendung der IOTools-Methoden . . . . . . . . . . . . . . . . . . 440
C Einige Neuerungen in Java 5.0 443
C.1 Vereinfachte Schleifen-Notation . . . . . . . . . . . . . . . . . . . . . 444
C.2 Variable Argument-Anzahl bei Methoden . . . . . . . . . . . . . . . 445
C.3 Formatierte Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
C.4 Vereinfachte Eingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
C.5 Statische Importe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
C.6 Aufz¨ahlungstypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
C.7 Generische Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . 451
C.8 Automatische Typwandlung f Ür die Wrapper-Klassen . . . . . . . . 457
D Glossar 459
Literaturverzeichnis 469
Stichwortverzeichnis 471
Dieses Lehrbuch vermittelt die Grundlagen der Programmierung auf Basis der Programmiersprache Java, wie sie in Einführungsvorlesungen an Hochschulen gelehrt werden.Der erste von zwei Bänden konzentriert sich auf die Grundlagen der Programmierung und der Objektorientierung. Nach den elementaren Sprachelementen, Datentypen und Kontrollstrukturen behandeln die Autoren die Themen Referenzdatentypen (Felder, Klassen) und Methoden. Danach folgen die Grundzüge der Objektorientierung (Klassen, Vererbung, Polymorphismus, Modellierung mit der UML) und die Ausnahmebehandlung.Alle Themenkomplexe werden anhand von Praxisbeispielen illustriert. Jedes Kapitel enthält Übungsaufgaben. Die Highlights: - Setzt wirklich keine Programmierkenntnisse voraus- Mit zahlreichen Übungsaufgaben und Praxisbeispielen- Berücksichtigt den Sprachstandard 1.4 und gibt einen Ausblick auf Java 5.0.- "Die goldenen Regeln der Code-Formatierung" zum Heraustrennen und überall hin MitnehmenIm Internet: Unter www.grundkurs-java.de finden Sie Links zu Software und Tools, alle Beispiel-Programme, zusätzliche Übungen, Lösungen zu allen Übungsaufgaben, Aktualisierungen und mehr.Fortsetzung folgt: Der zweite Band "Programmierung kommerzieller Systeme" konzentriert sich auf Themen, die für kommerzielle Anwendungen relevant sind, wie Applets, AWT- und Swing-Komponenten, Ereignis-Verarbeitung, Threads, Ein-/Ausgabe über Streams und Client- und Server-Socket-Programmierung.
Inhaltsverzeichnis
Vorwort 15
1 Einleitung 17
1.1 Java - mehr als nur kalter Kaffee? . . . . . . . . . . . . . . . . . . . . 17
1.2 Java f Ür Anf¨anger - Das Konzept dieses Buches . . . . . . . . . . . 18
1.3 Weitere Infos und Kontakt zu den Autoren . . . . . . . . . . . . . . 19
1.4 Verwendete Schreibweisen . . . . . . . . . . . . . . . . . . . . . . . . 20
2 Einige Grundbegriffe aus der Welt des Programmierens 21
2.1 Computer, Software, Informatik und das Internet . . . . . . . . . . 21
2.2 Was heißt Programmieren? . . . . . . . . . . . . . . . . . . . . . . . 24
I Einstieg in das Programmieren in Java 29
3 Aller Anfang ist schwer 31
3.1 Mein erstes Programm . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Formeln, AusdrÜcke und Anweisungen . . . . . . . . . . . . . . . . 32
3.3 Zahlenbeispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4 Verwendung von Variablen . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 ”Auf den Schirm!' . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6 Das Programmger¨ust . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.7 Eingeben, Übersetzen und ausf ¨uhren . . . . . . . . . . . . . . . . . . 36
3.8 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4 Grundlagen der Programmierung in Java 39
4.1 Grundelemente eines Java-Programms . . . . . . . . . . . . . . . . . 39
4.1.1 Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.2 Bezeichner und Namen . . . . . . . . . . . . . . . . . . . . . 43
4.1.3 Literale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.4 Reservierte W¨orter, Schl Üsselw¨orter . . . . . . . . . . . . . . 45
4.1.5 Trennzeichen . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.6 Interpunktionszeichen . . . . . . . . . . . . . . . . . . . . . . 46
8 Inhaltsverzeichnis
4.1.7 Operatorsymbole . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1.8 import-Anweisungen . . . . . . . . . . . . . . . . . . . . . . 47
4.1.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2 Erste Schritte in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.1 Grundstruktur eines Java-Programms . . . . . . . . . . . . . 50
4.2.2 Ausgaben auf der Konsole . . . . . . . . . . . . . . . . . . . . 51
4.2.3 Eingaben von der Konsole . . . . . . . . . . . . . . . . . . . . 53
4.2.4 Sch¨oner Programmieren in Java . . . . . . . . . . . . . . . . 53
4.2.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.3 Einfache Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.3.1 Ganzzahlige Datentypen . . . . . . . . . . . . . . . . . . . . . 56
4.3.2 Gleitkommatypen . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3.3 Der Datentyp char f Ür Zeichen . . . . . . . . . . . . . . . . 59
4.3.4 Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.3.5 Der Datentyp boolean f ÜrWahrheitswerte . . . . . . . . . 60
4.3.6 Implizite und explizite Typumwandlungen . . . . . . . . . . 60
4.3.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 62
4.3.8 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.4 Der Umgang mit einfachen Datentypen . . . . . . . . . . . . . . . . 63
4.4.1 Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.4.2 Operatoren und AusdrÜcke . . . . . . . . . . . . . . . . . . . 67
4.4.2.1 Arithmetische Operatoren . . . . . . . . . . . . . . 68
4.4.2.2 Bitoperatoren . . . . . . . . . . . . . . . . . . . . . . 70
4.4.2.3 Zuweisungsoperator . . . . . . . . . . . . . . . . . 72
4.4.2.4 Vergleichsoperatoren und Logische Operatoren . . 74
4.4.2.5 Inkrement- und Dekrementoperatoren . . . . . . . 75
4.4.2.6 Priorit¨at und Auswertungsreihenfolge der Operatoren
. . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.4.3 Allgemeine AusdrÜcke . . . . . . . . . . . . . . . . . . . . . 77
4.4.4 Ein- und Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 78
4.4.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 80
4.4.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.5 Anweisungen und Ablaufsteuerung . . . . . . . . . . . . . . . . . . 83
4.5.1 Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.5.2 Bl¨ocke und ihre Struktur . . . . . . . . . . . . . . . . . . . . . 84
4.5.3 Entscheidungsanweisung . . . . . . . . . . . . . . . . . . . . 85
4.5.3.1 Die if-Anweisung . . . . . . . . . . . . . . . . . . 85
4.5.3.2 Die switch-Anweisung . . . . . . . . . . . . . . . 86
4.5.4 Wiederholungsanweisungen, Schleifen . . . . . . . . . . . . 88
4.5.4.1 Die for-Anweisung . . . . . . . . . . . . . . . . . . 88
4.5.4.2 Die while-Anweisung . . . . . . . . . . . . . . . . 89
4.5.4.3 Die do-Anweisung . . . . . . . . . . . . . . . . . . 90
Inhaltsverzeichnis 9
4.5.4.4 Endlosschleifen . . . . . . . . . . . . . . . . . . . . 91
4.5.5 Sprungbefehle und markierte Anweisungen . . . . . . . . . 92
4.5.6 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 94
4.5.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 94
5 Praxisbeispiele 99
5.1 Worum geht es in diesem Kapitel? . . . . . . . . . . . . . . . . . . . 99
5.2 Teilbarkeit zum Ersten . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 99
5.2.3 Algorithmische Beschreibung . . . . . . . . . . . . . . . . . . 100
5.2.4 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . 101
5.2.5 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.2.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.3 Teilbarkeit zum Zweiten . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.3.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.3.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 103
5.3.3 Algorithmische Beschreibung . . . . . . . . . . . . . . . . . . 104
5.3.4 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . 104
5.3.5 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.3.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.4 Dreierlei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 108
5.4.3 Algorithmische Beschreibung . . . . . . . . . . . . . . . . . . 108
5.4.4 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . 108
5.4.5 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.4.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 112
6 Referenzdatentypen 117
6.1 Felder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.1.1 Was sind Felder ? . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.1.2 Deklaration, Erzeugung und Initialisierung von Feldern . . 123
6.1.3 Felder unbekannter L¨ange . . . . . . . . . . . . . . . . . . . . 126
6.1.4 Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
6.1.5 Ein besserer Terminkalender . . . . . . . . . . . . . . . . . . 133
6.1.6 Mehrdimensionale Felder . . . . . . . . . . . . . . . . . . . . 134
6.1.7 Mehrdimensionale Felder unterschiedlicher L¨ange . . . . . 138
6.1.8 Vorsicht, Falle: Kopieren von mehrdimensionalen Feldern . 140
6.1.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 141
6.1.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.2.1 Was sind Klassen? . . . . . . . . . . . . . . . . . . . . . . . . 145
6.2.2 Deklaration und Instantiierung von Klassen . . . . . . . . . 146
10 Inhaltsverzeichnis
6.2.3 Komponentenzugriff bei Objekten . . . . . . . . . . . . . . . 147
6.2.4 Ein erstes Adressbuch . . . . . . . . . . . . . . . . . . . . . . 148
6.2.5 Klassen als Referenzdatentyp . . . . . . . . . . . . . . . . . . 150
6.2.6 Felder von Klassen . . . . . . . . . . . . . . . . . . . . . . . . 153
6.2.7 Vorsicht, Falle: Kopieren von geschachtelten Referenzdatentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.2.8 Auslagern von Klassen . . . . . . . . . . . . . . . . . . . . . . 157
6.2.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 159
6.2.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 160
7 Unterprogramme, Methoden 161
7.1 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.1 Was sind Methoden? . . . . . . . . . . . . . . . . . . . . . . . 162
7.1.2 Deklaration von Methoden . . . . . . . . . . . . . . . . . . . 163
7.1.3 Parameter Übergabe und -r Ückgabe . . . . . . . . . . . . . . . 164
7.1.4 Aufruf von Methoden . . . . . . . . . . . . . . . . . . . . . . 166
7.1.5 Überladen von Methoden . . . . . . . . . . . . . . . . . . . . 167
7.1.6 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.1.7 Sichtbarkeit und Verdecken von Variablen . . . . . . . . . . 171
7.1.8 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 173
7.1.9 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.2 Rekursiv definierte Methoden . . . . . . . . . . . . . . . . . . . . . . 174
7.2.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.2.2 Das Achtdamenproblem . . . . . . . . . . . . . . . . . . . . . 177
7.2.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . 177
7.2.2.2 Lösungsidee . . . . . . . . . . . . . . . . . . . . . . 177
7.2.2.3 Erste Vorarbeiten: Die Methoden ausgabe und bedroht . . . . . . . . . . . . . . . . . . . . . . . . 177
7.2.2.4 Die Rekursion . . . . . . . . . . . . . . . . . . . . . 179
7.2.2.5 Die L¨osung . . . . . . . . . . . . . . . . . . . . . . . 182
7.2.3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 184
7.2.4 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.3 Die Methode main . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.3.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 186
7.3.2 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.4 Methoden aus anderen Klassen aufrufen . . . . . . . . . . . . . . . . 188
7.4.1 Klassenmethoden . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.4.2 Die Methoden der Klasse java.lang.Math . . . . . . . . . 190
7.5 Methoden von Objekten aufrufen . . . . . . . . . . . . . . . . . . . . 191
7.5.1 Instanzmethoden . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.5.2 Die Methoden der Klasse java.lang.String . . . . . . . 192
7.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Inhaltsverzeichnis 11
8 Praxisbeispiele 201
8.1 Mastermind zum Ersten . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.1.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 202
8.1.3 Unterteilen einer Zahl . . . . . . . . . . . . . . . . . . . . . . 202
8.1.4 GÜltigkeit einer Zahl . . . . . . . . . . . . . . . . . . . . . . . 203
8.1.5 Finden einer gÜltigen Zahl . . . . . . . . . . . . . . . . . . . 204
8.1.6 Anzahl der Treffer . . . . . . . . . . . . . . . . . . . . . . . . 205
8.1.7 Ein- und Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 206
8.1.8 Zum Hauptprogramm . . . . . . . . . . . . . . . . . . . . . . 207
8.1.9 Das komplette Programm im Überblick . . . . . . . . . . . . 208
8.2 Mastermind zum Zweiten . . . . . . . . . . . . . . . . . . . . . . . . 211
8.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 211
8.2.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 211
8.2.3 Verwendete Datenstrukturen . . . . . . . . . . . . . . . . . . 211
8.2.4 Vergleich der Versuche . . . . . . . . . . . . . . . . . . . . . . 212
8.2.5 Zum Hauptprogramm . . . . . . . . . . . . . . . . . . . . . . 213
8.2.6 Das komplette Programm im Überblick . . . . . . . . . . . . 214
8.3 Black Jack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
8.3.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 216
8.3.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 217
8.3.3 Mischen eines Kartenspiels . . . . . . . . . . . . . . . . . . . 219
8.3.4 Die Pflichten des Gebers . . . . . . . . . . . . . . . . . . . . . 219
8.3.5 Zum Hauptprogramm . . . . . . . . . . . . . . . . . . . . . . 221
8.3.6 Das komplette Programm im Überblick . . . . . . . . . . . . 224
8.3.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 227
II Objektorientiertes Programmieren in Java 229
9 Die objektorientierte Philosophie 233
9.1 Die Welt, in der wir leben . . . . . . . . . . . . . . . . . . . . . . . . 233
9.2 Programmierparadigmen - Objektorientierung im Vergleich . . . . 234
9.3 Die vier Grundpfeiler objektorientierter Programmierung . . . . . . 236
9.3.1 Generalisierung . . . . . . . . . . . . . . . . . . . . . . . . . . 237
9.3.2 Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
9.3.3 Kapselung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
9.3.4 Polymorphismus . . . . . . . . . . . . . . . . . . . . . . . . . 243
9.3.5 Weitere wichtige Grundbegriffe . . . . . . . . . . . . . . . . . 244
9.4 Modellbildung - von der realenWelt in den Computer . . . . . . . 245
9.4.1 Grafisches Modellieren mit UML . . . . . . . . . . . . . . . . 245
9.4.2 CRC-Karten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.4.3 Entwurfsmuster . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
9.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
12 Inhaltsverzeichnis
10 Der grundlegende Umgang mit Klassen 251
10.1 Vom Referenzdatentyp zur Objektorientierung . . . . . . . . . . . . 251
10.2 Instanzmethoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
10.2.1 Zugriffsrechte . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
10.2.2 Was sind Instanzmethoden? . . . . . . . . . . . . . . . . . . . 254
10.2.3 Instanzmethoden zur Validierung von Eingaben . . . . . . . 257
10.2.4 Instanzmethoden als erweiterte Funktionalit¨at . . . . . . . . 259
10.3 Statische Komponenten einer Klasse . . . . . . . . . . . . . . . . . . 260
10.3.1 Klassenvariablen und -methoden . . . . . . . . . . . . . . . . 260
10.3.2 Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
10.4 Instantiierung und Initialisierung . . . . . . . . . . . . . . . . . . . . 266
10.4.1 Konstruktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
10.4.2 Überladen von Konstruktoren . . . . . . . . . . . . . . . . . 268
10.4.3 Der statische Initialisierer . . . . . . . . . . . . . . . . . . . . 270
10.4.4 Der Mechanismus der Objekterzeugung . . . . . . . . . . . . 273
10.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
10.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
11 Vererbung und Polymorphismus 299
11.1 Wozu braucht man Vererbung? . . . . . . . . . . . . . . . . . . . . . 299
11.1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 299
11.1.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 300
11.1.3 Ein erster Ansatz . . . . . . . . . . . . . . . . . . . . . . . . . 300
11.1.4 Eine Klasse f Ür sich . . . . . . . . . . . . . . . . . . . . . . . . 301
11.1.5 St¨arken der Vererbung . . . . . . . . . . . . . . . . . . . . . . 302
11.1.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 305
11.2 Die super-Referenz . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
11.3 Überschreiben von Methoden und Variablen . . . . . . . . . . . . . 308
11.4 Die Klasse java.lang.Object . . . . . . . . . . . . . . . . . . . . 310
11.5 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
11.6 Abstrakte Klassen und Interfaces . . . . . . . . . . . . . . . . . . . . 314
11.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
11.8 Weiteres zum Thema Objektorientierung . . . . . . . . . . . . . . . 323
11.8.1 Erstellen von Paketen . . . . . . . . . . . . . . . . . . . . . . 323
11.8.2 Zugriffsrechte . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
11.8.3 Innere Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . 325
11.8.4 Anonyme Klassen . . . . . . . . . . . . . . . . . . . . . . . . 330
11.9 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
11.10 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
12 Praxisbeispiele 345
12.1 Streng geheim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
12.1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 345
12.1.2 Analyse des Problems . . . . . . . . . . . . . . . . . . . . . . 346
Inhaltsverzeichnis 13
12.1.3 Verschl Üsselung durch Aufbl¨ahen . . . . . . . . . . . . . . . 347
12.1.4 XOR-Verschl Üsselung . . . . . . . . . . . . . . . . . . . . . . 349
12.1.5 Ein einfacher Test . . . . . . . . . . . . . . . . . . . . . . . . . 351
12.1.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 353
12.2 Mastermind zum Dritten . . . . . . . . . . . . . . . . . . . . . . . . . 354
12.2.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 354
12.2.2 Die Klassen GameModel und GameEngine . . . . . . . . . . 354
12.2.3 Wir bauen ein Modell . . . . . . . . . . . . . . . . . . . . . . 358
12.2.3.1 Grundlegende Datenstruktur . . . . . . . . . . . . 358
12.2.3.2 Implementierung des Interfaces, Teil 1 . . . . . . . 359
12.2.3.3 Implementierung des Interfaces, Teil 2 . . . . . . . 360
12.2.4 Programmstart . . . . . . . . . . . . . . . . . . . . . . . . . . 362
12.2.5 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
12.2.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 364
12.3 Game of Life . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
12.3.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . 364
12.3.2 Designphase . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
12.3.3 Die Klasse Zelle . . . . . . . . . . . . . . . . . . . . . . . . . 368
12.3.4 Die Klasse Petrischale . . . . . . . . . . . . . . . . . . . . 370
12.3.4.1 Interne Struktur und einfacher Datenzugriff . . . . 370
12.3.4.2 Erster Konstruktor: Zuf¨allige Belegung der Zellen 371
12.3.4.3 Zweiter Konstruktor: Die neue Generation . . . . . 374
12.3.4.4 Die komplette Klasse im Überblick . . . . . . . . . 375
12.3.5 Die Klasse Life . . . . . . . . . . . . . . . . . . . . . . . . . 377
12.3.6 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
12.3.7 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 380
13 Exceptions und Errors 383
13.1 Eine Einf Ührung in Exceptions . . . . . . . . . . . . . . . . . . . . . 384
13.1.1 Was ist eine Exception? . . . . . . . . . . . . . . . . . . . . . 384
13.1.2 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 386
13.1.3 Abfangen von Exceptions . . . . . . . . . . . . . . . . . . . . 386
13.1.4 Ein Anwendungsbeispiel . . . . . . . . . . . . . . . . . . . . 388
13.1.5 Die RuntimeException . . . . . . . . . . . . . . . . . . . . 391
13.1.6 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 393
13.2 Exceptions f Ür Fortgeschrittene . . . . . . . . . . . . . . . . . . . . . 396
13.2.1 Definieren eigener Exceptions . . . . . . . . . . . . . . . . . . 396
13.2.2 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 398
13.2.3 Vererbung und Exceptions . . . . . . . . . . . . . . . . . . . 399
13.2.4 Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . 403
13.2.5 Der finally-Block . . . . . . . . . . . . . . . . . . . . . . . 404
13.2.6 Die Klassen Throwable und Error . . . . . . . . . . . . . . 409
13.2.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 411
13.2.8 Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . 411
14 Inhaltsverzeichnis
13.3 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
13.3.1 Zusicherungen im Programmcode . . . . . . . . . . . . . . . 412
13.3.2 Compilieren des Programmcodes . . . . . . . . . . . . . . . 413
13.3.3 Ausf Ühren des Programmcodes . . . . . . . . . . . . . . . . 414
13.3.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . 414
14 Zu guter Letzt . . . 415
14.1 Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
14.2 Sortieren von Feldern . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
14.3 Grafische Oberfl¨achen in Java . . . . . . . . . . . . . . . . . . . . . . 421
A Der Weg zum guten Programmierer . . . 429
A.1 Die goldenen Regeln der Code-Formatierung . . . . . . . . . . . . . 430
A.2 Die goldenen Regeln der Namensgebung . . . . . . . . . . . . . . . 433
A.3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
B Die IOTools - Tastatureingaben in Java 439
B.1 Kurzbeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
B.2 Anwendung der IOTools-Methoden . . . . . . . . . . . . . . . . . . 440
C Einige Neuerungen in Java 5.0 443
C.1 Vereinfachte Schleifen-Notation . . . . . . . . . . . . . . . . . . . . . 444
C.2 Variable Argument-Anzahl bei Methoden . . . . . . . . . . . . . . . 445
C.3 Formatierte Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
C.4 Vereinfachte Eingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
C.5 Statische Importe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
C.6 Aufz¨ahlungstypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
C.7 Generische Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . 451
C.8 Automatische Typwandlung f Ür die Wrapper-Klassen . . . . . . . . 457
D Glossar 459
Literaturverzeichnis 469
Stichwortverzeichnis 471