TU-Da - Technische Universität Darmstadt

TU-Da - Technische Universität Darmstadt
Christian Ullenboom
Java ist auch eine Insel
Programmieren mit der Java Standard Edition Version 6
Galileo Press
Inhalt
Vorwort
1
39
Java ist auch eine Sprache
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
Der erste Kontakt
Historischer Hintergrund
Eigenschaften von Java
1.3.1
Bytecode und die virtuelle Maschine
1.3.2
Objektorientierung in Java
1.3.3
Java-Security-Modell
1.3.4
Zeiger und Referenzen
1.3.5
Bring den Müll raus, Garbage-Collector!
1.3.6
Ausnahmebehandlung
1.3.7
Kein Präprozessor für Textersetzungen
1.3.8
Keine überladenen Operatoren
1.3.9
Java als Sprache, Laufzeitumgebung und Bibliothek
1.3.10 Wofür sich Java nicht eignet
1.3.11 Java im Vergleich zu anderen Sprachen
Die Rolle von Java im Web
1.4.1
Vollwertige Applikationen statt Applets
Die Java Platform Standard Edition (Java SE)
1.5.1
JDK und JRE
1.5.2
Java-Versionen
1.5.3
Java für die Kleinen
1.5.4
Java für die Großen
,.
1.5.5
Installationsanleitung für Java^SE
Das erste Programm compilieren und testen
1.6.1
Ein Quadratzahlen-Programm
1.6.2
Der Compilerlauf
1.6.3
Die Laufzeitumgebung
1.6.4
Häufige Compiler-und Interpreterproblerhe
Entwicklungsumgebungen im Allgemeinen
1.7.1
Java Studio und NetBeans von Sun
1.7.2
Die Entwicklungsumgebung Eclipse
1.7.3
Together
1.7.4
Ein Wort zu Microsoft, Java und zu J++
Eclipse im Speziellen
1.8.1
Eclipse starten
1.8.2
Das erste Projekt anlegen
1.8.3
Eine Klasse hinzufügen
53
53
55
55
56
57
57
58
58
59
60
60
61
62
62
63
63
63
64
65
65
66
67
67
68
70
70
71
71
71
72
72
73
74
75
77
Inhalt
1.9
2
1.8.4
Übersetzen und Ausführen
1.8.5
JDK statt JRE
1.8.6
Start eines Programms ohne Speicheraufforderung
1.8.7
Projekt einfügen oder Workspace für die Aufgaben wechseln ....
1.8.8
Plugins für Eclipse
1.8.9
Eclipse Web Tools Platform (WTP)
Zum Weiterlesen
78
78
79
79
80
81
81
Sprachbeschreibung
2.1
2.2
2.3
2.4
Elemente der Programmiersprache Java
2.1.1
Textkodierung durch Unicode-Zeichen
2.1.2
Literale
2.1.3
Bezeichner
2.1.4
Reservierte Schlüsselwörter
2.1.5
Token
2.1.6
Kommentare
Anweisungen und Programme
2.2.1
Eine Klasse bildet den Rahmen
2.2.2
Die Reise beginnt am mainO
2.2.3
Programme übersetzen und starten
2.2.4
Funktionsaufrufe als Ausdrücke und Anweisungen
2.2.5
Modifizierer
;
2.2.6
Anweisungen und Blöcke
Datentypen
2.3.1
Primitive Datentypen im Überblick
2.3.2
Wahrheitswerte
2.3.3
Variablendeklarationen
v
2.3.4
Ganzzahlige Datentypen
.*;
2.3.5
Die Fließkommazahlen float und double
2.3.6
Alphanumerische Zeichen
2.3.7
Die Typanpassung (das Casting)
Ausdrücke, Operanden und Operatoren
2.4.1
Zuweisungsoperator
2.4.2
Arithmetische Operatoren
2.4.3
Unäres Minus und Plus
2.4.4
Zuweisung mit Operation
2.4.5
Präfix- oder Postfix-Inkrement und -Dekrement
2.4.6
Die relationalen Operatoren und die Gleichheitsoperatoren
2.4.7 * Logische Operatoren Und, Oder, Xor, Nicht
2.4.8
Rang der Operatoren in der Auswertungsreihenfolge ..*„.
2.4.9
Überladenes Plus für Strings
2.4.10
Was C(++)-Programmierer vermissen könnten
.»...
83
83
86
86
87
88
89
90
91
92
93
93
96
96
97
98
100
100
104
107
108
109
113
114
115
117
118
119
120
121
122
124
125
Inhalt
2.5
2.6
2.7
2.8
2.9
2.10
3
Bedingte Anweisungen oder Fallunterscheidungen
126
2.5.1
Die if-Anweisung
126
2.5.2
Die Alternative mit einer if/else-AnWeisung wählen
128
2.5.3
Die switch-Anweisung bietet die Alternative
130
Schleifen
133
2.6.1
Die while-Schleife
133
2.6.2
Schleifenbedingungen und Vergleiche mit ==
134
2.6.3
Die do/while-Schleife
136
2.6.4
Die for-Schleife
137
2.6.5
Ausbruch planen mit break und Wiedereinstieg mit continue .... 142
2.6.6
break und continue mit Sprungmarken
144
Methoden einer Klasse
145
2.7.1
Bestandteil einer Funktion
146
2.7.2
Beschreibungen in der Java-API
146
2.7.3
Aufruf einer Methode
148
2.7.4
Methoden ohne Parameter
148
2.7.5
Statische Funktionen (Klassenmethoden)
149
2.7.6
Parameter, Argument und Wertübergabe
150
2.7.7
Methoden vorzeitig mit return beenden
151
2.7.8
Nicht erreichbarer Quellcode bei Funktionen
152
2.7.9
Rückgabewerte
152
2.7.10 Methoden überladen
156
2.7.11 Vorgegebener Wert*für nicht aufgeführte Argumente
158
2.7.12 Finale lokale Variablen
158
2.7.13 Rekursive Funktionen
160
2.7.14 DieTürmevon Hanoi
163
Weitere Operatoren
165
2.8.1
Operationen auf Bit-Ebene \ .
165
2.8.2
Die Verschiebeoperatoren
".
167
2.8.3
Ein Bit setzen, löschen, umdrehen und testen
170
2.8.4
Bit-Funktionen der Integer-und Long-Klasse
170
2.8.5
Der Bedingungsoperator
171
Einfache Benutzereingaben
:
173
Zum Weiterlesen
174
Klassen und Objekte
175
3.1
175
175
176
177
177
'
3.2
Objektorientierte Programmierung
3.1.1
Warum überhaupt OOP?
3.1.2
Wiederverwertbarkeit
Eigenschaften einer Klasse
3.2.1
Die Klasse Point
Inhalt
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
Die UML (Unified Modeling Language)
178
3.3.1
Hintergrund und Geschichte zur UML
178
3.3.2
Wichtige Diagrammtypen der UML
179
Anlegen und Nutzen eines Punktes
180
3.4.1
Deklarieren von Referenz-Variablen
180
3.4.2
Anlegen eines Exemplars einer Klasse mit dem new-Operator .... 180
3.4.3
Zugriff auf Variablen und Methoden mit dem ».«
181
3.4.4
Konstruktoren nutzen
184
Import und Pakete
184
Die API-Dokumentation
185
Mit Referenzen arbeiten
186
3.7.1
Die null-Referenz
186
3.7.2
Zuweisungen bei Referenzen
188
3.7.3
Funktionen mit nicht-primitiven Parametern
188
Identität und Gleichheit
190
3.8.1
Identität von Objekten
190
3.8.2
Gleichheit und die Methode equalsO
191
Arrays
193
3.9.1
Deklaration von Arrays
193
3.9.2
Arrays mit Inhalt
194
3.9.3
Die Länge eines Arrays über das Attribut length
195
3.9.4
Zugriff auf die Elemente über den Index
195
3.9.5
Array-Objekte erzeugen
:
196
3.9.6
Fehler bei Arrays
197
3.9.7
Arrays mit nicht-primitiven Elementen
198
3.9.8
Vorinitialisierte Arrays
199
3.9.9
Die erweiterte for-Schleife
199
3.9.10 Mehrdimensionale Arrays
\
201
3.9.11 Die Wahrheit über die Array-Initialisierung
203
3.9.12 Mehrere Rückgabewerte
204
3.9.13 Methode mit variabler Argumentanzahl (Vararg)
204
3.9.14
Klonen kann sich lohnen - Arrays vermehren
205
3.9.15 Feldinhalte kopieren
206
3.9.16 Die Klasse Arrays zum Vergleichen, Füllen und Suchen
207
Der Einstiegspunkt für das Laufzeitsystem mainO
213
3.10.1 Kommandozeilen-Argumente verarbeiten
213
3.10.2 Der Rückgabewert von mainO und System.exitO
214
3.10.3 Parser der Kommandozeilenargumente-Apache CLI
214
Eigene-Pakete schnüren
216
3.11.1 Die package-AnWeisung
216
3.11.2 Importieren von Klassen mit import
216
3.11.3 Paketnamen
217
Inhalt
3.12
4.1
4.2
4.3
4.4
4.5
4.6
4.7
J
4.8
3.11.4
Hierarchische Strukturen und das Default-Package
3.11.5
Klassen mit gleichen Namen in unterschiedlichen Paketen
3.11.6
Statisches Import
3.11.7
Eine Verzeichnisstruktur für eigene Projekte
Zum Weiterlesen
217
218
218
219
220
Einzelne Zeichen mit der Character-Klasse behandeln
221
Strings und deren Anwendung
222
4.2.1
String-Literale als String-Objekte für konstante Zeichenketten ... 224
4.2.2
String-Länge und Test auf Leerstring
226
4.2.3
Nach enthaltenen Zeichen und Zeichenfolgen suchen
226
4.2.4
Gut, dass wir verglichen haben
227
4.2.5
String-Teile extrahieren
229
4.2.6
Strings anhängen, Groß-/Kleinschreibung und Leerraum
231
4.2.7
Suchen und ersetzen
233
4.2.8
String-Objekte mit Konstruktoren neu anlegen
235
Konvertieren zwischen Primitiven und Strings
237
4.3.1
Unterschiedliche Typen in Zeichenketten konvertieren
237
4.3.2
String in primitives Element konvertieren
238
Veränderbare Zeichenketten mit StringBuffer/StringBuilder
239
4.4.1
Anlegen von StringBuffer/StringBuilder-Objekten
239
4.4.2
Länge eines StringBufferABuilder-Objekts lesen und setzen
240
4.4.3
Daten anhängen
241
4.4.4
Zeichen(folgen) setzen, erfragen, löschen und umdrehen
241
4.4.5
Vergleichen von String/StringBuffer/StringBuilder
242
4.4.6
hashCodeO bei StringBuffer/StringBuilder
244
Sprachabhängiges Vergleichen mit der Gollator-Klasse
244
4.5.1
Die Klasse Collator
244
4.5.2
Effiziente interne Speicherung für die Sortierung
247
Reguläre Ausdrücke
248
4.6.1
Die Klassen Pattern und Matcher
248
4.6.2
Mit MatchResult alle Ergebnisse einsammeln
250
Zerlegen von Zeichenketten
252
4.7.1
Splitten von Zeichenketten mit splitO
4.7.2
splitO in Pattern
4.7.3
Die Klasse Scanner
4.7.4
StringTokenizer
4.7.5
Breaklterator als Zeichen-, Wort-, Zeilen- und Satztrenner
Zeichenkodierungen und Base64
4.8.1
Über die Klasse String Kodierungen vornehmen
4.8.2
Konvertieren mit OutputStreamWriter-Klassen
252
253
254
258
260
263
263
264
Inhalt
4.9
4.10
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
6.1
10
4.8.3
Das Paket java.nio.charset
4.8.4
Base64-Kodierung
Formatieren von Ausgaben
4.9.1
Formatieren mit formatO aus String
4.9.2
Die Format-Klassen im Überblick
4.9.3
Zahlen, Prozente und Währungen mit NumberFormat
und DecimalFormat formatieren
4.9.4
Ausgaben mit MessageFormat formatieren
Zum Weiterlesen
264
265
266
266
269
Arithmetik in Java
5.1.1
Mantisse und Exponent
5.1.2
Spezialwerte Unendlich, Null, NaN
Wertebereich eines Typs und Überlaufkontrolle
5.2.1
Behandlung des Überlaufs
Die Eigenschaften der Klasse Math
5.3.1
Attribute
5.3.2
Winkelfunktionen
5.3.3
Runden von Werten
5.3.4
Wurzel und Exponentialfunktionen
5.3.5
Der Logarithmus
5.3.6
Rest der ganzzahligen Division
5.3.7
Absolutwerte und Maximum/Minimum
5.3.8
Zufallszahlen
5.3.9
Der Nächste, bitte
Mathe bitte strikt
,.
5.4.1
Strikt Fließkomma mit strictfp
.\
5.4.2
Die Klassen Math und StrictMath
Die Random-Klasse
,
Große Zahlen
5.6.1
Die Klasse Biginteger
5.6.2
Funktionen von Biginteger
5.6.3
Ganz lange Fakultäten
5.6.4
Große Fließkommazahlen mit BigDecimal
5.6.5
Mit MathContext komfortabel die Rechengenauigkeit setzen
Rechnen mit Einheiten: Java Units Specification
^
Zum Weiterlesen
275
275
276
278
278
280
281
281
282
284
284
285
286
286
287
287
287
287
288
290
290
292
294
295
296
297
299
Eigene Klassen deklarieren
6.1.1
Methodenaufrufe und Nebeneffekte
301
304
270
272
274
Inhalt
6.2
6.3
6.4
6.5
6.6
6.7
6.1.2
Argumentübergabe mit Referenzen
6.1.3
Die this-Referenz
6.1.4
Überdeckte Objektvariablen nutzen
Privatsphäre und Sichtbarkeit
6.2.1
Wieso nicht freie Methoden und Variablen für alle?
6.2.2
Privat ist nicht ganz privat: Es kommt darauf an, wer's sieht
6.2.3
Zugriffsmethoden für Attribute deklarieren
Statische Methoden und statische Attribute
6.3.1
Warum statische Eigenschaften sinnvoll sind
6.3.2
Statische Eigenschaften mit static
6.3.3
Statische Eigenschaften über Referenzen nutzen?
6.3.4
Warum die Groß-und Kleinschreibung wichtig ist
304
305
306
307
309
309
310
313
314
314
315
315
6.3.5
Statische Eigenschaften und Objekteigenschaften
316
6.3.6
Statische Variablen zum Datenaustausch
317
6.3.7
Statische Blöcke als Klasseninitialisierer
318
Konstanten und Aufzählungen
319
6.4.1
Konstanten über öffentliche statische final-Variablen
319
6.4.2
Eincompilierte Belegungen der Klassenvariablen
320
6.4.3
Typsicherere Konstanten
321
6.4.4
Aufzählungen mit enum
323
6.4.5
enum-Konstanten in switch
324
6.4.6
Enum-Objekte in der Weitergabe
324
6.4.7
Statische Imports von Aufzählungen
325
Objekte anlegen und zerstören
325
6.5.1
Konstruktoren schreiben
325
6.5.2
Konstruktor nimmt ein Objekt vom Typ der eigenen Klasse
(Copy-Konstruktor)
328
6.5.3
Einen anderen Konstruktor o\r gleichen Klasse aufrufen
329
6.5.4
Initialisierung der Objekt-und Klassenvariablen
332
6.5.5
Finale Werte im Konstruktor und in statischen Blöcken setzen ... 334
6.5.6
Exemplarinitialisierer (Instanzinitialisierer)
335
6.5.7
Ihr fehlt uns nicht - der Garbage-Collector
337
6.5.8
Implizit erzeugte String-Objekte
,
338
6.5.9
Private Konstruktoren, Utility-Klassen, Singleton, Fabriken
339
Assoziationen zwischen Objekten
341
6.6.1
Gegenseitige Abhängigkeiten von Klassen
342
Vererbung
342
6.7.1
Vererbung in Java
343
6.7.2
Einfach- und Mehrfachvererbung
343
6.7.3
Gebäude modelliert
344
6.7.4
Konstruktoren in der Vererbung
345
6.7.5
Sichtbarkeit protected
347
11
Inhalt
6.8
6.9
6.10
6.11
6.12
12
6.7.6
Das Substitutionsprinzip
348
6.7.7
Automatische und explizite Typanpassung
349
6.7.8
Typen mit dem binären Operator instanceof testen
350
6.7.9
Array-Typen und Kovarianz
351
6.7.10 Methoden überschreiben
352
6.7.11 Mit super eine Methode der Oberklasse aufrufen
354
6.7.12 Kovariante Rückgabetypen
356
6.7.13 Finale Klassen
356
6.7.14 Nicht überschreibbare Funktionen
357
6.7.15 Zusammenfassung zur Sichtbarkeit
357
6.7.16 Sichtbarkeit in der UML
358
6.7.17 Zusammenfassung: Konstruktoren und Methoden
359
Die Oberklasse gibt Funktionalität vor
360
6.8.1
Spätes dynamisches Binden als Beispiel für Polymorphie
362
6.8.2
Unpolymorph bei privaten, statischen und finalen Methoden .... 363
6.8.3
Polymorphie bei Konstruktoraufrufen
365
Abstrakte Klassen und abstrakte Methoden
367
6.9.1
Abstrakte Klassen
367
6.9.2
Abstrakte Methoden
368
Schnittstellen
370
6.10.1 Ein Polymorphie-Beispiel mit Schnittstellen
374
6.10.2 Die Mehrfachvererbung bei Schnittstellen
375
6.10.3 Erweitern von Interfaces - Subinterfaces
378
6.10.4 Vererbte Konstanten bei Schnittstellen
378
6.10.5 Schnittstellenmethoden, die nicht implementiert werden
müssen
380
6.10.6 Abstrakte Klassen und Schnittstellen im Vergleich
381
6.10.7 CharSequence als Beispiel einer Schnittstelle
381
6.10.8 Die Schnittstelle Iterable
\
383
Object ist die Mutter aller Oberklassen
386
6.11.1 Klassenobjekte
386
6.11.2 Objektidentifikation mit toStringO
386
6.11.3 Objektgleichheit mit equalsO und Identität
,
388
6.11.4 Klonen eines Objekts mit cloneO
392
6.11.5 Hashcodes über hashCodeO liefern
395
6.11.6 Aufräumen mit finalizeO ..>
397
6.11.7 Synchronisation
398
Innere Klassen
399
6.12.1.» Statische innere Klassen und Schnittstellen
399
6.12.2 Mitglieds-oder Elementklassen
400
6.12.3 Lokale Klassen
403
6.12.4 Anonyme innere Klassen
404
6.12.5 this und Vererbung
407
Inhalt
6.13
6.14
6.15
7.1
7.2
7.3
•>'
6.12.6
Implementierung einer verketteten Liste
6.12.7
Funktionszeiger
Generische Datentypen
6.13.1
Einfache Klassenschablonen
6.13.2
Einfache Methodenschablonen
6.13.3
Umsetzen der Generics, Typlöschung und Raw-Types
6.13.4
Einschränken der Typen
6.13.5
Generics und Vererbung, Invarianz
6.13.6 Wildcards
Die Spezial-Oberklasse Enum
6.14.1 Methoden auf Enum-Objekten
6.14.2 enum mit eigenen Konstruktoren und Methoden
Dokumentationskommentare mit JavaDoc
6.15.1
Einen Dokumentationskommentar setzen
6.15.2 M i t javadoc eine Dokumentation erstellen
6.15.3
HTML-Tags in Dokumentationskommentaren
6.15.4 Generierte Dateien
6.15.5
Dokumentationskommentare im Überblick
6.15.6 JavaDoc und Doclets
6.15.7 Veraltete (deprecated) Klassen, Konstruktoren und
Methoden
408
410
412
413
414
415
416
418
418
419
420
422
424
425
426
426
427
428
428
Problembereiche einzäunen
7.1.1
Exceptions in Java mit try und catch
7.1.2
Eine Datei mit RandomAccessFile auslesen
7.1.3
Ablauf einer Ausnahmesituai^ion
7.1.4
Wiederholung abgebrochener\Bereiche
7.1.5
throws im Methodenkopf angeben
7.1.6
Abschlussbehandlung mit finally
7.1.7
Nicht erreichbare catch-Klauseln
Die Klassenhierarchie der Fehler
7.2.1
Die Exception-Hierarchie
7.2.2
Oberausnahmen auffangen
7.2.3
Alles geht als Exception durch
7.2.4
RuntimeException muss nicht aufgefangen werden
7.2.5
Harte Fehler: Error
Auslösen eigener Exceptions
7.3.1
M i t throw Ausnahmen auslösen
7.3.2
Neue Exception-Klassen deklarieren
7.3.3
Abfangen und Weiterleiten
7.3.4
Geschachtelte Ausnahmen
433
433
434
435
436
437
440
443
443
444
445
446
447
448
449
449
450
452
453
429
Inhalt
7.4
7.5
7.6
8
454
455
455
456
457
457
457
458
Die Funktionsbibliothek
459
8.1
Die Java-Klassenphilosophie
8.1.1
Übersicht über die Pakete der Standardbibliothek
Wrapper-Klassen
8.2.1
Die Basisklasse Number für numerische Wrapper-Objekte
8.2.2
Die Klasse Integer
8.2.3
Unterschiedliche Ausgabeformate
8.2.4
Autoboxing: Boxing und Unboxing
8.2.5
Die Boolean-Klasse
8.2.6
Die Klassen Double und Float für Fließkommazahlen
Die Utility-Klasse System und Properties
8.3.1
Systemeigenschaften der Java-Umgebung
8.3.2
line.separator
.y.
8.3.3
Browser-Version abfragen
8.3.4
Property von der Konsole aus setzen
8.3.5
Umgebungsvariablen des Betriebssystems
8.3.6
Einfache Zeitmessung und Profiling
Benutzereinstellungen
v
8.4.1
Benutzereinstellungen in Registry oder XML:-Dokumenten
8.4.2
Einträge einfügen, auslesen und löschen
8.4.3
Auslesen der Daten und Schreiben in anderem Format
8.4.4
Auf Ereignisse horchen
Klassenlader (Class Loader)
8.5.1
Woher die kleinen Klassen kommen
8.5.2
Setzen des Klassenpfades
8.5.3
Die wichtigsten drei Typen von Klassenladern
8.5.4
Derjava.lang.ClassLoader
8.5.5
Hot Deployment mit dem URL-Class Loader
8.5.6
Das jre/lib/endorsed-Verzeichnis
8.5.7
getContextClassLoaderO vom Thread
459
459
465
467
468
470
470
473
475
475
476
477
478
478
479
480
483
483
484
486
487
487
487
488
489
490
491
494
494
8.5.8
Wie heißt die Klasse mit der Methode mainO?
Design-Pattern und das Beobachten von Änderungen
8.6.1
Design-Pattern
495
496
497
8.2
8.3
8.4
8.5
8.6
H
Rückgabewerte bei ausgelösten Ausnahmen
Der Stack Trace
7.5.1
Stack Trace aus Throwable
7.5.2
Stack Trace aus Thread
Assertions
7.6.1
Assertions in Java
7.6.2
Assertions in eigenen Programmen nutzen
7.6.3
Assertions aktivieren
Inhalt
8.7
8.8
8.9
9
8.6.2
Das Beobachter-Pattern (Observer/Observable)
Ausführen externer Programme, Compiler und Skripten
8.7.1
ProcessBuilder und Prozesskontrolle mit Process
8.7.2
Die Windows-Registry verwenden
8.7.3
Einen Browser/E-Mail-Client/Editor aufrufen
8.7.4
Ausführen von Skripten
8.7.5
Programme mit der Compiler-API übersetzen
Annotationen
8.8.1
Annotationstypen @Override, (f)Deprecated,
@SuppressWarnings
8.8.2
Common Annotations
8.8.3
Annotationen für Web-Services
8.8.4
Annotationen für XML-Mapping
Zum Weiterlesen
497
501
501
504
505
506
508
510
510
512
512
512
512
Threads und nebenläufige Programmierung
515
9.1
515
515
9.2
9.3
9.4
*'
Nebenläufigkeit
9.1.1
Threads und Prozesse
9.1.2
Wie parallele Programme die Geschwindigkeit steigern
können
Threads erzeugen
9.2.1
Threads über die Schnittstelle Runnable implementieren
9.2.2
Thread mit Runnable starten
9.2.3
Der Name eines Threads
9.2.4
Die Klasse Thread erweitern
9.2.5
Wer bin ich?
Der Ausführer (Executor) kommt
^
9.3.1
Die Schnittstelle Executor ....^
9.3.2
Die Thread-Pools
9.3.3
Threads mit Rückgabe über Callable
9.3.4
Mehrere Callable abarbeiten
9.3.5
M i t ScheduledExecutorService wiederholende Ausgaben
und Zeitsteuerungen
Die Zustände eines Threads
9.4.1
Threads schlafen
9.4.2
Das Ende eines Threads
9.4.3
UncaughtExceptionHandler für unbehandelte Ausnahmen
9.4.4
Einen Thread höflich mit Interrupt beenden
9.4.5
Der stopO von außen und die Rettung mit ThreadDeath
530
530
531
532
533
534
536
9.4.6
9.4.7
9.4.8
537
539
540
Ein Rendezvous mit joinO
Barrier und Austausch mit Exchanger
Mit yieldO auf Rechenzeit verzichten
516
518
518
519
521
521
524
524
524
526
527
529
15
Inhalt
9.5
9.6
9.7
9.8
9.9
9.10
9.11
9.12
16
9.4.9
Arbeit niederlegen und wieder aufnehmen
540
9.4.10
Priorität
540
9.4.11
Der Thread ist ein Dämon
542
Synchronisation über kritische Abschnitte
544
9.5.1
Gemeinsam genutzte Daten
544
9.5.2
Probleme beim gemeinsamen Zugriff und kritische Abschnitte ... 544
9.5.3
Punkte parallel initialisieren
hv.
545
9.5.4
i++sieht atomar aus, ist es aber nicht
547
9.5.5
Kritische Abschnitte schützen
548
9.5.6
Schützen mit ReentrantLock
549
9.5.7
Synchronisieren mit synchronized
553
9.5.8
Synchronized-Methoden der Klasse StringBuffer
554
9.5.9
M i t synchronized synchronisierte Blöcke
555
9.5.10
Dann machen wir doch gleich alles synchronisiert
556
9.5.11
Lock-Freigabe im Fall von Exceptions
557
9.5.12
M i t synchronized nachträglich synchronisieren
558
9.5.13
Monitore sind reentrant-gut für die Geschwindigkeit
559
9.5.14
Synchronisierte Methodenaufrufe zusammenfassen
560
9.5.15
Deadlocks
561
9.5.16
Erkennen von Deadlocks
562
Synchronisation über Warten und Benachrichtigen
563
9.6.1
Die Schnittstelle Condition
564
9.6.2
Beispiel Erzeuger-Verbraucher-Programm
567
9.6.3
Warten mit waitO und Aufwecken mit notifyO
9.6.4
Falls der Lock fehlt: HlegalMonitorStateException
9.6.5
Semaphore
Atomare Operationen und frische Werte mit volatile
9.7.1
Der Modifizierer volatile bei Objekt-/KlasseKjyariablen
9.7.2
Das Paket java.util.concurrent.atomic
M i t dem Thread verbundene Variablen
9.8.1
ThreadLocal
9.8.2
InheritableThreadLocal
Gruppen von Threads in einer Thread-Gruppe
9.9.1
Aktive Threads in der Umgebung
9.9.2
Etwas über die aktuelle Thread-Gruppe herausfinden
9.9.3
Threads in einer Thread-Gruppe anlegen
9.9.4
Methoden von Thread und ThreadGroup im Vergleich
Zeitgesteuerte Abläufe
9.10.1 y Die Klassen Timer und TimerTask
9.10.2 Job-Scheduler Quartz
Einen Abbruch der virtuellen Maschine erkennen
Zum Weiterlesen
571
573
574
577
577
578
579
580
581
583
583
584
586
588
590
590
591
592
593
Inhalt
10 Raum und Zeit
595
10.1
Weltzeit
595
10.2
10.3
Wichtige Datum-Klassen im Überblick
Sprachen der Länder
10.3.1 Sprachen und Regionen über Locale-Objekte
Übersetzung durch ResourceBundle-Objekte
10.4.1
Ressource-Dateien
10.4.2
Die Klasse ResourceBundle
10.4.3
Ladestrategie für ResourceBundle-Objekte
Zeitzonen
10.5.1 Zeitzonen durch die Klasse TimeZone repräsentieren
596
596
597
600
600
601
602
603
604
10.4
10.5
10.6
10.7
10.8
10.9
11.1
11.2
11.3
Die Klasse Date
605
10.6.1
Calendar
10.7.1
10.7.2
Objekte erzeugen und Methoden nutzen
und GregorianCalendar
Die abstrakte Klasse Calendar
Der gregorianische Kalender
605
607
607
608
10.7.3
Ostertage
611
10.7.4 Abfragen und Setzen von Datumselementen
Formatieren der Datumsangaben
10.8.1 M i t DateFormat und SimpleDateFormat formatieren
10.8.2
Parsen von Datumswerten
10.8.3
Parsen und Formatieren ab bestimmten Positionen
Zum Weiterlesen
612
617
617
623
624
625
Datenstrukturen und die Collection-API
11.1.1
Die Schnittstelle Collection . \
11.1.2
Das erste Programm mit Container-Klassen
11.1.3
Die Schnittstelle Iterable und das erweiterte for
11.1.4
Generische Datentypen in der Collection-API
11.1.5
Generischer Typ bei Iterable und konkreter Typ beim
erweiterten for
'.
11.1.6 Schnittstellen, die Collection erweitern, und Map
11.1.7
Konkrete Container-Klassen
Mit einem Iterator durch die Daten wandern
11.2.1
Die Schnittstellen Enumeration und Iterator
11.2.2
Der typisierte Iterator
Listen
11.3.1 ArrayList oder LinkedList? Speicherung im Feld oder in einer
verketteten Liste
,
11.3.2
Die Schnittstelle List
627
628
629
630
631
632
632
634
634
634
636
638
638
639
17
Inhalt
11.3.3
11.3.4
11.3.5
11.3.6
11.3.7
11.3.8
11.4
11.5
11.6
11.7
11.8
Listlterator
Beispiel mit List-Methoden
Arrayüst
LinkedList
Arrays.asListO und die »echten« Listen
toArrayO von Collection verstehen - die Gefahr einer Falle
erkennen
Vergleichen von Objekten
11.4.1
Die Schnittstellen Comparator und Comparable
11.4.2
Algorithmen mit Such-und Sortiermöglichkeiten
11.4.3
Den größten und kleinsten Wert einer Collection finden
11.4.4 Sortieren
Mengen (Sets)
11.5.1
HashSet
11.5.2 TreeSet- die Menge durch Bäume
11.5.3
LinkedHashSet
Stack (Kellerspeicher, Stapel)
11.6.1
Die Methoden von Stack
11.6.2
Ein Stack ist ein Vector-aha!
Queues (Schlangen)
11.7.1
Blockierende Queues und Prioritätswarteschlangen
Assoziative Speicher HashMap und TreeMap
11.8.1
Ein Objekt der Klasse HashMap erzeugen
11.8.2
Einfügen und Abfragen der Datenstruktur
11.8.3
11.8.4
Die Bedeutung von equalsO, hashCodeO und
IdentityHashMap
Elemente im Assoziativspeicher müssen unveränderbar
bleiben
\.
11.8.5 Aufzählen der Elemente
11.8.6
Der Gleichheitstest, Hash-Wert und Klon einer Hash-Tabelle
11.8.7
Die Arbeitsweise einer Hash-Tabelle
11.9
Die Properties-Klasse
11.9.1
Properties setzen und lesen
,
11.9.2
Properties verketten
11.9.3
Eigenschaften ausgeben
11.9.4
Hierarchische Eigenschaften
11.9.5
Properties speichern
11.9.6
Über die Beziehung zwischen den Klassen Properties und
y Hashtable
11.10 Algorithmen in Collections
11.10.1 Datenmanipulation: Umdrehen, Füllen, Kopieren
11.10.2 M i t der Halbierungssuche nach Elementen fahnden
18
641
642
645
647
649
649
652
652
654
655
657
659
662
662
664
664
665
665
666
667
668
668
669
671
67
2
672
674
675
677
677
677
678
679
679
681
681
682
683
Inhalt
11.10.3 Nicht-änderbare Datenstrukturen
11.10.4 Häufigkeit eines Elements
11.10.5 nCopiesO
11.10.6 Singletons
11.11 Synchronisation der Datenstrukturen
11.11.1 Lock-Free-Algorithmen aus java.util.concurrent
11.11.2 Wrapper zur Synchronisation
11.11.3 CopyOnWriteArrayList und CopyOnWriteArraySet
11.12 Die abstrakten Basisklassen für Container
11.12.1 Optionale Methoden
11.13 Die Klasse BitSetfür Bitmengen
11.13.1 Ein BitSet anlegen, füllen und erfragen
11.13.2 Mengenorientierte Operationen
11.13.3 Funktionsübersicht
11.13.4 Primzahlen in einem BitSet verwalten
12.1
12.2
12.3
684
684
684
685
686
686
686
687
687
688
689
689
690
691
692
Datei und Verzeichnis
694
12.1.1
Dateien und Verzeichnisse mit der Klasse File
694
12.1.2
Verzeichnis oder Datei? Existiert es?
696
12.1.3
Verzeichnis-und DateieigenschaftenAattribute
697
12.1.4 Wurzelverzeichnis, Laufwerksnamen, Plattenspeicher
699
12.1.5
Umbenennen und Verzeichnisse anlegen
701
12.1.6 Verzeichnisse listen und Dateien filtern
702
12.1.7
Dateien berühren, neue Dateien anlegen, temporäre Dateien .... 704
12.1.8
Dateien und Verzeichnisse löschen
706
12.1.9 Verzeichnisse nach Dateien rekursiv durchsuchen
707
12.1.10 URL-und URI-Objekte aus einem File-Objekt ableiten
708
12.1.11 Mit Locking Dateien sperren
709
12.1.12 Sicherheitsprüfung
„
709
12.1.13 Mime-Typen mit dem JavaBeans Activation Framework (JAF) .... 709
12.1.14 Zugriff auf SMB-Server mit jCIFS
710
Dateien mit wahlfreiem Zugriff
711
12.2.1
Ein RandomAccessFile zum Lesen und Schreiben öffnen
712
12.2.2 Aus dem RandomAccessFile lesen
712
12.2.3
Schreiben mit RandomAccessFile
714
12.2.4
Die Länge des RandomAccessFile
715
12.2.5
Hin und her in der Datei
715
12.2.6 Wahlfreier Zugriff und Pufferung mit Unified I/O
716
Stream-Klassen und Reader/Writer am Beispiel von Dateien
717
12.3.1 M i t dem FileWriter Texte in Dateien schreiben
718
12.3.2 Zeichen mit der Klasse FileReader lesen
719
19
Inhalt
12.4
12.5
12.6
12.7
12.8
12.9
20
12.3.3
Kopieren mit FileOutputStream und FilelnputStream
12.3.4
Das FileDescriptor-Objekt
Basisklassen für die Ein-/Ausgabe
12.4.1
Die abstrakten Basisklassen
12.4.2
Übersicht über Ein-/Ausgabeklassen
12.4.3
Die abstrakte Basisklasse OutputStream
12.4.4
Die Schnittstellen Closeable und Flushable
12.4.5
Ein Datenschlucker
12.4.6
Die abstrakte Basisklasse InputStream
12.4.7
Ressourcen wie Grafiken aus dem Klassenpfad und aus
Jar-Archiven laden
12.4.8 Ströme mit SequencelnputStream zusammensetzen
12.4.9
Die abstrakte Basisklasse Writer
12.4.10 Die Schnittstelle Appendable
12.4.11 Die abstrakte Basisklasse Reader
Formatierte Textausgaben
12.5.1
Die Klassen PrintWriter und PrintStream
12.5.2
System.out, System.err und System.in
12.5.3
Geschützte Passwort-Eingaben mit der Klasse Console
Schreiben und Lesen aus Strings und Byte-Feldern
12.6.1
Mit dem StringWriter ein String-Objekt füllen
12.6.2
CharArrayWriter
12.6.3
StringReader und CharArrayReadeh
12.6.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
12.6.5
Mit ByteArraylnputStream aus einem Byte-Feld lesen
Datenströme filtern und verketten
12.7.1 Writer als Filter verketten
12.7.2
Gepufferte Unicode-Ausgabe mit BufferedWeiter
12.7.3
Gepufferte Unicode-Eingabe mit Buffe red Reader
12.7.4
LineNumberReader zählt automatisch Zeilen mit
12.7.5
Daten mit der Klasse PushbackReader zurücklegen
12.7.6
DataOutputStream/DatalnputStream
12.7.7
Basisklassen für Filter
12.7.8
Die Basisklasse FilterWriter
12.7.9
Ein LowerCaseWriter
12.7.10 Eingaben mit der Klasse FilterReader filtern
Vermittler zwischen Byte-Streams und Unicode-Strömen
12.8.1
Datenkonvertierung durch den OutputStreamWriter
12.8.2/- Automatische Konvertierungen mit dem InputStream Reader
Kommunikation zwischen Threads mit Pipes
12.9.1
PipedOutputStream und PipedInputStream
12.9.2
PipedWriter und PipedReader
720
723
724
724
724
725
727
728
728
729
730
732
733
734
736
736
740
743
743
744
744
745
746
747
747
748
748
750
752
752
755
755
756
757
758
759
759
760
761
762
763
Inhalt
12.10 Datenkompression
12.10.1 Java-Unterstützung beim Komprimieren und
Zusammenpacken
12.10.2 Datenströme komprimieren
12.10.3 Zip-Archive
12.10.4 Jar-Archive
12.11 Prüfsummen
12.11.1 Die Schnittstelle Checksum
12.11.2 Die Klasse CRC32
12.11.3 Die Adler32-Klasse
12.12 Persistente Objekte und Serialisierung
12.12.1 Objekte mit der Standard-Serialisierung speichern
12.12.2 Objekte über die Standard-Serialisierung lesen
12.12.3 Die Schnittstelle Serializable
12.12.4 Nicht serialisierbare Attribute aussparen
12.12.5 Das Abspeichern selbst in die Hand nehmen
12.12.6 Tiefe Objektkopien
12.12.7 Versionenverwaltung und die SUID
12.12.8 Wie die ArrayList serialisiert
12.12.9 Probleme mit der Serialisierung
12.12.10 Serialisieren in XML-Dateien
12.12.11 JavaBeans Persistence
12.12.12 XStream
>
12.13 Tokenizer
12.13.1 StreamTokenizer
12.13.2 CSV-(Comma Separated Values-)Dateien verarbeiten
13.1
13.2
13.3
Auszeichnungssprachen
13.1.1
Die Standard Generalized Markup Language (SGML)
13.1.2
Extensible Markup Language (XML)
Eigenschaften von XML-Dokumenten
13.2.1
Elemente und Attribute
13.2.2
Beschreibungssprache für den Aufbau von XML-Dokumenten ...
13.2.3
Schema - eine Alternative zu DTD
13.2.4
Namensraum (Namespace)
13.2.5 XML-Applikationen
Die Java-APIs für XML
13.3.1
Das Document Object Model (DOM)
13.3.2
Simple API for XML Parsing (SAX)
13.3.3
Pull-API StAX
13.3.4 Java Document Object Model (JDOM)
765
766
766
770
777
777
777
778
780
780
781
784
785
786
788
790
792
794
795
795
796
798
798
798
801
803
803
804
804
804
806
809
811
813
813
814
814
814
814
21
Inhalt
13.4
13.5
13.6
13.3.5 JAXP als Java-Schnittstelle zu XML
13.3.6
DOM-Bäume einlesen mit JAXP
Serielle Verarbeitung mit StAX
13.4.1
Unterschiede der Verarbeitungsmodelle
13.4.2 XML-Dateien mit dem Cursor-Verfahren lesen
13.4.3 XML-Dateien mit dem Iterator-Verfahren verarbeiten
13.4.4 Mit Filtern arbeiten
13.4.5 XML-Dokumente schreiben
Serielle Verarbeitung von XML mit SAX
13.5.1 Schnittstellen von SAX
13.5.2
SAX-Parser erzeugen
13.5.3
Die wichtigsten Methoden der Schnittstelle ContentHandler
13.5.4
ErrorHandler und EntityResolver
XML-Dateien mit JDOM verarbeiten
13.6.1 JDOM beziehen
13.6.2
Paketübersicht
13.6.3
Die Document-Klasse
13.6.4
Eingaben aus der Datei lesen
13.6.5
Das Dokument im XML-Format ausgeben
13.6.6
Der Dokumenttyp
13.6.7
Elemente
13.6.8 Zugriff auf Elementinhalte
13.6.9
Liste mit Unterelementen erzeugen«
13.6.10 Neue Elemente einfügen und ändern
13.6.11 Attributinhalte lesen und ändern
815
815
816
816
818
820
821
822
824
825
826
826
828
829
829
830
831
832
833
833
834
836
838
839
841
13.6.12 XPath
844
13.7
Transformationen mit XSLT
13.7.1 Templates und XPath als Kernelemente vonNXSLT
13.7.2
Umwandlung von XML-Dateien mit JDOM und JAXP
13.8 Java Architecture for XML Binding (JAXB)
13.9 HTML-Dokumente einlesen
13.10 Zum Weiterlesen
14 Grafische Oberflächen mit Swing
14.1
14.2
22
847
847
849
850
852
853
855
Das Abstract-Window-Toolkit und Swing
14.1.1 Java Foundation Classes
14.1.2 Was Swing vom AWT unterscheidet
14.1.3
Peer-Klassen und Lightweight-Komponenten
14.1.4' Die Klasse Toolkit
Fenster unter grafischen Oberflächen
14.2.1 Swing-Fenster darstellen
855
855
857
857
858
859
859
14.2.2
860
Fenster schließbar machen - setDefaultCloseOperationO
Inhalt
14.3
14.4
14.5
14.6
14.7
14.8
14.2.3
AWT-Fenster darstellen
14.2.4 Sichtbarkeit des Fensters
14.2.5
Größe und Position des Fensters verändern
14.2.6
Unterklassen der Fenster-Klassen bilden
14.2.7
Fenster- und Dialog-Dekoration
14.2.8
Dynamisches Layout während einer Größenänderung
Beschriftungen über die Klasse JLabel
14.3.1 Mehrzelliger Text, HTML in der Darstellung
Es tut sich was - Ereignisse beim AWT
14.4.1
Die Klasse AWTEvent
14.4.2
Events auf verschiedenen Ebenen
14.4.3
Ereignisquellen und Horcher (Listener)
14.4.4
Listener implementieren
14.4.5
Listener bei dem Ereignisauslöser anmelden/abmelden
14.4.6 Aufrufen der Listener im AWT-Event-Thread
14.4.7 Adapterklassen nutzen
14.4.8
Innere Mitgliedsklassen und innere anonyme Klassen
14.4.9
Generic Listener
Schaltfläche
14.5.1
DerJButton
14.5.2
Der aufmerksame ActionListener
14.5.3
AbstractButton
14.5.4 JToggleButton
s
Icon und Imagelcon für Bilder auf Swing-Komponenten
14.6.1
Die Schnittstelle Icon
14.6.2 Was Icon und Image verbindet
JComponent und Component als Basis aller Komponenten
14.7.1
Ereignisse jeder Komponente""^.
14.7.2
Die Größe eine Komponente .:.
14.7.3
Die Position der Komponente
14.7.4
Properties
.v
14.7.5
Fokus
14.7.6
Komponenten-Ereignisse
,
14.7.7
Hinzufügen von Komponenten
14.7.8 Zeichnen von Komponenten und die Undurchsichtigkeit
14.7.9 Tooltips
14.7.10 Rahmen (Border)
Container
14.8.1 JPanel
14.8.2 JScrollPane
14.8.3 JTabbedPane
14.8.4 JSplitPane
861
861
862
863
864
864
864
868
868
868
869
871
872
874
875
875
877
878
879
879
880
882
885
885
887
888
889
889
892
892
893
893
894
896
896
897
898
900
901
901
902
903
Inhalt
14.9
14.10
14.11
14.12
14.13
14.14
14.15
14.16
14.17
24
Alles Auslegungssache: die Layoutmanager
14.9.1
Übersicht über Layoutmanager
14.9.2 Zuweisen eines Layoutmanagers
14.9.3
Im Fluss mit FlowLayout
14.9.4 M i t BorderLayout in allen Himmelsrichtungen
14.9.5
Rasteranordnung mit GridLayout
14.9.6
Der GridBagLayout-Manager
14.9.7
Null-Layout
14.9.8
BoxLayout
14.9.9 Weitere Layoutmanager
Rollbalken und Slider
14.10.1 Der Schieberegler JSIider
14.10.2 Der Rollbalken JScrollBar
Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
14.11.1 Kontrollfelder (JCheckBox)
14.11.2 Ereignisse über ItemListener
14.11.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
Der Fortschrittsbalken JProgressBar
Menüs und Symbolleisten
14.13.1 Die Menüleisten und die Einträge
14.13.2 Menüeinträge definieren
14.13.3 Einträge durch Action-Objekte beschreiben
14.13.4 Mnemonics und Shortcuts (Accelenator)
14.13.5 Symbolleisten alias Toolbars
14.13.6 Popup-Menüs
14.13.7 System-Tray nutzen
Das Konzept des Model-View-Controllers
Auswahlmenüs, Listen und Spinner
.>y
:
14.15.1 Das Auswahlmenü JComboBox
.
14.15.2 Zuordnung einer Taste mit einem Eintrag
14.15.3 Datumsauswahl
:
14.15.4 Die JList
14.15.5 JSpinner
,
Texteingabefelder
14.16.1 Text in einer Eingabezeile
14.16.2 Die Oberklasse der JText-Komponenten: JTextComponent
14.16.3 JPasswordField
14.16.4 Validierende Eingabefelder
14.16.£ Mehrzeilige Textfelder
14.16.6 Die Editor-Klasse JEditorPane
Bäume mit JTree-Objekten
14.17.1 Selektionen bemerken
904
904
905
906
908
910
912
916
917
918
918
918
920
924
924
926
928
930
932
932
934
935
937
939
941
945
946
948
948
951
952
953
956
957
958
959
960
960
961
964
966
968
Inhalt
14.18 Tabellen mitJTable
14.18.1 Ein eigenes Tabellen-Model
14.18.2 AbstractTableModel
14.18.3 DefaultTableModel
14.18.4 Ein eigener Renderer für Tabellen
14.18.5 Zeil-Editoren
14.18.6 Größe und Umrandung der Zellen
14.18.7 Spalteninformationen
14.18.8 Tabellenkopf von Swing-Tabellen
14.18.9 Selektionen einer Tabelle
14.18.1 ©Automatisches Sortieren und Filtern mit RowSorter
14.18.11 Ein professionelles Tabellenlayout mit JGrid
14.19 JRootPane, JLayeredPane und JDesktopPane
14.19.1 JRootPane
14.19.2 JLayeredPane
14.19.3 JDesktopPane und die Kinder JlnternalFrame
14.20 Dialoge und Window-Objekte
14.20.1 JWindowundJDialog
14.20.2 Modal oder nicht-modal
14.20.3 Standarddialoge mit JOptionPane
14.20.4 Der Farbauswahldialog JColorChooser
14.20.5 Der Dateiauswahldialog
14.21 Flexibles Java-Look & Feel
*
14.21.1 L&F global setzten
14.21.2 UlManager
14.21.3 Verbessern des Aussehens unter Windows mit JGoodies
Looks
14.21.4 Swing-Beschriftungen eine andere Sprache geben
14.22 Die Zwischenablage (Clipboard)
:.
14.22.1 Clipboard-Objekte
14.22.2 Auf den Inhalt zugreifen mit Transferable
14.22.3 DataFlavor ist das Format der Daten in der Zwischenablage
14.22.4 Einfügungen in der Zwischenablage erkennen
14.22.5 Drag & Drop
14.23 Undo durchführen
14.24 AWT, Swing und die Threads
14.24.1 Swing ist nicht thread-sicher
'
4
*
14.24.2 Swing-Elemente mit invokeLaterO und invokeAndWaitO
bedienen
14.24.3 SwingWorker
14.24.4 Eigene Ereignisse in die Queue setzen
14.24.5 Auf alle Ereignisse hören
969
970
971
974
975
979
980
980
981
981
982
983
983
984
984
984
986
987
987
987
989
991
995
995
995
997
997
998
998
999
1000
1002
1002
1003
1005
1006
1008
1009
1011
1012
25
Inhalt
14.25 Selbst definierte Cursor
14.26 Benutzerinteraktionen automatisieren
14.26.1 Automatisch in die Tasten hauen
1012
1014
1014
14.26.2 Mausoperationen
14.26.3 Methoden zur Zeitsteuerung
14.26.4 Screenshots
14.26.5 Funktionsweise und Beschränkungen
14.26.6 Mouselnfo und Pointerlnfo
14.27 Zeitliches Ausführen mit dem javax.swing.Timer
14.28 Alternativen zu AWT und Swing
14.28.1 XML-Beschreibungen der Oberfläche: Swixml, XUL/Luxor
1015
1016
1016
1017
1017
1017
1018
1018
14.28.2 SWT
14.29 Zum Weiterlesen
15 Grafikprogrammierung
15.1
15.2
15.3
15.4
15.5
26
1019
1019
1021
Grundlegendes zum Zeichnen
1021
15.1.1
Die paintO-Methode für das AWT-Frame
1021
15.1.2 Zeichen von Inhalten mit JFrame
1023
15.1.3
Auffordern zum Neuzeichnen mit repaint()
1024
15.1.4 Grundbegriffe: Koordinaten, Punkte, Pixel
1024
15.1.5
Die ereignisorientierte Programmierung ändert Fensterinhalte ... 1025
15.1.6 Java2D-API
1026
Einfache Zeichenfunktionen
1027
15.2.1
Linien
1027
15.2.2
Rechtecke
1028
15.2.3
Ovale und Kreisbögen
1028
15.2.4
Polygone und Polylines
1029
Zeichenketten schreiben und Fonts
.\
1032
15.3.1 Zeichenfolgen schreiben
1032
15.3.2
Die Font-Klasse
1032
15.3.3
Einen neuen Font aus einem gegebenen Font ableiten
1034
15.3.4 Zeichensätze des Systems ermitteln
1035
15.3.5
Neue TrueType-Fonts in Java nutzen
.'
1036
15.3.6
Font-Metadaten durch FontMetrics
1036
Geometrische Objekte
1039
15.4.1
Die Schnittstelle Shape
1041
15.4.2
Kreisförmiges
1042
15.4.3
Kurviges
1042
15.4.4*' Area und die konstruktive Flächengeometrie
1042
15.4.5
Pfade
1043
Farben und die Paint-Schnittstelle, Linientypen
1046
15.5.1 Zufällige Farbblöcke zeichnen .../..
1046
Inhalt
15.5.2 Farben mit der Klasse Color
15.5.3 Die Farben des Systems über SystemColor
15.5.4 Composite und Xor
15.5.5 Dicke und Art der Linien von Formen bestimmen
15.6 Bilder
15.6.1 Eine Übersicht über die Bilder-Bibliotheken
15.6.2 Bilder mit ImagelO lesen
15.6.3 Ein Bild zeichnen
15.6.4 Programm-Icon/Fenster-Icon setzen
15.6.5 Splash-Screen
15.6.6 Bilder im Speicher erzeugen
15.6.7 Kein Flackern durch Double-Buffering
15.6.8 Bilder skalieren
15.6.9 Schreiben mit ImagelO
15.6.10 Java Image Management Interface (JIMI)
15.6.11 Pixel für Pixel auslesen und schreiben
15.6.12 Asynchrones Laden mitgetlmageO und dem MediaTracker
15.6.13 Volatilelmage
15.7 Clipping-Operationen
15.8 Zeichenhinweise durch RenderingHints
15.9 Transformationen mit einem AffineTransform-Objekt
15.10 Drucken
15.10.1 Drucken mit dem einfachen Ansatz
15.10.2 Ein PrintJob
15.10.3 Drucken der Inhalte
15.10.4 Komponenten drucken
15.10.5 Den Drucker am Parallelport ansprechen
15.10.6 Bekannte Drucker
.\.
15.11 Grafikverarbeitung ohne grafische Oberflache
15.11.1 Xvfb-Server
15.11.2 Pure Java AWT Toolkit(PJA)
:
15.12 Zum Weiterlesen
16.1
16.2
Grundlegende Begriffe
16.1.1 Internet-Standards und RFC
URI und URL
16.2.1 URI
16.2.2 Die Klasse URL
16.2.3 Informationen über eine URL
16.2.4 Der Zugriff auf die Daten über die Klasse URL
16.2.5 Verbindungen durch einen Proxy-Server
1048
1051
1054
1055
1058
1059
1060
1062
1065
1065
1066
1067
1069
1070
1074
1074
1076
1077
1078
1081
1082
1084
1084
1085
1086
1088
1089
1090
1090
1091
1091
1091
1093
1094
1094
1094
1095
1097
1099
1101
27
Inhalt
16.3
28
Die Klasse URLConnection
16.3.1 Methoden und Anwendung von URLConnection
16.3.2
Protokoll- und Content-Handler
16.3.3
Im Detail: vom URL zu URLConnection
16.3.4
Der Protokoll-Handler für Jar-Dateien
16.3.5 Verbindungen und Proxy-Authentifizierung mit Basic
Authentication
16.4 M i t GET und POST Daten Übergen
16.4.1
Kodieren der Parameter für Serverprogramme
16.4.2
Eine Suchmaschine ansprechen
16.5
Host- und IP-Adressen
16.5.1
Lebt der Rechner?
16.5.2
Das Netz ist Klasse
16.5.3
IP-Adresse des lokalen Hosts
16.6 Networkinterface
16.7 M i t dem Socket zum Server
16.7.1
Das Netzwerk ist der Computer
16.7.2 Sockets
16.7.3
Eine Verbindung zum Server aufbauen
16.7.4 Server unter Spannung: die Ströme
16.7.5
Die Verbindung wieder abbauen
16.7.6
Informationen über den Socket
16.7.7
Reine Verbindungsdaten über SocketAddress
16.8 Client/Server-Kommunikation
16.8.1 Warten auf Verbindungen
16.8.2
Ein Multiplikationsserver
16.8.3
Blockierendes Lesen
16.8.4 Von außen erreichbar sein
.^.
16.9 Apache Jakarta Commons HttpClient und Net
i
16.9.1 Jakarta Commons HttpClient
16.9.2 Jakarta Commons Net
.16.10 Arbeitsweise eines Webservers
16.10.1 Das Hypertext Transfer Protocol (HTTP)
16.10.2 Anfragen an den Server
16.10.3 Die Antworten vom Server
16.10.4 Webserver mit com.sun.net.httpserver.HttpServer
16.11 Datagram-Sockets
1101
1102
1104
1105
1106
16.11.1 Die Klasse DatagramSocket
16.11.2 Datagramme und die Klasse Datagram Packet
1139
1140
16.11.3
16.11.4
16.11.5
16.11.6
1141
1142
1143
1144
Auf ein hereinkommendes Paket warten
Ein Paket zum Senden vorbereiten
Methoden der Klasse Datagram Packet
Das Paketsenden
1107
1109
1109
1111
1111
1113
1114
1114
1115
1116
1116
1117
1117
1118
1119
1119
1121
1122
1122
1123
1126
1127
1128
1128
1129
1129
1129
1130
1133
1136
1137
Inhalt
16.12 E-Mail
1145
16.12.1 Wie eine E-Mail um die Welt geht
16.12.2 Das Simple Mail Transfer Protocol und RFC 822
16.12.3 POP (Post Office Protocol)
16.12.4 Die JavaMail API
16.12.5 E-Mails versenden
16.12.6 MimeMultipart-Nachrichten schicken
16.12.7 E-Mails mittels POP3 abrufen
16.12.8 Ereignisse und Suchen
16.13 Tiefer liegende Netzwerkeigenschaften
16.13.1 Internet Control Message Protocol (ICMP)
16.13.2 MAC-Adresse
16.14 Zum Weiterlesen
1145
1145
1146
1146
1147
1148
1149
1150
1151
1151
1152
1153
17.1
17.2
Dynamisch generierte Webseiten
17.1.1 Was sind Servlets?
17.1.2 Was sind JavaServer Pages?
Servlets und JSPs mit Tomcat entwickeln
17.2.1
Servlet-Container
17.2.2
Entwicklung der Servlet/JSP-Spezifikationen
17.2.3
Webserver mit Servlet-Funktionalität
1155
1156
1156
1157
1157
1158
1158
17.2.4
Tomcat
1159
17.2.5
Ablageort für eigene JSP-Seiten
1159
17.2.6
Webapplikationen
1160
\
17.2.7
17.3
17,
!
*rr17
itt
\t..
Zuordnung von Webapplikationen zu physikalischen
Verzeichnissen
17.2.8 Mit dem WTP ein Web-Projek\entwickeln
JSP-Konstrukte
17.3.1 Scriptlets
17.3.2 Ausdrücke
17.3.3
Deklarationen
17.3.4
Kommentare
1161
1161
1163
1164
1164
1165
1165
17.3.5
1166
Quoting
17.3.6
Entsprechende XML-Tags
Implizite Objekte
Formulardaten
Auf Beans zurückgreifen
17.6.1
Die Bean-Klasse
17.6.2
Beans in JSP-Seiten anlegen
17.6.3 Attribute setzen und erfragen
17.6.4
Der schnelle Zugriff auf Parameter
1166
1166
1167
1169
1169
1170
1170
1171
29
Inhalt
17.7
17.8
17.9
17.10
17.11
17.12
17.13
17.14
17.15
Mit HttpServletRequest an die geschickten Browser-Daten
17.7.1 Verarbeiten der Header
17.7.2
Hilfsfunktion im Umgang mit Headern
17.7.3
Übersicht der Browser-Header
Das HttpServletResponse-Objekt
17.8.1 Automatisches Neuladen
17.8.2
Seiten umlenken
JSP-Direktiven
17.9.1
page-Direktiven im Überblick
17.9.2
Die include-Direktive
17.9.3
MitJSPs Bilder generieren
Aktionen
17.10.1 Die Aktion include
17.10.2 Die Aktion forward
17.10.3 Die Aktion plugin
Kleine Kekse: die Klasse Cookies
17.11.1 Cookies erzeugen und setzen
17.11.2 Cookies vom Servlet einlesen
17.11.3 Cookie-Status ändern
17.11.4 Langlebige Cookies
Sitzungsverfolgung (Session Tracking)
17.12.1 Das mit einer Sitzung verbundene Objekt HttpSession
17.12.2 Werte mit einer Sitzung assoziieren und auslesen
17.12.3 URL-Rewriting
17.12.4 Zusätzliche Informationen
JSTL und weitere Tag-Libraries
17.13.1 Standard Tag Library (JSTL)
17.13.2 JakartaTaglibs Project
^
Servlets
!
17.14.1 Servlets compilieren
17.14.2 Die Servlets in das classes-Verzeichnis bringen
17.14.3 Servlet-Mapping
Der Lebenszyklus eines Servlets
,
17.15.1 Abfragen bei serviceO
17.15.2 Mehrere Anfragen beim Servlet und die Thread-Sicherheit
17.15.3 Das Ende eines Servlets
17.16 Das HttpServletResponse-Objekt
17.16.1 Wir generieren eine Webseite
17.16.2 Binärdaten senden
17.16.3 Noch mehr über Header, die der Server setzt
17.17 Objekte und Dateien per POST verschicken
17.17.1 Datei-Upload
1171
1172
1172
1173
1174
1174
1174
1175
1176
1177
1178
1179
1179
1179
1179
1180
1181
1182
1183
1184
1184
1185
1185
1186
1187
1189
1189
1191
1191
1192
1192
1193
1195
1196
1197
1197
1197
1197
1199
1200
1201
1202
Inhalt
17.18 Servlets und Sessions
17.19 Weiterleiten und Einbinden von Servlet-Inhalten
17.20 Inter-Servlet-Kommunikation
17.20.1 Daten zwischen Servlets teilen
17.21 Internationalisierung
17.21.1 Die Länderkennung des Anfragers auslesen
17.21.2 Länderkennung für die Ausgabe setzen
17.21.3 Westeuropäische Texte senden
17.22 Tomcat: Spezielles
17.22.1 Tomcat als Service unter Windows NT ausführen
17.23 Zum Weiterlesen
1203
1204
1205
1205
1205
1206
1206
1206
1208
1208
1208
18.1
1211
1211
1213
1213
1213
1213
1214
1216
1216
1217
1217
1217
1218
1219
1219
18.2
18.3
18.4
18.5
18.6
18.7
18.8
Entfernte Objekte und Methoden
18.1.1 Stellvertreter helfen bei entfernten Methodenaufrufen
18.1.2
Standards für entfernte Objekte
Java Remote Method Invocation
18.2.1 Zusammenspiel von Server, Registry und Client
18.2.2 Wie die Stellvertreter die Daten übertragen
18.2.3
Probleme mit entfernten Methoden
18.2.4
Nutzen von RMI bei Middleware-Lösungen
18.2.5 Zentrale Klassen und Schnittstellen
18.2.6
Entfernte und lokale Objekte im Vergleich
Auf der Serverseite
18.3.1
Entfernte Schnittstelle deklarieren
18.3.2
Remote-Objekt-Implementierung
18.3.3
Stellvertreterobjekte erzeugen
18.3.4
Der Namensdienst (Registry) „ \
18.3.5
Remote-Objekt-Implementierung exportieren und beim
Namensdienst anmelden
18.3.6
Einfaches Logging
18.3.7 Aufräumen mit dem DGC
Auf der Clientseite
'.
Entfernte Objekte übergeben und laden
18.5.1
Klassen vom RMI-Klassenlader nachladen
Der Server startet die Registry selbst
Weitere Eigenschaften von RMI
18.7.1
RMI und CORBA
18.7.2
RMI über HTTP getunnelt
18.7.3
Automatische Remote-Objekt-Aktivierung
Daily Soap
18.8.1 SOAP-Protokoll
1220
1222
1222
1223
1224
1224
1225
1226
1226
1226
1227
1227
1228
Inhalt
18.8.2
Die technische Realisierung
18.8.3
SOAP-Implementierungen
18.8.4 @WebService in Java 6
18.8.5
Einen Web-Service definieren
18.8.6 Web-Services veröffentlichen
18.8.7
Einen JAX-WS-Client implementieren
18.9 Java Message Service (JMS)
18.10 Zum Weiterlesen
1228
1229
1229
1229
1230
1231
1233
1233
19.1
1235
1235
1235
1237
1237
1239
1239
1240
1243
1244
1244
1244
1246
1246
1247
1247
1248
1249
1249
1250
1252
19.2
19.3
19.4
19.5
19.6
Applets in der Wiege von Java
19.1.1 (J)Applet und Applikationen
19.1.2
Das erste Hallo-Applet
19.1.3
Die Zyklen eines Applets
19.1.4
Parameter an das Applet übergeben
19.1.5 Wie das Applet den Browser-Inhalt ändern kann
19.1.6
Den Ursprung des Applets erfragen
19.1.7
Datenaustausch zwischen Applets
19.1.8 Was ein Applet alles darf
Fehler in Applets finden
19.2.1
Ist Java im Browser aktiviert?
19.2.2
Läuft das Applet unter Netscape oder Microsoft Explorer?
19.2.3
Datenaustausch zwischen Applets und JavaScript
Musik in einem Applet und in Applikationen
19.3.1
Die Arbeit mit AudioCIip
19.3.2 JavaSound API
Webstart
Java Micro Edition
.\
19.5.1
Konfigurationen
19.5.2
Profile
Zum Weiterlesen
EES
20 Datenbankmanagement mit JDBC
20.1
20.2
20.3
Das relationale Modell
Datenbanken und Tools
20.2.1
HSQLDB
20.2.2
Weitere Datenbanken
20.2.3 , Eclipse-Plugins zum Durchschauen von Datenbanken
JDBC und Datenbanktreiber
20.3.1 Treibertypen
20.3.2 JDBC-Versionen
1253
1254
1254
1255
1256
1258
1259
1260
Inhalt
20.4
20.5
20.6
20.7
20.8
20.9
20.10
20.11
20.12
''
f
20.13
x
$
'
r
20.14
e#10.15
Eine Beispielabfrage
20.4.1 Schritte zur Datenbankabfrage
20.4.2
Client für HSQLDB-Datenbank
Mit Java an eine Datenbank andocken
20.5.1
Der Treiber-Manager
,
20.5.2
Den Treiber laden
20.5.3
Eine Aufzählung aller Treiber
20.5.4
Log-Informationen
20.5.5
Verbindung zur Datenbank auf- und abbauen
20.5.6
DataSource
20.5.7
Gepoolte Verbindungen
Datenbankabfragen
20.6.1 Abfragen über das Statement-Objekt
20.6.2
Ergebnisse einer Abfrage in ResultSet
20.6.3
Java und SQL-Datentypen
20.6.4
Unicode in der Spalte korrekt auslesen
20.6.5 wasNullO bei ResultSet
20.6.6 Wie viele Zeilen hat ein ResultSet?
Die Ausnahmen bei JDBC
Elemente einer Datenbank hinzufügen und aktualisieren
20.8.1
Batch-Updates
ResultSets in Bohnen durch RowSet
20.9.1
Die Schnittstelle Row5et
20.9.2
Implementierungen von RowSet
20.9.3
Der Typ CachedRowSet
20.9.4
Der Typ WebRowSet
Vorbereitete Anweisungen (Prepared Statements)
20.10.1 PreparedStatement-Objekte vorbereiten
20.10.2 Werte für die Platzhalter eines PreparedStatement
Transaktionen
Die LOBs (Large Objects)
20.12.1 Einen BLOß besorgen .*.
Metadaten
20.13.1 Metadaten über die Tabelle
20.13.2 Informationen über die Datenbank
Einführung in SQL
20.14.1 Ein Rundgang durch SQL-Anfragen
20.14.2 Datenabfrage mit der Data Query Language (DQL)
20.14.3 Tabellen mit der Data Definition Language (DDL) anlegen
Zum Weiterlesen
1261
1261
1262
1263
1264
1264
1265
1266
1267
1270
1273
1273
1273
1275
1276
1279
1279
1280
1280
1281
1282
1283
1283
1284
1284
1285
1287
1288
1289
1290
1290
1291
1291
1291
1294
1295
1296
1297
1299
1300
33
Inhalt
21 Reflection und Annotationen
21.1
21.2
21.3
21.4
21.5
21.6
22.1
34
1301
Metadaten
21.1.1 Metadaten durch Java-Doc Tags
21.1.2
XDocIet
Metadaten der Klassen mit dem Class-Objekt
21.2.1 An ein Class-Objekt kommen
21.2.2 Was das Class-Objekt beschreibt
21.2.3
Der Name der Klasse
21.2.4
Die Arbeit auf dem Feld
21.2.5
instanceof mit Class-Objekten
21.2.6
Oberklassen finden
21.2.7
Implementierte Interfaces einer Klasse oder eines Interfaces
21.2.8 Modifizierer und die Klasse Modifier
21.2.9
Reflections Gespür für Attribute einer Klasse
21.2.10 Methoden einer Klasse erfragen
21.2.11 Konstruktoren einer Klasse
21.2.12 Annotationen
Objekte manipulieren
21.3.1
Objekte erzeugen
21.3.2
Die Belegung der Variablen erfragen
21.3.3
Eine generische toStringO-Funktion
21.3.4 Variablen setzen
*
21.3.5
Private Attribute ändern
Methoden aufrufen
21.4.1 Statische Methoden aufrufen
21.4.2
Dynamische Methodenaufrufe bei festen Methoden
beschleunigen
\
Informationen und Identifizierung von Paketen
:.
21.5.1
Geladene Pakete
Annotationen
21.6.1
Neue Annotationen definieren
».
21.6.2
Annotationen mit genau einem Element
21.6.3
Beliebige Schlüssel-Werte-Paare
21.6.4 Vorbelegte Elemente
21.6.5 Annotieren von Annotationstypen
21.6.6 Annotationen zur Laufzeit ausgelesen
21.6.7 Mögliche Nachteile von Annotationen
1301
1301
1302
1302
1303
1305
1306
1308
1309
1310
1310
1311
1313
1315
1319
1321
1321
1321
1322
1324
1326
1328
1328
1330
Grundlagen der Komponententechnik
22.1.1
Brauchen wir überhaupt Komponenten?
1345
1345
1330
1332
1332
1332
1332
1333
1334
1337
1338
1340
1342
Inhalt
22.2
22.3
22.4
22.5
22.1.2 Visuelle und nichtvisuelle Komponenten
22.1.3
Komponenten-Technologien von Microsoft
Worauf JavaBeans basieren
Eigenschaften
22.3.1
Einfache Eigenschaften
22.3.2
Boolesche Eigenschaften
22.3.3
Indizierte Eigenschaften
Ereignisse
22.4.1 Multicast und Unicast
22.4.2
Namenskonvention
Weitere Eigenschaften
22.5.1
Gebundene Eigenschaften
22.5.2
Anwendung von PropertyChange bei AWT-Komponenten
22.5.3
Veto-Eigenschaften - dagegen!
23 Logging und Monitoring
23.1
23.2
23.3
23.4
23.5
23.6
23.7
Die Logging-API
Überwachen von Systemzuständen
MBean-Typen, MBean-Server und weitere Begriffe
23.3.1 MXBeans des Systems
Geschwätzige Programme und JConsole
Der MBeanServer
Eine eigene Standard-MBean
Zum Weiterlesen
24 Sicherheitskonzepte
24.1
24.2
24.3
»••
•&
?.
5
24.4
r „.
f
f.
1346
1346
1347
1348
1349
1349
1349
1351
1351
1351
1354
1354
1357
1357
1359
1359
1361
1362
1363
1365
1367
1368
1370
1371
Zentrale Elemente der Java-Sicherheit v
1371
24.1.1 Java Cryptography Architecture und Extension
1371
Der Sandkasten (Sandbox)
1372
Sicherheitsmanager (Security Manager)
1372
24.3.1
Der SicherheitsmanageF bei Applets
1374
24.3.2
Sicherheitsmanager aktivieren
1375
24.3.3
Wie nutzen die Java-Bibliotheken den Sicherheitsmanager?
1376
24.3.4
Rechte durch Policy-Dateien vergeben
1377
24.3.5
Erstellen von Rechte-Dateien mit dem grafischen Policy-Tool .... 1379
24.3.6
Kritik an den Policies
1380
Signierung
1381
24.4.1 Warum signieren?
1381
24.4.2
Digitale Ausweise und die Zertifizierungsstelle
1382
24.4.3
M i t keytool Schlüssel erzeugen
1382
24.4.4 Signieren mitjarsigner
1383
35
Inhalt
24.5
Digitale Unterschriften
24.5.1
DieMDx-Reihe
24.5.2
Secure Hash Algorithm (SHA)
24.5.3
M i t der Security-API einen Fingerabdruck berechnen
24.5.4
Die Klasse MessageDigest
24.5.5
Unix-Crypt
Verschlüsseln von Daten (-strömen)
24.6.1
Den Schlüssel bitte
24.6.2
Verschlüsseln mit Cipher
24.6.3
Verschlüsseln von Datenströmen
Zum Weiterlesen
24.6
24.7
E
25.1
25.2
25.3
25.4
25.5
25.6
26.1
26.2
26.3
1383
1384
1384
1385
1385
1387
1387
1388
1389
1389
1391
.1393
Java Native Interface und Invocation-API
Einbinden einer C-Funktion in ein Java-Programm
25.2.1 Schreiben des Java-Codes
25.2.2
Compilieren des Java-Programms
25.2.3
Erzeugen der Header-Datei
25.2.4
Implementierung der Methode in C
25.2.5
Übersetzen der C-Programme und Erzeugen der dynamischen
Bibliothek
25.2.6 Suchort der dynamischen Bibliothek
Nativ die Stringlänge ermitteln
Erweiterte JNI-Eigenschaften
25.4.1
Klassendefinitionen
25.4.2
Zugriff auf Attribute
Einfache Anbindung von existierenden Bibliotheken
25.5.1
C++ Klassen ansprechen
\
25.5.2
COM-Schnittstellen anzapfen
Zum Weiterlesen
Die Werkzeuge im Überblick
Java-Compiler
26.2.1
Bytecode Compiler javac
26.2.2
Native Compiler
26.2.3 Java-Programme in ein natives ausführbares Programm
. einpacken
Der Java-Interpreter java
26.3.1
DerUnterschiedzwischenjava.exeundjavaw.exe
1393
1394
1394
1395
1395
1396
1397
1399
1399
1400
1400
1401
1403
1403
1403
1403
1405
1405
1405
1406
1407
1407
1408
Inhalt
26.4
26.5
26.6
26.7
26.8
26.9
A
Das Archivformat Jar
26.4.1 Das Dienstprogramm Jar benutzen
26.4.2 Das Manifest
26.4.3 Applikationen in Jar-Archiven starten
26.4.4 Applets in Jar-Archiven
Monitoringprogramme
26.5.1 jps
26.5.2 jstat
26.5.3 jmap
26.5.4 jstack
Ant
26.6.1 Bezug und Installation von Ant
26.6.2 Properties
26.6.3 Externe und vordefinierte Properties
26.6.4 Weitere Ant-Tasks
Decompiler und Obfuscatoren
26.7.1 Der Decompiler Jad
26.7.2 Das Decompilieren erschweren
26.7.3 Das Obfuscator-Programm ProGuard
Sourcecode Beautifier
Zum Weiterlesen
1409
1409
1412
1412
1413
1414
1414
1414
1414
1415
1416
1416
1418
1419
1420
1420
1421
1423
1425
1425
1426
Die Begleit-DVD
1427
Index
1429
\
37
Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Download PDF

advertisement