Suchen und Finden
Vorwort
18
Einleitung
20
Java – mehr als nur kalter Kaffee?
20
Java für Anfänger – das Konzept dieses Buches
21
Zusatzmaterial und Kontakt zu den Autoren
22
Verwendete Schreibweisen
23
I Einstieg in das Programmieren in Java
24
1 Einige Grundbegriffe aus der Welt des Programmierens
26
1.1 Computer, Software, Informatik und das Internet
26
1.2 Was heißt Programmieren?
28
1.3 Welche Werkzeuge brauchen wir?
31
2 Aller Anfang ist schwer
34
2.1 Mein erstes Programm
34
2.2 Formeln, Ausdrücke und Anweisungen
35
2.3 Zahlenbeispiele
36
2.4 Verwendung von Variablen
37
2.5 „Auf den Schirm!“
37
2.6 Das Programmgerüst
38
2.7 Eingeben, übersetzen und ausführen
40
2.8 Übungsaufgaben
41
3 Grundlagen der Programmierung in Java
42
3.1 Grundelemente eines Java-Programms
42
3.1.1 Kommentare
44
3.1.2 Bezeichner und Namen
46
3.1.3 Literale
47
3.1.4 Reservierte Wörter, Schlüsselwörter
48
3.1.5 Trennzeichen
48
3.1.6 Interpunktionszeichen
49
3.1.7 Operatorsymbole
50
3.1.8 import-Anweisungen
50
3.1.9 Zusammenfassung
51
3.1.10 Übungsaufgaben
52
3.2 Erste Schritte in Java
53
3.2.1 Grundstruktur eines Java-Programms
53
3.2.2 Ausgaben auf der Konsole
54
3.2.3 Eingaben von der Konsole
56
3.2.4 Schöner programmieren in Java
56
3.2.5 Zusammenfassung
57
3.2.6 Übungsaufgaben
58
3.3 Einfache Datentypen
58
3.3.1 Ganzzahlige Datentypen
58
3.3.1.1 Literalkonstanten in anderen Zahlensystemen
60
3.3.1.2 Unterstrich als Trennzeichen in Literalkonstanten
61
3.3.2 Gleitkommatypen
62
3.3.3 Der Datentyp char für Zeichen
64
3.3.4 Zeichenketten
64
3.3.5 Der Datentyp boolean für Wahrheitswerte
65
3.3.6 Implizite und explizite Typumwandlungen
65
3.3.7 Zusammenfassung
66
3.3.8 Übungsaufgaben
67
3.4 Der Umgang mit einfachen Datentypen
67
3.4.1 Variablen
68
3.4.2 Operatoren und Ausdrücke
71
3.4.2.1 Arithmetische Operatoren
73
3.4.2.2 Bitoperatoren
75
3.4.2.3 Zuweisungsoperator
77
3.4.2.4 Vergleichsoperatoren und logische Operatoren
77
3.4.2.5 Inkrement- und Dekrementoperatoren
80
3.4.2.6 Priorität und Auswertungsreihenfolge derOperatoren
80
3.4.3 Allgemeine Ausdrücke
82
3.4.4 Ein- und Ausgabe
82
3.4.4.1 Statischer Import der IOTools-Methoden
84
3.4.5 Zusammenfassung
85
3.4.6 Übungsaufgaben
85
3.5 Anweisungen und Ablaufsteuerung
89
3.5.1 Anweisungen
89
3.5.2 Blöcke und ihre Struktur
90
3.5.3 Entscheidungsanweisung
90
3.5.3.1 Die if-Anweisung
90
3.5.3.2 Die switch-Anweisung
92
3.5.4 Wiederholungsanweisungen, Schleifen
96
3.5.4.1 Die for-Anweisung
96
3.5.4.2 Vereinfachte for-Schleifen-Notation
97
3.5.4.3 Die while-Anweisung
98
3.5.4.4 Die do-Anweisung
98
3.5.4.5 Endlosschleifen
99
3.5.5 Sprungbefehle und markierte Anweisungen
100
3.5.6 Zusammenfassung
102
3.5.7 Übungsaufgaben
102
4 Referenzdatentypen
112
4.1 Felder
114
4.1.1 Was sind Felder?
116
4.1.2 Deklaration, Erzeugung und Initialisierung von Feldern
118
4.1.3 Felder unbekannter Länge
120
4.1.4 Referenzen
122
4.1.5 Ein besserer Terminkalender
127
4.1.6 Mehrdimensionale Felder
129
4.1.7 Mehrdimensionale Felder unterschiedlicher Länge
133
4.1.8 Vorsicht, Falle: Kopieren von mehrdimensionalen Feldern
135
4.1.9 Vereinfachte for-Schleifen-Notation
136
4.1.10 Zusammenfassung
137
4.1.11 Übungsaufgaben
138
4.2 Klassen
141
4.2.1 Willkommen in der ersten Klasse!
142
4.2.2 Komponentenzugriff bei Objekten
146
4.2.3 Ein erstes Adressbuch
146
4.2.4 Klassen als Referenzdatentyp
148
4.2.5 Felder von Klassen
151
4.2.6 Vorsicht, Falle: Kopieren von geschachtelten Referenzdatentypen
154
4.2.7 Zusammenfassung
155
4.2.8 Übungsaufgaben
155
5 Methoden, Unterprogramme
158
5.1 Methoden
159
5.1.1 Was sind Methoden?
159
5.1.2 Deklaration von Methoden
160
5.1.3 Parameterübergabe und Ergebnisrückgabe
161
5.1.4 Aufruf von Methoden
162
5.1.5 Überladen von Methoden
164
5.1.6 Variable Argumentanzahl bei Methoden
165
5.1.7 Vorsicht, Falle: Referenzen als Parameter
166
5.1.8 Sichtbarkeit und Verdecken von Variablen
169
5.1.9 Zusammenfassung
170
5.1.10 Übungsaufgaben
171
5.2 Rekursiv definierte Methoden
172
5.2.1 Motivation
172
5.2.2 Gute und schlechte Beispiele für rekursive Methoden
174
5.2.3 Zusammenfassung
177
5.3 Die Methode main
177
5.3.1 Kommandozeilenparameter
177
5.3.2 Anwendung der vereinfachten for-Schleifen-Notation
179
5.3.3 Zusammenfassung
179
5.3.4 Übungsaufgaben
180
5.4 Methoden aus anderen Klassen aufrufen
181
5.4.1 Klassenmethoden
182
5.4.2 Die Methoden der Klasse java.lang.Math
183
5.4.3 Statischer Import
184
5.5 Methoden von Objekten aufrufen
185
5.5.1 Instanzmethoden
185
5.5.2 Die Methoden der Klasse java.lang.String
186
5.6 Übungsaufgaben
188
II Objektorientiertes Programmieren in Java
194
6 Die objektorientierte Philosophie
196
6.1 Die Welt, in der wir leben
196
6.2 Programmierparadigmen – Objektorientierung im Vergleich
197
6.3 Die vier Grundpfeiler objektorientierter Programmierung
199
6.3.1 Generalisierung
199
6.3.2 Vererbung
201
6.3.3 Kapselung
204
6.3.4 Polymorphie
205
6.3.5 Weitere wichtige Grundbegriffe
206
6.4 Modellbildung – von der realen Welt in den Computer
207
6.4.1 Grafisches Modellieren mit UML
207
6.4.2 Entwurfsmuster
208
6.5 Zusammenfassung
209
6.6 Übungsaufgaben
210
7 Der grundlegende Umgang mit Klassen
212
7.1 Vom Referenzdatentyp zur Objektorientierung
212
7.2 Instanzmethoden
214
7.2.1 Zugriffsrechte
214
7.2.2 Was sind Instanzmethoden?
215
7.2.3 Instanzmethoden zur Validierung von Eingaben
218
7.2.4 Instanzmethoden als erweiterte Funktionalität
219
7.3 Statische Komponenten einer Klasse
220
7.3.1 Klassenvariablen und -methoden
221
7.3.2 Klassenkonstanten
223
7.4 Instanziierung und Initialisierung
226
7.4.1 Konstruktoren
226
7.4.2 Überladen von Konstruktoren
228
7.4.3 Der statische Initialisierer
230
7.4.4 Der Mechanismus der Objekterzeugung
232
7.5 Zusammenfassung
237
7.6 Übungsaufgaben
238
8 Vererbung und Polymorphie
258
8.1 Wozu braucht man Vererbung?
258
8.1.1 Aufgabenstellung
258
8.1.2 Analyse des Problems
259
8.1.3 Ein erster Ansatz
259
8.1.4 Eine Klasse für sich
260
8.1.5 Stärken der Vererbung
261
8.1.6 Vererbung verhindern durch final
264
8.1.7 Übungsaufgaben
265
8.2 Die super-Referenz
266
8.3 Überschreiben von Methoden und Variablen
268
8.3.1 Dynamisches Binden
268
8.3.2 Überschreiben von Methoden verhindern durch final
270
8.4 Die Klasse java.lang.Object
270
8.5 Übungsaufgaben
274
8.6 Abstrakte Klassen und Interfaces
274
8.6.1 Einsatzszenarien am Beispiel
274
8.6.2 Abstrakte Klassen im Detail
278
8.6.3 Interfaces im Detail
281
8.7 Interfaces mit Default-Methoden und statischen Methoden
284
8.7.1 Deklaration von Default-Methoden
284
8.7.2 Deklaration von statischen Methoden
285
8.7.3 Auflösung von Namensgleichheiten bei Default-Methoden
286
8.7.4 Interfaces und abstrakte Klassen im Vergleich
288
8.8 Weiteres zum Thema Objektorientierung
288
8.8.1 Erstellen von Paketen
288
8.8.2 Zugriffsrechte
290
8.8.3 Innere Klassen
291
8.8.4 Anonyme Klassen
297
8.9 Zusammenfassung
300
8.10 Übungsaufgaben
300
9 Exceptions und Errors
312
9.1 Eine Einführung in Exceptions
313
9.1.1 Was ist eine Exception?
313
9.1.2 Übungsaufgaben
315
9.1.3 Abfangen von Exceptions
315
9.1.4 Ein Anwendungsbeispiel
316
9.1.5 Die RuntimeException
319
9.1.6 Übungsaufgaben
320
9.2 Exceptions für Fortgeschrittene
322
9.2.1 Definieren eigener Exceptions
322
9.2.2 Übungsaufgaben
324
9.2.3 Vererbung und Exceptions
324
9.2.4 Vorsicht, Falle!
328
9.2.5 Der finally-Block
330
9.2.6 Die Klassen Throwable und Error
334
9.2.7 Zusammenfassung
336
9.2.8 Übungsaufgaben
336
9.3 Assertions
337
9.3.1 Zusicherungen im Programmcode
337
9.3.2 Ausführen des Programmcodes
338
9.3.3 Zusammenfassung
339
9.4 Mehrere Ausnahmetypen in einem catch-Block
339
9.5 Ausblick: try-Block mit Ressourcen
341
10 Fortgeschrittene objektorientierte Programmierung
342
10.1 Aufzählungstypen
342
10.1.1 Deklaration eines Aufzählungstyps
343
10.1.2 Instanzmethoden der enum-Objekte
343
10.1.3 Selbstdefinierte Instanzmethoden für enum-Objekte
344
10.1.4 Übungsaufgaben
345
10.2 Generische Datentypen
347
10.2.1 Herkömmliche Generizität
348
10.2.2 Generizität durch Typ-Parameter
350
10.2.3 Einschränkungen der Typ-Parameter
352
10.2.4 Wildcards
354
10.2.5 Bounded Wildcards
355
10.2.6 Generische Methoden
357
10.2.7 Verkürzte Notation bei generischen Datentypen
359
10.2.8 Ausblick
362
10.2.9 Übungsaufgaben
362
10.3 Sortieren von Feldern und das Interface Comparable
367
11 Einige wichtige Hilfsklassen
370
11.1 Die Klasse StringBuffer
370
11.1.1 Arbeiten mit String-Objekten
370
11.1.2 Arbeiten mit StringBuffer-Objekten
373
11.1.3 Übungsaufgaben
375
11.2 Die Wrapper-Klassen (Hüll-Klassen)
376
11.2.1 Arbeiten mit „eingepackten“ Daten
376
11.2.2 Aufbau der Wrapper-Klassen
378
11.2.3 Ein Anwendungsbeispiel
380
11.2.4 Automatische Typwandlung für die Wrapper-Klassen
381
11.2.5 Übungsaufgaben
383
11.3 Die Klassen BigInteger und BigDecimal
383
11.3.1 Arbeiten mit langen Ganzzahlen
384
11.3.2 Aufbau der Klasse BigInteger
385
11.3.3 Übungsaufgaben
387
11.3.4 Arbeiten mit langen Gleitkommazahlen
388
11.3.5 Aufbau der Klasse BigDecimal
391
11.3.6 Viele Stellen von Nullstellen gefällig?
393
11.3.7 Übungsaufgaben
395
11.4 Die Klasse DecimalFormat
395
11.4.1 Standardausgaben in Java
395
11.4.2 Arbeiten mit Format-Objekten
396
11.4.3 Vereinfachte formatierte Ausgabe
399
11.4.4 Übungsaufgaben
399
11.5 Die Klassen Date und Calendar
400
11.5.1 Arbeiten mit „Zeitpunkten“
400
11.5.2 Auf die Plätze, fertig, los!
401
11.5.3 Spezielle Calendar-Klassen
402
11.5.4 Noch einmal: Zeitmessung
405
11.5.5 Übungsaufgaben
406
11.6 Die Klassen SimpleDateFormat und DateFormat
406
11.6.1 Arbeiten mit Format-Objekten für Datum/Zeit-Angaben
406
11.6.2 Übungsaufgaben
411
11.7 Die Collection-Klassen
411
11.7.1 „Sammlungen“ von Objekten – der Aufbau des Interface Collection
412
11.7.2 „Sammlungen“ durchgehen – der Aufbau des Interface Iterator
414
11.7.3 Mengen
415
11.7.3.1 Das Interface Set
415
11.7.3.2 Die Klasse HashSet
416
11.7.3.3 Das Interface SortedSet
417
11.7.3.4 Die Klasse TreeSet
418
11.7.4 Listen
420
11.7.4.1 Das Interface List
420
11.7.4.2 Die Klassen ArrayList und LinkedList
421
11.7.4.3 Suchen und Sortieren – die KlassenCollections und Arrays
423
11.7.5 Verkürzte Notation bei Collection-Datentypen
425
11.7.6 Übungsaufgaben
427
11.8 Die Klasse StringTokenizer
427
11.8.1 Übungsaufgaben
430
III Grafische Oberflächen in Java
432
12 Aufbau grafischer Oberflächen in Frames – von AWT nach Swing
434
12.1 Grundsätzliches zum Aufbau grafischer Oberflächen
434
12.2 Ein einfaches Beispiel mit dem AWT
435
12.3 Let's swing now!
438
12.4 Etwas „Fill-in“ gefällig?
440
12.5 Die AWT- und Swing-Klassenbibliothek im Überblick
442
12.6 Übungsaufgaben
444
13 Swing-Komponenten
446
13.1 Die abstrakte Klasse Component
446
13.2 Die Klasse Container
447
13.3 Die abstrakte Klasse JComponent
448
13.4 Layout-Manager, Farben und Schriften
449
13.4.1 Die Klasse Color
450
13.4.2 Die Klasse Font
452
13.4.3 Layout-Manager
453
13.4.3.1 Die Klasse FlowLayout
454
13.4.3.2 Die Klasse BorderLayout
456
13.4.3.3 Die Klasse GridLayout
457
13.5 Einige Grundkomponenten
459
13.5.1 Die Klasse JLabel
460
13.5.2 Die abstrakte Klasse AbstractButton
462
13.5.3 Die Klasse JButton
462
13.5.4 Die Klasse JToggleButton
464
13.5.5 Die Klasse JCheckBox
465
13.5.6 Die Klassen JRadioButton und ButtonGroup
466
13.5.7 Die Klasse JComboBox
468
13.5.8 Die Klasse JList
471
13.5.9 Die abstrakte Klasse JTextComponent
474
13.5.10 Die Klassen JTextField und JPasswordField
474
13.5.11 Die Klasse JTextArea
477
13.5.12 Die Klasse JScrollPane
479
13.5.13 Die Klasse JPanel
481
13.6 Spezielle Container, Menüs und Toolbars
482
13.6.1 Die Klasse JFrame
483
13.6.2 Die Klasse JWindow
484
13.6.3 Die Klasse JDialog
484
13.6.4 Die Klasse JMenuBar
487
13.6.5 Die Klasse JToolBar
490
13.7 Übungsaufgaben
493
14 Ereignisverarbeitung
496
14.1 Zwei einfache Beispiele
497
14.1.1 Zufällige Grautöne als Hintergrund
497
14.1.2 Ein interaktiver Bilderrahmen
500
14.2 Programmiervarianten für die Ereignisverarbeitung
504
14.2.1 Innere Klasse als Listener-Klasse
504
14.2.2 Anonyme Klasse als Listener-Klasse
504
14.2.3 Container-Klasse als Listener-Klasse
505
14.2.4 Separate Klasse als Listener-Klasse
506
14.3 Event-Klassen und -Quellen
508
14.4 Listener-Interfaces und Adapter-Klassen
511
14.5 Listener-Registrierung bei den Event-Quellen
517
14.6 Auf die Plätze, fertig, los!
520
14.7 Übungsaufgaben
525
15 Einige Ergänzungen zu Swing-Komponenten
530
15.1 Zeichnen in Swing-Komponenten
530
15.1.1 Grafische Darstellung von Komponenten
530
15.1.2 Das Grafikkoordinatensystem
531
15.1.3 Die abstrakte Klasse Graphics
532
15.1.4 Ein einfaches Zeichenprogramm
535
15.1.5 Layoutveränderungen und der Einsatz von revalidate
537
15.2 Noch mehr Swing gefällig?
539
15.3 Übungsaufgaben
541
IV Threads, Datenströme und Netzwerkanwendungen
544
16 Parallele Programmierung mit Threads
546
16.1 Ein einfaches Beispiel
546
16.2 Threads in Java
548
16.2.1 Die Klasse Thread
549
16.2.2 Das Interface Runnable
553
16.2.3 Threads vorzeitig beenden
555
16.3 Wissenswertes über Threads
557
16.3.1 Lebenszyklus eines Threads
557
16.3.2 Thread-Scheduling
559
16.3.3 Dämon-Threads und Thread-Gruppen
559
16.4 Thread-Synchronisation und -Kommunikation
560
16.4.1 Das Leser/Schreiber-Problem
561
16.4.2 Das Erzeuger/Verbraucher-Problem
564
16.5 Threads in Swing-Anwendungen
572
16.5.1 Auf die Plätze, fertig, los!
572
16.5.2 Spielereien
575
16.5.3 Swing-Komponenten sind nicht Thread-sicher
578
16.6 Übungsaufgaben
579
17 Ein- und Ausgabe über I/O-Streams
582
17.1 Grundsätzliches zu I/O-Streams in Java
583
17.2 Dateien und Verzeichnisse – die Klasse File
583
17.3 Ein- und Ausgabe über Character-Streams
586
17.3.1 Einfache Reader- und Writer-Klassen
587
17.3.2 Gepufferte Reader- und Writer-Klassen
590
17.3.3 Die Klasse StreamTokenizer
592
17.3.4 Die Klasse PrintWriter
593
17.3.5 Die Klassen IOTools und Scanner
595
17.3.5.1 Was machen eigentlich die IOTools?
595
17.3.5.2 Konsoleneingabe über ein Scanner-Objekt
596
17.4 Ein- und Ausgabe über Byte-Streams
597
17.4.1 Einige InputStream- und OutputStream-Klassen
598
17.4.2 Die Serialisierung und Deserialisierung von Objekten
600
17.4.3 Die Klasse PrintStream
602
17.5 Streams im try-Block mit Ressourcen
603
17.6 Einige abschließende Bemerkungen
605
17.6.1 Das Paket java.nio
606
17.6.2 Das Paket java.nio.file
607
17.6.2.1 Das Interface Path und die Klasse Paths
607
17.6.2.2 Die Klasse Files
608
17.7 Übungsaufgaben
611
18 Client/Server-Programmierung in Netzwerken
614
18.1 Wissenswertes über Netzwerkkommunikation
615
18.1.1 Protokolle
615
18.1.2 IP-Adressen
617
18.1.3 Ports und Sockets
618
18.2 Client/Server-Programmierung
619
18.2.1 Die Klassen ServerSocket und Socket
620
18.2.2 Ein einfacher Server
622
18.2.3 Ein einfacher Client
625
18.2.4 Ein Server für mehrere Clients
626
18.2.5 Ein Mehrzweck-Client
629
18.2.6 Client/Server-Kommunikation über URLs
632
18.3 Übungsaufgaben
633
19 Lambda-Ausdrücke, Streams und Pipeline-Operationen
638
19.1 Lambda-Ausdrücke
638
19.1.1 Lambda-Ausdrücke in Aktion – zwei Beispiele
639
19.1.2 Lambda-Ausdrücke im Detail
642
19.1.3 Lambda-Ausdrücke und funktionale Interfaces
644
19.1.4 Vordefinierte funktionale Interfaces und Anwendungen auf Datenstrukturen
646
19.1.5 Methodenreferenzen als Lambda-Ausdrücke
650
19.1.6 Zugriff auf Variablen aus der Umgebung innerhalb eines Lambda-Ausdrucks
653
19.1.7 Übungsaufgaben
654
19.2 Streams und Pipeline-Operationen
655
19.2.1 Streams in Aktion
656
19.2.2 Streams und Pipelines im Detail
658
19.2.3 Erzeugen von endlichen und unendlichen Streams
659
19.2.4 Die Stream-API
662
19.2.5 Übungsaufgaben
665
V Abschluss, Ausblick und Anhang
668
20 Blick über den Tellerrand
670
20.1 JShell für kleine Skripte
671
20.2 Das Java-Modulsystem
675
20.3 Bühne frei für JavaFX
682
20.4 Beginn einer neuen Zeitrechnung
691
20.5 Webprogrammierung und verteilte Systeme
693
20.6 Zu guter Letzt
696
A Der Weg zum guten Programmierer …
698
A.1 Die goldenen Regeln der Code-Formatierung
699
A.2 Die goldenen Regeln der Namensgebung
702
A.3 Zusammenfassung
704
B Ohne Werkzeug geht es nicht
706
B.1 Die API-Dokumentation zum Nachschlagen
707
B.2 Die IDE, dein Freund und Helfer
709
B.3 Alle Versionen stets im Griff
711
B.4 Testen bitte nicht vergessen
713
B.5 Der Automat kann es besser
715
C Die Klasse IOTools – Tastatureingaben in Java
718
C.1 Kurzbeschreibung
718
C.2 Anwendung der IOTools-Methoden
719
Glossar
722
Stichwortverzeichnis
742
Alle Preise verstehen sich inklusive der gesetzlichen MwSt.