Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
1 Einführung
19
1.1 Was ist Java?
20
1.1.1 Java – die Sprache
20
1.1.2 Java – die Laufzeitumgebung
21
1.1.3 Java – die Standardbibliothek
22
1.1.4 Java – die Community
23
1.1.5 Die Geschichte von Java
24
1.2 Die Arbeitsumgebung installieren
26
1.3 Erste Schritte in NetBeans
28
1.4 Das erste Programm
30
1.4.1 Packages und Imports
31
1.4.2 Klassendefinition
33
1.4.3 Instanzvariablen
33
1.4.4 Der Konstruktor
35
1.4.5 Die Methode »count«
35
1.4.6 Die Methode »main«
37
1.4.7 Ausführen von der Kommandozeile
38
1.5 In Algorithmen denken, in Java schreiben
40
1.5.1 Beispiel 1: Fibonacci-Zahlen
41
1.5.2 Beispiel 2: Eine Zeichenkette umkehren
43
1.5.3 Algorithmisches Denken und Java
45
1.6 Die Java-Klassenbibliothek
46
1.7 Dokumentieren als Gewohnheit – Javadoc
49
1.7.1 Den eigenen Code dokumentieren
49
1.7.2 Package-Dokumentation
53
1.7.3 HTML-Dokumentation erzeugen
53
1.7.4 Was sollte dokumentiert sein?
54
1.8 JARs erstellen und ausführen
55
1.8.1 Die Datei »MANIFEST.MF«
55
1.8.2 JARs ausführen
57
1.8.3 JARs erzeugen
57
1.8.4 JARs einsehen und entpacken
59
1.9 Mit dem Debugger arbeiten
59
1.9.1 Ein Programm im Debug-Modus starten
59
1.9.2 Breakpoints und schrittweise Ausführung
60
1.9.3 Variablenwerte und Call Stack inspizieren
61
1.9.4 Übung: Der Debugger
63
1.10 Das erste eigene Projekt
64
1.11 Zusammenfassung
66
2 Variablen und Datentypen
67
2.1 Variablen
67
2.1.1 Der Zuweisungsoperator
69
2.1.2 Scopes
69
2.1.3 Primitive und Objekte
70
2.2 Primitivtypen
70
2.2.1 Zahlentypen
70
2.2.2 Rechenoperationen
75
2.2.3 Bit-Operatoren
78
2.2.4 Übung: Ausdrücke und Datentypen
80
2.2.5 Character-Variablen
81
2.2.6 Boolesche Variablen
82
2.2.7 Vergleichsoperatoren
82
2.3 Objekttypen
84
2.3.1 Werte und Referenzen
84
2.3.2 Der Wert »null«
85
2.3.3 Vergleichsoperatoren
85
2.3.4 Allgemeine und spezielle Typen
86
2.3.5 Strings – primitive Objekte
88
2.4 Objekt-Wrapper zu Primitiven
88
2.4.1 Warum?
89
2.4.2 Explizite Konvertierung
89
2.4.3 Implizite Konvertierung
90
2.5 Array-Typen
91
2.5.1 Deklaration eines Arrays
92
2.5.2 Zugriff auf ein Array
92
2.6 Zusammenfassung
93
3 Entscheidungen
95
3.1 Entweder-oder-Entscheidungen
95
3.1.1 Übung: Star Trek – sehen oder nicht?
97
3.1.2 Mehrfache Verzweigungen
99
3.1.3 Übung: Body-Mass-Index
100
3.1.4 Der ternäre Operator
101
3.2 Logische Verknüpfungen
102
3.2.1 Boolesche Operatoren
102
3.2.2 Verknüpfungen mit und ohne Kurzschluss
103
3.2.3 Übung: Boolesche Operatoren
105
3.2.4 Übung: Solitaire
106
3.3 Mehrfach verzweigen mit »switch«
108
3.3.1 »switch« mit Strings, Zeichen und Zahlen
109
3.3.2 Übung: »Rock im ROM«
110
3.3.3 Enumerierte Datentypen und »switch«
111
3.3.4 Durchfallendes »switch«
112
3.3.5 Übung: »Rock im ROM« bis zum Ende
112
3.3.6 Übung: »Rock im ROM« solange ich will
113
3.3.7 Der Unterschied zwischen »switch« und »if… else if …«
113
3.4 Zusammenfassung
114
4 Wiederholungen
115
4.1 Bedingte Wiederholungen mit »while«
115
4.1.1 Kopfgesteuerte »while«-Schleife
116
4.1.2 Übung: Das kleinste gemeinsame Vielfache
117
4.1.3 Fußgesteuerte »while«-Schleifen
117
4.1.4 Übung: Zahlen raten
118
4.2 Abgezählte Wiederholungen – die »for«-Schleife
119
4.2.1 Übung: Zahlen validieren
120
4.3 Abbrechen und überspringen
121
4.3.1 »break« und »continue« mit Labels
122
4.4 Zusammenfassung
124
5 Klassen und Objekte
125
5.1 Klassen und Objekte
126
5.1.1 Klassen anlegen
126
5.1.2 Objekte erzeugen
127
5.2 Access-Modifier
128
5.3 Felder
130
5.3.1 Felder deklarieren
130
5.3.2 Zugriff auf Felder
130
5.4 Methoden
131
5.4.1 Übung: Eine erste Methode
133
5.4.2 Rückgabewerte
133
5.4.3 Übung: Jetzt mit Rückgabewerten
135
5.4.4 Parameter
135
5.4.5 Zugriffsmethoden
137
5.4.6 Übung: Zugriffsmethoden
139
5.5 Warum Objektorientierung?
140
5.6 Konstruktoren
142
5.6.1 Konstruktoren deklarieren und aufrufen
142
5.6.2 Übung: Konstruktoren
146
5.7 Statische Felder und Methoden
146
5.7.1 Übung: Statische Felder und Methoden
148
5.7.2 Die »main«-Methode
148
5.7.3 Statische Importe
148
5.8 Unveränderliche Werte
149
5.8.1 Unveränderliche Felder
150
5.8.2 Konstanten
151
5.9 Spezielle Objektmethoden
152
5.10 Zusammenfassung
154
6 Objektorientierung
155
6.1 Vererbung
156
6.1.1 Vererbung implementieren
157
6.1.2 Übung: Tierische Erbschaften
159
6.1.3 Erben und Überschreiben von Membern
159
6.1.4 Vererbung und Konstruktoren
164
6.1.5 Übung: Konstruktoren und Vererbung
165
6.1.6 Vererbung verhindern
165
6.1.7 Welchen Typ hat das Objekt?
167
6.2 Interfaces und abstrakte Datentypen
169
6.2.1 Abstrakte Klassen
170
6.2.2 Interfaces
171
6.2.3 Default-Implementierungen
174
6.3 Übung: Objektorientierte Modellierung
177
6.4 Innere Klassen
178
6.4.1 Statische innere Klassen
178
6.4.2 Nichtstatische innere Klassen
180
6.4.3 Anonyme Klassen
183
6.5 Enumerationen
185
6.6 Zusammenfassung
188
7 Unit Testing
189
7.1 Das JUnit-Framework
191
7.1.1 Der erste Test
192
7.1.2 Die Methoden von »Assert«
194
7.1.3 Testfälle ausführen in NetBeans
194
7.1.4 Übung: Den GGT-Algorithmus ändern
197
7.1.5 Übung: Tests schreiben für das KGV
197
7.2 Fortgeschrittene Unit Tests
197
7.2.1 Testen von Fehlern
198
7.2.2 Vor- und Nachbereitung von Tests
199
7.2.3 Mocking
201
7.3 Besseres Design durch Testfälle
203
7.3.1 Übung: Testfälle für den BMI-Rechner
206
7.4 Zusammenfassung
206
8 Die Standardbibliothek
207
8.1 Zahlen
207
8.1.1 »Number« und die Zahlentypen
207
8.1.2 Mathematisches aus »java.lang.Math«
208
8.1.3 Übung: Satz des Pythagoras
211
8.1.4 »BigInteger« und »BigDecimal«
211
8.1.5 Übung: Fakultäten
212
8.2 Strings
213
8.2.1 Unicode
213
8.2.2 String-Methoden
214
8.2.3 Übung: Namen zerlegen
218
8.2.4 Übung: Römische Zahlen I
218
8.2.5 StringBuilder
219
8.2.6 Übung: Römische Zahlen II
221
8.2.7 StringTokenizer
221
8.3 Reguläre Ausdrücke
222
8.3.1 Einführung in reguläre Ausdrücke
222
8.3.2 String-Methoden mit regulären Ausdrücken
225
8.3.3 Reguläre Ausdrücke als Objekte
226
8.3.4 Übung: Flugnummern finden
229
8.4 Zeit und Datum
229
8.4.1 Zeiten im Computer und »java.util.Date«
229
8.4.2 Neue Zeiten – das Package »java.time«
230
8.4.3 Übung: Der Fernsehkalender
234
8.5 Internationalisierung und Lokalisierung
234
8.5.1 Internationale Nachrichten mit »java.util.ResourceBundle«
235
8.5.2 Nachrichten formatieren mit »java.util.MessageFormat«
237
8.5.3 Zeiten und Daten lesen
239
8.5.4 Zahlen lesen
241
8.6 Zusammenfassung
242
9 Fehler und Ausnahmen
243
9.1 Exceptions werfen und behandeln
243
9.1.1 try-catch
245
9.1.2 Übung: Fangen und noch einmal versuchen
247
9.1.3 try-catch-finally
248
9.1.4 try-with-resources
249
9.1.5 Fehler mit Ursachen
250
9.2 Verschiedene Arten von Exceptions
250
9.2.1 Unchecked Exceptions
251
9.2.2 Checked Exceptions
253
9.2.3 Errors
255
9.3 Invarianten, Vor- und Nachbedingungen
256
9.4 Zusammenfassung
258
10 Arrays und Collections
259
10.1 Arrays
259
10.1.1 Grundlagen von Arrays
260
10.1.2 Übung: Primzahlen
262
10.1.3 Mehrdimensionale Arrays
263
10.1.4 Übung: Das pascalsche Dreieck
264
10.1.5 Utility-Methoden in »java.util.Arrays«
264
10.1.6 Übung: Sequenziell und parallel sortieren
268
10.2 Die for-each-Schleife
269
10.3 Variable Parameterlisten
269
10.4 Collections
271
10.4.1 Listen und Sets
272
10.4.2 Iteratoren
275
10.4.3 Übung: Musiksammlung und Playlist
276
10.5 Typisierte Collections – Generics
276
10.5.1 Generics außerhalb von Collections
278
10.5.2 Eigenen Code generifizieren
279
10.5.3 Übung: Generisches Filtern
286
10.6 Maps
286
10.6.1 Übung: Lieblingslieder
288
10.7 Zusammenfassung
288
11 Lambda-Ausdrücke
289
11.1 Was sind Lambda-Ausdrücke?
290
11.1.1 Die Lambda-Syntax
291
11.1.2 Wie funktioniert das?
294
11.1.3 Übung: Zahlen selektieren
297
11.1.4 Funktionale Interfaces nur für Lambda-Ausdrücke
297
11.1.5 Übung: Funktionen
302
11.2 Die Stream-API
302
11.2.1 Intermediäre und terminale Methoden
304
11.2.2 Übung: Temperaturdaten auswerten
314
11.2.3 Endlose Streams
314
11.2.4 Übung: Endlose Fibonacci-Zahlen
315
11.2.5 Daten aus einem Stream sammeln – »Stream.collect«
316
11.2.6 Übung: Wetterstatistik für Fortgeschrittene
319
11.3 Un-Werte als Objekte – »Optional«
319
11.3.1 Die wahre Bedeutung von »Optional«
321
11.4 Eine Warnung zum Schluss
322
11.5 Zusammenfassung
323
12 Dateien, Streams und Reader
325
12.1 Dateien und Verzeichnisse
326
12.1.1 Dateien und Pfade
326
12.1.2 Dateioperationen aus »Files«
329
12.1.3 Übung: Dateien kopieren
329
12.1.4 Verzeichnisse
330
12.1.5 Übung: Musik finden
331
12.2 Reader, Writer und die »anderen« Streams
332
12.2.1 Lesen und Schreiben von Textdaten
333
12.2.2 Übung: Playlisten – jetzt richtig
340
12.2.3 »InputStream« und »OutputStream« – Binärdaten
340
12.2.4 Übung: ID3-Tags
342
12.3 Objekte lesen und schreiben
344
12.3.1 Serialisierung
344
12.4 Netzwerkkommunikation
347
12.4.1 Übung: Dateitransfer
349
12.5 Zusammenfassung
350
13 Multithreading
351
13.1 Threads und Runnables
352
13.1.1 Threads starten und Verhalten übergeben
352
13.1.2 Übung: Multithreaded Server
356
13.1.3 Geteilte Ressourcen
356
13.2 Atomare Datentypen
359
13.3 Synchronisation
360
13.3.1 »synchronized« als Modifikator für Methoden
362
13.3.2 Das »synchronized«-Statement
362
13.3.3 Deadlocks
365
13.3.4 Übung: Zufallsverteilung
367
13.4 Fortgeschrittene Koordination zwischen Threads
367
13.4.1 Signalisierung auf dem Monitor-Objekt
368
13.4.2 Daten produzieren, kommunizieren und konsumieren
371
13.4.3 Threads wiederverwenden
373
13.5 Die Zukunft – wortwörtlich
374
13.5.1 Lambdas und die Zukunft – »CompletableFuture«
376
13.6 Das Speichermodell von Threads
378
13.7 Zusammenfassung
380
14 Servlets – Java im Web
381
14.1 Einen Servlet-Container installieren
382
14.1.1 Installation des Tomcat-Servers
382
14.1.2 Den Tomcat-Server in NetBeans einrichten
386
14.2 Die erste Servlet-Anwendung
388
14.2.1 Die Anwendung starten
390
14.2.2 Was passiert, wenn Sie die Anwendung aufrufen?
393
14.3 Servlets programmieren
399
14.3.1 Servlets konfigurieren
399
14.3.2 Mit dem Benutzer interagieren
401
14.3.3 Übung: Das Rechen-Servlet implementieren
404
14.4 Java Server Pages
406
14.4.1 Übung: Playlisten anzeigen
411
14.4.2 Übung: Musik abspielen
411
14.5 Langlebige Daten im Servlet – Ablage in Session und Application
412
14.5.1 Die »HTTPSession«
413
14.5.2 Übung: Daten in der Session speichern
414
14.5.3 Der Application Context
414
14.6 Fortgeschrittene Servlet-Konzepte – Listener und Initialisierung
415
14.6.1 Listener
415
14.6.2 Übung: Die Playliste nur einmal laden
416
14.6.3 Initialisierungsparameter
416
14.7 Zusammenfassung
418
15 Datenbanken und Entitäten
419
15.1 Was ist eine Datenbank?
420
15.1.1 Relationale Datenbanken
420
15.1.2 JDBC
424
15.1.3 JPA
425
15.2 Mit einer Datenbank verbinden über die JPA
427
15.2.1 Datenbank in NetBeans anlegen
427
15.2.2 Das Projekt anlegen
428
15.2.3 Eine Persistence Unit erzeugen
429
15.2.4 Die »EntityManagerFactory« erzeugen
431
15.3 Anwendung und Entitäten
432
15.3.1 Die erste Entität anlegen
432
15.3.2 Übung: Personen speichern
435
15.4 Entitäten laden
435
15.4.1 Abfragen mit JPQL
435
15.4.2 Übung: Personen auflisten
437
15.4.3 Entitäten laden mit ID
438
15.4.4 Übung: Personen bearbeiten
438
15.4.5 Benannte Queries
439
15.5 Entitäten löschen
440
15.6 Beziehungen zu anderen Entitäten
441
15.6.1 Eins-zu-eins-Beziehungen
442
15.6.2 Übung: Kontakte mit Adressen
444
15.6.3 Eins-zu-vielen-Beziehungen
444
15.6.4 Viele-zu-eins-Beziehungen
445
15.6.5 Beziehungen in JPQL
447
15.7 Zusammenfassung
448
16 GUIs mit JavaFX
449
16.1 Einführung
449
16.2 Installation
450
16.3 Architektur von JavaFX
450
16.3.1 Application
451
16.3.2 Scenes
452
16.3.3 Scene Graph
452
16.3.4 Typen von Nodes
453
16.4 GUI-Komponenten
453
16.4.1 Beschriftungen
454
16.4.2 Schaltflächen
454
16.4.3 Checkboxen und Choiceboxen
456
16.4.4 Eingabefelder
458
16.4.5 Menüs
458
16.4.6 Sonstige Standardkomponenten
460
16.4.7 Geometrische Komponenten
463
16.4.8 Diagramme
463
16.5 Layouts
464
16.5.1 BorderPane
464
16.5.2 HBox
466
16.5.3 VBox
466
16.5.4 StackPane
467
16.5.5 GridPane
468
16.5.6 FlowPane
469
16.5.7 TilePane
470
16.5.8 AnchorPane
471
16.5.9 Fazit
473
16.6 GUI mit Java-API – Urlaubsverwaltung
474
16.6.1 Initialisierung des Menüs
475
16.6.2 Initialisierung der Tabs
475
16.6.3 Initialisierung des Inhalts von Tab 1
475
16.6.4 Initialisierung des Inhalts von Tab 2
477
16.7 Event-Handling
478
16.7.1 Events und Event-Handler
479
16.7.2 Typen von Events
481
16.7.3 Alternative Methoden für das Registrieren von Event-Handlern
484
16.8 JavaFX-Properties und Binding
485
16.8.1 JavaFX-Properties
485
16.8.2 JavaFX-Properties und Listener
487
16.8.3 JavaFX-Properties im GUI
488
16.8.4 JavaFX-Properties von GUI-Komponenten
489
16.8.5 Binding
490
16.9 Deklarative GUIs mit FXML
491
16.9.1 Vorteile gegenüber programmatisch erstellten GUIs
491
16.9.2 Einführung
493
16.9.3 Aufruf eines FXML-basierten GUI
494
16.9.4 Event-Handling in FXML
495
16.10 Layout mit CSS
497
16.10.1 Einführung in CSS
497
16.10.2 JavaFX-CSS
498
16.10.3 JavaFX-Anwendung mit CSS
498
16.10.4 Urlaubsverwaltung mit JavaFX-CSS
499
16.11 Transformationen, Animationen und Effekte
501
16.11.1 Transformationen
501
16.11.2 Animationen
504
16.12 Übungen
508
16.12.1 Eine kleine To-do-Anwendung
508
16.12.2 Logik für die To-do-Anwendung
509
16.13 Zusammenfassung
509
17 Android
511
17.1 Einstieg in die Android-Entwicklung
511
17.1.1 Die Entwicklungsumgebung
512
17.1.2 Die erste Anwendung
514
17.1.3 Der Android Emulator
516
17.1.4 Auf dem Telefon ausführen
521
17.1.5 Die erste Android-Anwendung im Detail
522
17.2 Eine Benutzeroberfläche designen
525
17.2.1 Layouts bearbeiten
528
17.2.2 Auf Widgets reagieren
531
17.2.3 Das Android-Thread-Modell
532
17.2.4 Übung: Ein ganz einfacher Rechner
533
17.3 Anwendungen mit mehreren Activities
533
17.3.1 Activity wechseln mit Intents
534
17.3.2 Der Activity Stack
536
17.3.3 An andere Anwendungen verweisen
538
17.4 Permissions und SystemServices
540
17.4.1 Den Benutzer um Erlaubnis fragen
541
17.4.2 Zugriff auf einen SystemService erlangen
542
17.4.3 Den Vibrationsservice verwenden
543
17.4.4 Übung: Die Samuel-Morse-Gedenkübung
543
17.5 Apps im Play Store veröffentlichen
544
17.6 Zusammenfassung
545
18 Hinter den Kulissen
547
18.1 Klassenpfade und Classloading
547
18.1.1 Klassen laden in der Standardumgebung
548
18.1.2 Ein komplexeres Szenario – Klassen laden im Servlet-Container
549
18.1.3 Classloader und Klassengleichheit
550
18.1.4 Classloader als Objekte
552
18.1.5 Klassen laden mit Struktur: das Modulsystem von Java 9
553
18.2 Garbage Collection
555
18.2.1 Speicherlecks in Java
558
18.2.2 Weiche und schwache Referenzen
559
18.3 Flexibel codieren mit der Reflection-API
561
18.3.1 Übung: Templating
566
18.4 Zusammenfassung
567
19 Und dann?
569
19.1 Java Enterprise Edition
570
19.1.1 Servlet
570
19.1.2 JPA
572
19.1.3 Enterprise Java Beans
572
19.1.4 Java Messaging Service
573
19.1.5 Java Bean Validation
574
19.2 Open-Source-Software
575
19.3 Ergänzende Technologien
576
19.3.1 SQL und DDL
576
19.3.2 HTML, CSS und JavaScript
577
19.4 Andere Sprachen
579
19.4.1 Scala
579
19.4.2 Clojure
580
19.4.3 JavaScript
580
19.5 Programmieren Sie!
581
Anhang
583
A Java-Bibliotheken 585
583
B Lösungen zu den Übungsaufgaben 593
583
C Glossar 705
583
D Kommandozeilenparameter 721
583
Index
729