Java ist auch eine Insel

Java ist auch eine Insel
Christian Ullenboom
Java ist auch eine Insel
Programmieren mit der Java Platform, Standard Edition 6
Galileo Press
Inhalt
Vorwort
39
1.1
1.2
1.3
Der erste Kontakt
Historischer Hintergrund
Eigenschaften von Java
1.3.1
Bytecode und die virtuelle Maschine
1.3.2
Objektorientierung in Java
55
55
57
57
58
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
1.3.12 Java ist Open Source
Die Rolle von Java im Web
1.4.1
Vollwertige Applikationen statt Applets
Die Java Platform Standard Edition (Java SE)
1.5.1
JDKundJRE
,
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 Interpreterprobleme
Entwicklungsumgebungen im Allgemeinen
1.7.1
Die Entwicklungsumgebung Eclipse
1.7.2
NetBeans von Sun
1.7.3
Ein Wort zu Microsoft, Java und zu J++
59
59
60
61
61
62
62
63
64
64
65
65
66
66
66
68
68
68
70
70
71
72
72
73
73
74
74
Eclipse im Speziellen
1.8.1
Eclipse starten
1.8.2
Das erste Projekt anlegen
1.8.3
Eine Klasse hinzufügen
75
75
76
78
1.4
1.5
1.6
1.7
1.8
5
1.9
2.1
2.2
2.3
2.4
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
79
80
80
81
82
82
83
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 formen Programme
2.2.1
Anweisungen
2.2.2
Eine Klasse bildet den Rahmen
85
85
88
88
89
90
91
92
92
93
2.2.3
Die Reise beginnt am mainO
2.2.4
Programme übersetzen und starten
2.2.5
Funktionsaufrufe als Ausdrücke und Anweisungen
2.2.6
printO, printlnO und printfO für Bildschirmausgaben
2.2.7
Modifizierer
2.2.8
Anweisungen und Blöcke
Datentypen
2.3.1
Primitive Datentypen im Überblick
2.3.2
Wahrheitswerte
2.3.3
Variablendeklarationen
2.3.4
Ganzzahlige Datentypen
2.3.5
Die Fließkommazahlen float und double
2.3.6
Alphanumerische Zeichen
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
Die Typanpassung (das Casting)
94
95
95
95
98
99
100
100
102
102
106
108
109
110
111
112
115
115
116
118
119
120
122
Inhalt
2.5
2.6
2.7
2.8
2.9
2.10
3.1
2.4.10
ÜberJadenes Plus für Strings
127
2.4.11 Was C(++)-Programmierer vermissen könnten
128
Bedingte Anweisungen oder Fallunterscheidungen
128
2.5.1
Die if-Anweisung
129
2.5.2
Die Alternative mit einer if/else-Anweisung wählen
130
2.5.3
Die switch-Anweisung bietet die Alternative
133
Schleifen
136
2.6.1
Die while-Schleife
136
2.6.2
Schleifenbedingungen und Vergleiche mit ==
137
2.6.3
Die do-while-Schleife
138
2.6.4
Die for-Schleife
140
2.6.5
Ausbruch planen mit break und Wiedereinstieg mit continue .... 143
2.6.6
break und continue mit Sprungmarken
146
Methoden einer Klasse
147
2.7.1
Bestandteil einer Funktion
148
2.7.2
Beschreibungen in der Java-API
148
2.7.3
Aufruf einer Methode
150
2.7.4
Methoden ohne Parameter
150
2.7.5
Statische Funktionen (Klassenmethoden)
151
2.7.6
Parameter, Argument und Wertübergabe
152
2.7.7
Methoden vorzeitig mit return beenden
153
2.7.8
Nicht erreichbarer Quellcode bei Funktionen
154
2.7.9
Rückgabewerte
154
2.7.10 Methoden überladen
158
2.7.11
Vorgegebener Wert für nicht aufgeführte Argumente
160
2.7.12
Finale lokale Variablen
160
2.7.13
Rekursive Funktionen
162
2.7.14
Die Türme von Hanoi
164
Weitere Operatoren
166
2.8.1
Bitsund Bytes
166
2.8.2
Operationen auf Bit-Ebene
167
2.8.3
Die Verschiebeoperatoren
169
2.8.4
Ein Bit setzen, löschen, umdrehen und testen
171
2.8.5
Bit-Funktionen der Integer-und Long-Klasse
171
2.8.6
Der Bedingungsoperator
172
Einfache Benutzereingaben
174
Zum Weiterlesen
175
Objektorientierte Programmierung
3.1.1
Warum überhaupt OOP?
3.1.2
Wiederverwertbarkeit
177
177
178
7
Inhalt
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
8
Eigenschaften einer Klasse
3.2.1
Die Klasse Point
Die UML (Unified Modeling Language)
3.3.1
Hintergrund und Geschichte zur UML
3.3.2
Wichtige Diagrammtypen der UML
Neue Objekte erzeugen
3.4.1
Anlegen eines Exemplars einer Klasse mit dem new-Operator....
3.4.2
Deklarieren von Referenzvariablen
3.4.3
Zugriff auf Variablen und Methoden mit dem ».«
3.4.4
Konstruktoren nutzen
3.4.5
Die API-Dokumentation
Import und Pakete
Mit Referenzen arbeiten
3.6.1
Die null-Referenz
3.6.2
Zuweisungen bei Referenzen
3.6.3
Funktionen mit nicht-primitiven Parametern
Identität und Gleichheit
3.7.1
Identität von Objekten
179
179
180
180
181
181
182
183
183
186
186
187
188
188
190
191
193
193
3.7.2
Gleichheit und die Methode equalsO
Wrapper-Klassen und Autoboxing
3.8.1
Die Basisklasse Number für numerische Wrapper-Objekte
3.8.2
Die Klasse Integer
3.8.3
Unterschiedliche Ausgabeformate
3.8.4
Autoboxing: Boxing und Unboxing
3.8.5
Die Boolean-Klasse
3.8.6
Die Klassen Double und Float für Fiießkommazahlen
Arrays
3.9.1
Deklaration von Arrays
3.9.2
Arrays mit Inhalt
3.9.3
Die Länge eines Arrays über das Attribut length
3.9.4
Zugriff auf die Elemente über den Index
3.9.5
Array-Objekte erzeugen
3.9.6
Fehler bei Arrays
3.9.7
Vorinitialisierte Arrays
3.9.8
Die erweiterte for-Schleife
3.9.9
Arrays mit nicht-primitiven Elementen
3.9.10
Mehrdimensionale Arrays
3.9.11
Die Wahrheit über die Array-Initialisierung
3.9.12
Mehrere Rückgabewerte
3.9.13
Methode mit variabler Argumentanzahl (Vararg)
3.9.14
Klonen kann sich lohnen-Arrays vermehren
3.9.15
Feldinhalte kopieren
3.9.16
Die Klasse Arrays zum Vergleichen, Füllen und Suchen
193
195
197
198
199
200
202
203
204
205
205
206
206
207
209
210
211
212
213
215
216
217
218
219
220
Inhalt
3.10
3.11
3.12
4.1
4.2
4.3
4.4
4.5
4.6
Der Einstiegspunkt für das Laufzeitsystem mainO
3.10.1
Kommandozeilen-Argumente verarbeiten
227
227
3.10.2
Der Rückgabewert von mainO und System.exitO
Eigene Pakete schnüren
3.11.1
Die package-Anweisung
3.11.2
Importieren von Klassen mit import
3.11.3
Hierarchische Strukturen und das Default-Package
3.11.4
Paketnamen
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
228
228
229
229
229
230
231
231
232
232
Einzelne Zeichen mit der Character-Klasse behandeln
Strings und deren Anwendung
4.2.1
String-Literale als String-Objekte für konstante Zeichenketten ...
4.2.2
String-Länge und Test auf Leerstring
4.2.3
Nach enthaltenen Zeichen und Zeichenfolgen suchen
4.2.4
Gut, dass wir verglichen haben
4.2.5
String-Teile extrahieren
4.2.6
Strings anhängen, Groß-/Kleinschreibung und Leerraum
4.2.7
Suchen und ersetzen
4.2.8
String-Objekte mit Konstruktoren neu anlegen
Konvertieren zwischen Primitiven und Strings
4.3.1
Unterschiedliche Typen in Zeichenketten konvertieren
4.3.2
String in primitives Element konvertieren
Veränderbare Zeichenketten mit StringBuffer/StringBuilder
4.4.1
Anlegen von StringBuffer/StringBuilder-Objekten
4.4.2
Die Länge eines StringBuffer/-Builder-Objekts
4.4.3
Daten anhängen
4.4.4
Zeichenfolgen) setzen, erfragen, löschen und umdrehen
4.4.5
Vergleichen von String/StringBuffer/StringBuilder
4.4.6
hashCodeO bei StringBuffer/StringBuilder
Sprachabhängiges Vergleichen und Normalisierung
4.5.1
Die Klasse Collator
4.5.2
Effiziente interne Speicherung für die Sortierung
4.5.3
Normalisierung
Reguläre Ausdrücke
4.6.1
Die Klassen Pattern und Matcher
4.6.2
M i t MatchResult alle Ergebnisse einsammeln
233
234
236
238
238
240
242
244
246
248
250
250
251
252
252
253
254
255
256
257
257
258
260
262
262
262
264
9
Inhalt
4.7
4.8
4.9
4.10
5.1
5.2
5.3
5.4
5.5
5.6
Zerlegen von Zeichenketten
266
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
Breakiterator 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
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
266
267
268
273
275
278
278
279
279
280
281
281
284
Repräsentation ganzer Zahlen - das Zweierkomplement
Fließkommaarithmetik in Java
5.2.1
Mantisse und Exponent
5.2.2
Spezialwerte Unendlich, Null, NaN
Wertebereich eines Typs und Überlaufkontrolle
5.3.1
Behandlung des Überlaufs
Die Eigenschaften der Klasse Math
5.4.1
Attribute
5.4.2
Absolutwerte und Maximum/Minimum
5.4.3
Winkelfunktionen
5.4.4
Runden von Werten
5.4.5
Wurzel und Exponentialfunktionen
291
291
292
293
295
296
297
297
298
299
300
302
5.4.6
Der Logarithmus
5.4.7
Rest der ganzzahligen Division
5.4.8
Zufallszahlen
Mathe bitte strikt
5.5.1
Strikt Fließkomma mit strictfp
5.5.2
Die Klassen Math und StrictMath
Die Random-Klasse
5.6.1
Objekte aufbauen und der Seed
5.6.2
Zufallszahlen erzeugen
5.6.3
Pseudo-Zufallszahlen in der Normalverteilung
303
303
304
305
305
305
306
306
307
307
285
287
289
Inhalt
5.7
5.8
6.1
6.2
6.3
6.4
6.5
Große Zahlen
5.7.1
Die Klasse Biginteger
5.7.2
Funktionen von Biginteger
5.7.3
Ganz lange Fakultäten
5.7.4
Große Fließkommazahlen mit BigDecimal
5.7.5
M i t MathContext komfortabel die Rechengenauigkeit setzen ....
Zum Weiterlesen
308
308
310
312
313
315
317
Eigene Klassen mit Eigenschaften deklarieren
6.1.1
Attribute deklarieren
6.1.2
Methoden deklarieren
6.1.3
Die this-Referenz
Privatsphäre und Sichtbarkeit
6.2.1
Für die Öffentlichkeit: public
6.2.2
Paketsichtbar
6.2.3
Kein Public Viewing-Passwörter sind privat
6.2.4
Wieso nicht freie Methoden und Variablen für alle?
6.2.5
Privat ist nicht ganz privat: Es kommt darauf an, wer's sieht
6.2.6
Zugriffsmethoden für Attribute deklarieren
6.2.7
Setter und Getter nach der JavaBeans-Spezifikation
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
6.3.5
Statische Eigenschaften und Objekteigenschaften
6.3.6
Statische Variablen zum Datenaustausch
6.3.7
Statische Blöcke als Klasseninitialisierer
Konstanten und Aufzählungen
6.4.1
Konstanten über öffentliche statische finale Variablen
6.4.2
Eincompilierte Belegungen der Klassenvariablen
6.4.3
Typ(un)sicherere Aufzählungen
6.4.4
Aufzählungen mit enum
Objekte anlegen und zerstören
6.5.1
Konstruktoren schreiben
6.5.2
Der Standard-Konstruktor
6.5.3
Parametrisierte und überladene Konstruktoren
6.5.4
Konstruktor nimmt ein Objekt vom eigenen Typ an
(Copy-Konstruktor)
6.5.5
Einen anderen Konstruktor der gleichen Klasse aufrufen
6.5.6
Initialisierung der Objekt-und Klassenvariablen
319
319
320
322
324
324
324
325
327
327
328
329
330
331
331
332
333
333
334
335
336
337
337
338
339
342
342
343
344
346
347
350
11
6.6
6.7
6.8
6.9
6.10
6.5.7
Finale Werte im Konstruktor und in statischen Blöcken setzen ...
6.5.8
Exemplarinitialisierer (Instanzinitialisierer)
6.5.9
Ihr fehlt uns nicht - der Garbage-Collector
6.5.10
Implizit erzeugte String-Objekte
6.5.11
Private Konstruktoren, Utility-Klassen, Singleton, Fabriken
Assoziationen zwischen Objekten
6.6.1
Unidirektionale 1:1-Beziehung
6.6.2
Bidirektionale 1:1-Beziehungen
6.6.3
Unidirektionale 1:n-Beziehung
Vererbung
6.7.1
Vererbung in Java
6.7.2
Spielobjekte modelliert
6.7.3
Einfach- und Mehrfachvererbung
6.7.4
Sichtbarkeit protected
6.7.5
Konstruktoren in der Vererbung und super
6.7.6
Automatische und explizite Typanpassung
6.7.7
Das Substitutionsprinzip
6.7.8
Typen mit dem binären Operator instanceof testen
6.7.9
Methoden überschreiben
6.7.10
M i t super an die Eltern
6.7.11
Kovariante Rückgabetypen
6.7.12
Array-Typen und Kovarianz
6.7.13
Zusammenfassung zur Sichtbarkeit
Dynamisches Binden
6.8.1
Unpolymorph bei privaten, statischen und finalen Methoden ....
6.8.2
Polymorphie bei Konstruktoraufrufen
6.8.3
Finale Klassen
6.8.4
Nicht überschreibbare (finale) Methoden
Abstrakte Klassen und abstrakte Methoden
6.9.1
Abstrakte Klassen
6.9.2
Abstrakte Methoden
Schnittstellen
6.10.1
Deklarieren von Schnittstellen
6.10.2
Implementieren von Schnittstellen
6.10.3
Markierungsschnittstellen
6.10.4
Ein Polymorphie-Beispiel mit Schnittstellen
6.10.5
Die Mehrfachvererbung bei Schnittstellen
6.10.6
Keine Kollisionsgefahr bei Mehrfachvererbung
6.10.7
Erweitern von Interfaces - Subinterfaces
6.10.8
Vererbte Konstanten bei Schnittstellen
6.10.9
Schnittstellenmethoden, die nicht implementiert werden
müssen
6.10.10 Abstrakte Klassen und Schnittstellen im Vergleich
352
353
355
356
357
359
360
360
361
363
363
364
365
366
367
371
373
375
376
378
380
381
382
383
386
387
389
390
391
391
392
395
395
396
398
398
399
402
403
404
406
406
Inhalt
6.11
6.12
6.13
6.14
7.1
7.2
7.3
Geschachtelte (innere) Klassen, Schnittstellen, Aufzählungen
407
6.11.1 Statische innere Klassen und Schnittstellen
408
6.11.2 Mitglieds-oder Elementklassen
409
6.11.3
Lokale Klassen
413
6.11.4 Anonyme innere Klassen
413
6.11.5 this und Vererbung
416
Generische Datentypen
418
6.12.1
Einfache Klassenschablonen
419
6.12.2
Einfache Methodenschablonen
420
6.12.3
Umsetzen der Generics, Typlöschung und Raw-Types
420
6.12.4
Einschränken der Typen
422
6.12.5
Generics und Vererbung, Invarianz
424
6.12.6 Wildcards
425
Die Spezial-Oberklasse Enum
426
6.13.1 Methoden auf Enum-Objekten
426
6.13.2
enum mit eigenen Konstruktoren und Methoden
428
Dokumentationskommentare mit JavaDoc
430
6.14.1
Einen Dokumentationskommentar setzen
431
6.14.2 Mit javadoc eine Dokumentation erstellen
433
6.14.3
HTML-Tags in Dokumentationskommentaren
433
6.14.4 Generierte Dateien
433
6.14.5
Dokumentationskommentare im Überblick
434
6.14.6 JavaDoc und Doclets
435
6.14.7 Veraltete (deprecated) Klassen, Konstruktoren und Methoden .... 436
Schnittstellen in der Anwendung
7.1.1
CharSequence als Beispiel einer Schnittstelle
7.1.2
Die Schnittstelle Iterable
7.1.3
Funktionszeiger
7.1.4
Implementierung einer verketteten Liste
Design-Pattern (Entwurfsmuster)
7.2.1
Design-Pattern
7.2.2
Das Beobachter-Pattern (Observer/Observable)
7.2.3
Ereignisse über Listener
7.2.4
Multicast und Unicast
JavaBean
7.3.1
Properties (Eigenschaften)
7.3.2
Einfache Eigenschaften
7.3.3
Indizierte Eigenschaften
7.3.4
Gebundene Eigenschaften
7.3.5
Veto-Eigenschaften - dagegen!
439
439
441
443
445
446
447
448
451
454
455
455
456
456
457
459
13
Inhalt
8.1
8.2
8.3
8.4
8.5
9.1
9.2
9.3
14
Problembereiche einzäunen
8.1.1
Exceptions in Java mit try und catch
8.1.2
Eine Datei mit RandomAccessFile auslesen
8.1.3
Ablauf einer Ausnahmesituation
8.1.4
Wiederholung abgebrochener Bereiche
8.1.5
throws im Methodenkopf angeben
8.1.6
Abschlussbehandlung mit finally
8.1.7
Nicht erreichbare catch-Klauseln
Die Klassenhierarchie der Fehler
8.2.1
Die Exception-Hierarchie
8.2.2
Oberausnahmen auffangen
8.2.3
Alles geht als Exception durch
8.2.4
RuntimeException muss nicht aufgefangen werden
8.2.5
Harte Fehler: Error
Auslösen eigener Exceptions
8.3.1
M i t throw Ausnahmen auslösen
8.3.2
Neue Exception-Klassen deklarieren
8.3.3
Abfangen und Weiterleiten
8.3.4
Geschachtelte Ausnahmen
8.3.5
Rückgabewerte bei ausgelösten Ausnahmen
Der Stack-Trace
8.4.1
Stack-Trace erfragen
Assertions
8.5.1
Assertions in eigenen Programmen nutzen
8.5.2
Assertions aktivieren
465
465
466
468
468
469
472
475
476
477
477
478
479
480
481
481
483
484
485
486
486
487
488
489
490
Die Java-Klassenphilosophie
9.1.1
Übersicht über die Pakete der Standardbibliothek
Object ist die Mutter aller Oberklassen
9.2.1
Klassenobjekte
491
491
498
498
9.2.2
Objektidentifikation mit toStringO
9.2.3
Objektgleichheit mit equalsO und Identität
9.2.4
Klonen eines Objekts mit cloneO
9.2.5
Hashcodes über hashCodeO liefern
9.2.6
Aufräumen mit finalizeO
9.2.7
Synchronisation
Klassenlader (Class Loader)
9.3.1
Woher die kleinen Klassen kommen
9.3.2
Setzen des Klassenpfades
498
500
504
507
510
512
512
513
514
Inhalt
9.4
9.5
9.6
9.7
9.8
9.9
10.1
10.2
9.3.3
Die wichtigsten drei Typen von Klassenladern
9.3.4
Der java.lang.ClassLoader
9.3.5
Hot Deployment mit dem URL-ClassLoader
9.3.6
Dasjre/lib/endorsed-Verzeichnis
9.3.7
getContextClassLoaderO vom Thread
Die Utility-Klasse System und Properties
9.4.1
Systemeigenschaften der Java-Umgebung
9.4.2
line.separator
9.4.3
Browser-Version abfragen
9.4.4
Property von der Konsole aus setzen
9.4.5
Umgebungsvariablen des Betriebssystems
9.4.6
Einfache Zeitmessung und Profiling
Ausführen externer Programme und Skripte
9.5.1
ProcessBuilder und Prozesskontrolle mit Process
9.5.2
Einen Browser/E-Mail-Client/Editor aufrufen
9.5.3
Ausführen von Skripten
Benutzereinstellungen
9.6.1
Benutzereinstellungen in Windows-Registry oder
XML-Dokumenten
9.6.2
Eintrage einfügen, auslesen und löschen
9.6.3
Auslesen der Daten und Schreiben in anderem Format
9.6.4
Auf Ereignisse horchen
9.6.5
Zugriff auf die gesamte Windows-Registry
Musik abspielen
9.7.1
Die Arbeit mit AudioCIip
9.7.2
Java Sound API
Annotationen
9.8.1
Annotationstypen @Override, @Deprecated,
@SuppressWamings
9.8.2
Common Annotations
9.8.3
Annotationen für Web-Services
9.8.4
Annotationen für XML-Mapping
Zum Weiterlesen
515
515
517
519
520
520
521
522
523
523
524
525
526
526
529
530
532
Nebenläufigkeit
10.1.1 Threads und Prozesse
10.1.2 Wie parallele Programme die Geschwindigkeit steigern
können
10.1.3
Was Java für Nebenläufigkeit alles bietet
Threads erzeugen
10.2.1 Threads über die Schnittstelle Runnable implementieren
543
543
532
534
536
536
536
537
537
538
539
540
541
542
542
542
544
546
546
546
15
3
4
5
6
10.2.2 Thread mit Runnable starten
10.2.3
Der Name eines Threads
10.2.4
Die Klasse Thread erweitern
10.2.5 Wer bin ich?
Die Zustände eines Threads
10.3.1 Threads schlafen
10.3.2
M i t yieldO auf Rechenzeit verzichten
10.3.3
Das Ende eines Threads
10.3.4
UncaughtException Handler für unbehandelte Ausnahmen
10.3.5
Einen Thread höflich mit Interrupt beenden
10.3.6
Der stopO von außen und die Rettung mit ThreadDeath
547
549
550
552
553
553
555
555
556
557
559
10.3.7
Ein Rendezvous mit joinO
560
10.3.8
Barrier und Austausch mit Exchanger
562
10.3.9 Arbeit niederlegen und wieder aufnehmen
563
10.3.10 Priorität
563
10.3.11 Der Thread ist ein Dämon
564
Der Ausführer (Executor) kommt
566
10.4.1
Die Schnittstelle Executor
566
10.4.2
Die Thread-Pools
568
10.4.3
Threads mit Rückgabe über Callable
569
10.4.4 Mehrere Callable abarbeiten
572
10.4.5
Mit ScheduledExecutorService wiederholende Ausgaben
und Zeitsteuerungen
572
Synchronisation über kritische Abschnitte
573
10.5.1
Gemeinsam genutzte Daten
573
10.5.2
Probleme beim gemeinsamen Zugriff und kritische Abschnitte ... 573
10.5.3
Punkte parallel initialisieren
574
10.5.4
i++sieht atomar aus, ist es aber nicht
576
10.5.5
Kritische Abschnitte schützen
577
10.5.6 Schützen mit ReentrantLock
578
10.5.7
Synchronisieren mit synchronized
582
10.5.8
Synchronized-Methoden der Klasse StringBuffer
583
10.5.9 M i t synchronized synchronisierte Blöcke
584
10.5.10 Dann machen wir doch gleich alles synchronisiert!
585
10.5.11 Lock-Freigabe im Fall von Exceptions
586
10.5.12 Mit synchronized nachträglich synchronisieren
587
10.5.13 Monitore sind reentrant - gut für die Geschwindigkeit
588
10.5.14 Synchronisierte Methodenaufrufe zusammenfassen
589
10.5.15 Deadlocks
590
Synchronisation über Warten und Benachrichtigen
592
10.6.1
Die Schnittstelle Condition
593
10.6.2
Beispiel: Erzeuger-Verbraucher-Programm
596
Inhalt
10.6.3
Warten mit waitO und Aufwecken mit notifyO
10.6.4
Falls der Lock fehlt: HlegalMonitorStateException
10.6.5
Semaphor
10.7 Atomare Operationen und frische Werte mit volatile
10.7.1
Der Modifizierer volatile bei Objekt-/Klassenvariablen
10.7.2
Das Paket java.util.concurrent.atomic
10.8 Mit dem Thread verbundene Variablen
10.8.1 ThreadLocal
10.8.2
InheritableThreadLocal
10.9 Gruppen von Threads in einer Thread-Gruppe
10.9.1 Aktive Threads in der Umgebung
10.9.2
Etwas über die aktuelle Thread-Gruppe herausfinden
10.9.3 Threads in einer Thread-Gruppe anlegen
10.9.4 Methoden von Thread und ThreadGroup im Vergleich
10.10 Zeitgesteuerte Abläufe
10.10.1 Die Klassen Timer und TimerTask
10.10.2 Job-Scheduler Quartz
10.11 Einen Abbruch der virtuellen Maschine erkennen
10.12 Zum Weiterlesen
600
601
603
606
606
607
608
609
610
612
612
613
615
618
619
619
621
621
622
11.1
Weltzeit
623
11.2
11.3
Wichtige Datum-Klassen im Überblick
Sprachen der Länder
11.3.1
Sprachen und Regionen über Locale-Objekte
Internationalisierung und Lokalisierung
11.4.1
ResourceBundle-Objekte und Ressource-Dateien
11.4.2
Ressource-Dateien zur Lokalisierung
11.4.3
Die Klasse ResourceBundle
11.4.4
Ladestrategie für ResourceBundle-Objekte
Zeitzonen
11.5.1 Zeitzonen durch die Klasse TimeZone repräsentieren
Die Klasse Date
11.6.1
Objekte erzeugen und Methoden nutzen
Calendarund GregorianCalendar
11.7.1
Die abstrakte Klasse Calendar
11.7.2
Der gregorianische Kalender
11.7.3
Ostertage
11.7.4 Abfragen und Setzen von Datumselementen
Formatieren und Parsen von Datumsangaben
624
624
625
628
629
629
630
631
632
632
634
634
635
636
636
639
641
647
11.8.1
11.8.2
647
647
11.4
11.5
11.6
11.7
11.8
Ausgaben mit printfO
Mit DateFormat und SimpleDateFormat formatieren
17
11.9
12.1
12.2
12.3
11.8.3
Parsen von Datumswerten
Zum Weiterlesen
652
654
Datenstrukturen und die Collection-API
12.1.1
Designprinzip mit Schnittstellen, abstrakten Klassen,
konkreten Klassen
12.1.2
Die Basis-Schnittstellen Coilection und Map
12.1.3
Das erste Programm mit Container-Klassen
12.1.4
Die Schnittstelle Coilection
12.1.5
Schnittstellen, die Coilection erweitern, und Map
12.1.6
Konkrete Container-Klassen
12.1.7 Welche Klasse nehmen?
12.1.8
Generische Datentypen in der Collection-API
12.1.9
Die Schnittstelle Iterable und das erweiterte for
M i t einem Iterator durch die Daten wandern
12.2.1
Die Schnittstellen Enumeration und Iterator
12.2.2
Iteratoren von Sammlungen und das erweiterte for
12.2.3
Fail-Fast Iterator und die ConcurrentModificationException
Listen
12.3.1 ArrayList oder LinkedList? Speicherung im Feld oder in einer
verketteten Liste
12.3.2
Die Schnittstelle List
12.3.3
ArrayList
12.3.4
LinkedList
655
12.3.5
12.3.6
12.4
12.5
12.6
Der Feld-Adapter Arrays.asListO
toArrayO von Coilection verstehen - die Gefahr einer Falle
erkennen
12.3.7
Primitive Elemente in den Collection-Datenstrukturen
Vergleichen von Objekten
12.4.1
Die Schnittstellen Comparator und Comparable
12.4.2
Algorithmen mit Such-und Sortiermöglichkeiten
12.4.3
Den größten und kleinsten Wert einer Coilection finden
12.4.4 Sortieren
Mengen (Sets)
12.5.1
HashSet
12.5.2 TreeSet - die Menge durch Bäume
12.5.3
LinkedHashSet
Stack (Kellerspeicher, Stapel)
12.6.1
Die Methoden von Stack
12.6.2
Ein Stack ist ein Vector - aha!
656
657
657
658
660
662
663
663
664
665
665
667
669
669
670
670
677
680
681
682
684
685
685
687
688
689
692
694
695
698
698
699
699
Inhalt
12.7
Queues (Schlangen) und Deques
12.7.1
Die Schnittstelle Queue
12.7.2
Blockierende Queues und Prioritätswarteschlangen
12.7.3
Deque-Klassen
12.8 Assoziative Speicher
12.8.1
Die Klassen HashMap und TreeMap
12.8.2
Einfügen und Abfragen der Datenstruktur
12.8.3
Die Bedeutung von equalsO, hashCodeO und
IdentityHashMap
12.8.4
Elemente im Assoziativspeicher müssen unveränderbar
bleiben
12.8.5 Aufzählungen und Sichten auf den Assoziativspeicher
12.8.6
Der Gleichheitstest, Hash-Wert und Klon einer Hash-Tabelle
12.8.7
Die Arbeitsweise einer Hash-Tabelle
12.8.8 Multi-Maps
12.9
Die Properties-Klasse
12.9.1
Properties setzen und lesen
12.9.2
Properties verketten
12.9.3
Eigenschaften ausgeben
12.9.4
Hierarchische Eigenschaften
12.9.5
Properties speichern
12.9.6
Klassenbeziehungen: Properties und Hashtable
12.10 Algorithmen in Collections
12.10.1 Listenoperationen: Ersetzen, Kopieren, Füllen, Umdrehen,
Rotieren, Durchmischen
12.10.2 M i t der Halbierungssuche nach Elementen fahnden
12.10.3 Nicht-änderbare Datenstrukturen
12.10.4 Häufigkeit eines Elements
12.10.5 nCopiesO
12.10.6 Singletons
12.11 Synchronisation der Datenstrukturen
12.11.1 Lock-Free-Algorithmen aus java.util.concurrent
12.11.2 Wrapper zur Synchronisation
12.11.3 CopyOnWriteArrayList und CopyOnWriteArraySet
12.12 Die Klasse BitSetfür Bitmengen
12.12.1 Ein BitSet anlegen, füllen und erfragen
12.12.2 Mengenorientierte Operationen
12.12.3 Funktionsübersicht
12.12.4 Primzahlen in einem BitSet verwalten
700
700
701
702
702
702
704
707
709
709
712
712
715
715
715
715
717
717
717
719
719
720
721
723
723
723
724
725
725
726
727
727
727
728
729
730
19
Inhalt
13.1
13.2
13.3
13.4
20
Datei und Verzeichnis
13.1.1
Dateien und Verzeichnisse mit der Klasse File
13.1.2
Verzeichnis oder Datei? Existiert es?
13.1.3
Verzeichnis-und Dateieigenschaften/-attribute
13.1.4 Wurzelverzeichnis, Laufwerksnamen, Plattenspeicher
13.1.5
Umbenennen und Verzeichnisse anlegen
13.1.6 Verzeichnisse listen und Dateien filtern
13.1.7
Dateien berühren, neue Dateien anlegen, temporäre Dateien ....
13.1.8
Dateien und Verzeichnisse löschen
13.1.9 Verzeichnisse nach Dateien iterativ durchsuchen
13.1.10 URL-und URI-Objekte aus einem File-Objekt ableiten
13.1.11 M i t Locking Dateien sperren
13.1.12 Sicherheitsprüfung
13.1.13 Mime-Typen mit dem JavaBeans Activation Framework (JAF) ....
13.1.14 Zugriff auf SMB-Server mit jCIFS
Dateien mit wahlfreiem Zugriff
13.2.1
Ein RandomAccessFile zum Lesen und Schreiben öffnen
13.2.2
Aus dem RandomAccessFile lesen
13.2.3
Schreiben mit RandomAccessFile
13.2.4
Die Länge des RandomAccessFile
13.2.5
Hin und her in der Datei
13.2.6 Wahlfreier Zugriff und Pufferung mit Unified I/O
Stream-Klassen und Reader/Writer am Beispiel von Dateien
13.3.1 M i t dem FileWriter Texte in Dateien schreiben
13.3.2
Zeichen mit der Klasse FileReader lesen
13.3.3
Kopieren mit FileOutputStream und FilelnputStream
13.3.4
Das FileDescriptor-Objekt
Basisklassen für die Ein-/Ausgabe
13.4.1
Die abstrakten Basisklassen
13.4.2
Übersicht über Ein-/Ausgabeklassen
13.4.3
Die abstrakte Basisklasse OutputStream
13.4.4
Die Schnittstellen Closeable und Flushable
13.4.5
Ein Datenschlucker
13.4.6
Die abstrakte Basisklasse InputStream
13.4.7
Ressourcen wie Grafiken aus dem Klassenpfad
und aus Jar-Archiven laden
13.4.8
Ströme mit SequencelnputStream zusammensetzen
13.4.9
Die abstrakte Basisklasse Writer
13.4.10 Die Schnittstelle Appendable
13.4.11 Die abstrakte Basisklasse Reader
732
732
734
735
737
740
740
743
745
746
747
747
748
748
749
750
751
751
754
754
754
755
755
756
758
759
762
762
762
763
764
766
766
767
768
769
770
772
773
Inhalt
13.5
Formatierte Textausgaben
13.5.1
Die Klassen PrintWriter und PrintStream
13.5.2
System.out, System.err und System.in
13.5.3
Geschützte Passwort-Eingaben mit der Klasse Console
13.6 Schreiben und Lesen aus Strings und Byte-Feldern
13.6.1 M i t dem StringWriter ein String-Objekt füllen
13.6.2
CharArrayWriter
13.6.3
StringReader und CharArrayReader
13.6.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
13.6.5
Mit ByteArraylnputStream aus einem Byte-Feld lesen
13.7
Datenströme filtern und verketten
13.7.1
Streams als Filter verketten
13.7.2
Gepufferte Ausgaben mit BufferedWriter und
BufferedOutputStream
13.7.3
Gepufferte Eingaben mit BufferedReader und
BufferedlnputStream
13.7.4
LineNumberReader zählt automatisch Zeilen mit
13.7.5
Daten mit der Klasse PushbackReader zurücklegen
13.7.6
DataOutputStream/DatalnputStream
13.7.7
Basisklassen für Filter
13.7.8
Die Basisklasse FilterWriter
13.7.9
Ein LowerCaseWriter
13.7.10 Eingaben mit der Klasse FilterReader filtern
13.8 Vermittler zwischen Byte-Streams und Unicode-Strömen
13.8.1
Datenkonvertierung durch den OutputStreamWriter
13.8.2
Automatische Konvertierungen mit dem InputStreamReader
13.9
Kommunikation zwischen Threads mit Pipes
13.9.1
PipedOutputStream und PipedlnputStream
13.9.2
PipedWriter und PipedReader
13.10 Datenkompression
13.10.1 Java-Unterstützung beim Komprimieren und
Zusammenpacken
13.10.2 Datenströme komprimieren
13.10.3 Zip-Archive
13.10.4 Jar-Archive
13.11 Prüfsummen
13.11.1 Die Schnittstelle Checksum
13.11.2 Die Klasse CRC32
13.11.3 Die Adler32-Klasse
13.12 Persistente Objekte und Serialisierung
13.12.1 Objekte mit der Standard-Seriaiisierung speichern und lesen
13.12.2 Zwei einfache Anwendungen der Serialisierung
13.12.3 Die Schnittstelle Serializable
774
775
779
781
781
782
783
784
785
786
786
787
787
789
791
792
795
795
795
796
798
799
799
800
801
801
803
805
806
806
810
816
816
817
818
819
820
821
823
824
21
Inhalt
13.12.4 Nicht serialisierbare Attribute aussparen
13.12.5 Das Abspeichern selbst in die Hand nehmen
13.12.6 Tiefe Objektkopien
13.12.7 Versionenverwaltung und die SUID
13.12.8 Wie die ArrayList serialisiert
13.12.9 Probleme mit der Serialisierung
13.12.10Serialisieren in XML-Dateien
13.12.11 JavaBeans Persistence
13.12.12 XStream
13.13 Tokenizer
13.13.1 StreamTokenizer
13.13.2 CSV-(Comma Separated Values-)Dateien verarbeiten
13.14 Zum Weiterlesen
14.1
14.2
14.3
14.4
14.5
22
826
827
831
832
834
835
835
836
838
838
838
841
842
Auszeichnungssprachen
843
14.1.1
Die Standard Generalized Markup Language (SGML)
843
14.1.2
Extensible Markup Language (XML)
844
Eigenschaften von XML-Dokumenten
844
14.2.1
Elemente und Attribute
844
14.2.2
Beschreibungssprache für den Aufbau von XML-Dokumenten ... 846
14.2.3
Schema - eine Alternative zu DTD
849
14.2.4
Namensraum (Namespace)
852
14.2.5
XML-Applikationen
853
Die Java-APIs für XML
853
14.3.1
Das Document Object Model (DOM)
854
14.3.2
Simple API for XML Parsing (SAX)
854
14.3.3
Pull-API StAX
854
14.3.4 Java Document Object Model (JDOM)
855
14.3.5 JAXP als Java-Schnittstelle zu XML
855
14.3.6
DOM-Bäume einlesen mit JAXP
856
Serielle Verarbeitung mit StAX
856
14.4.1
Unterschiede der Verarbeitungsmodelle
857
14.4.2
XML-Dateien mit dem Cursor-Verfahren lesen
858
14.4.3
XML-Dateien mit dem Iterator-Verfahren verarbeiten
860
14.4.4 M i t Filtern arbeiten
861
14.4.5
XML-Dokumente schreiben
862
Serielle Verarbeitung von XML mit SAX
865
14.5.1
Schnittstellen von SAX
865
14.5.2
SAX-Parser erzeugen
866
14.5.3
Die wichtigsten Methoden der Schnittstelle ContentHandler
866
14.5.4
ErrorHandler und EntityResolver
868
Inhalt
14.6
XML-Dateien mit JDOM verarbeiten
14.6.1 JDOM beziehen
14.6.2
Paketübersicht
14.6.3
Die Document-Klasse
14.6.4
Eingaben aus der Datei lesen
14.6.5
Das Dokument im XML-Format ausgeben
14.6.6
Der Dokumenttyp
14.6.7
Elemente
14.6.8 Zugriff auf Elementinhalte
14.6.9
Liste mit Unterelementen erzeugen
14.6.10 Neue Elemente einfügen und ändern
14.6.11 Attributinhalte lesen und ändern
14.6.12 XPath
14.7 Transformationen mit XSLT
14.7.1 Templates und XPath als Kernelemente von XSLT
14.7.2
Umwandlung von XML-Dateien mit JDOM und JAXP
14.8 Java Architecture for XML Binding (JAXB)
14.8.1
Beans für JAXB aufbauen
14.8.2 JAXBContext und die Marshaller/Unmarshaller
14.9
HTML-Dokumente einlesen
14.10 Zum Weiterlesen
869
869
870
871
872
873
873
874
876
879
879
882
884
887
887
889
890
890
892
893
894
15.1
895
895
896
899
899
900
900
902
903
903
904
905
905
906
909
909
911
913
913
15.2
15.3
15.4
15.5
Das Abstract Window Toolkit und Swing
15.1.1 Abstract Window Toolkit (AWT)
15.1.2 Java Foundation Classes
15.1.3
Was Swing von AWT unterscheidet
15.1.4
Die Klasse Toolkit
Fenster unter grafischen Oberflächen
15.2.1
Swing-Fenster darstellen
15.2.2 AWT-Fenster darstellen
15.2.3
Sichtbarkeit des Fensters
15.2.4
Größe und Position des Fensters verändern
15.2.5
Unterklassen der Fenster-Klassen bilden
15.2.6
Fenster-und Dialog-Dekoration
15.2.7
Dynamisches Layout während einer Größenänderung
Beschriftungen (JLabel)
15.3.1 Mehrzelliger Text, HTML in der Darstellung
Icon und Imagelcon für Bilder auf Swing-Komponenten
15.4.1
Die Schnittstelle Icon
Es tut sich was - Ereignisse beim AWT
15.5.1
Die Klasse AWTEvent
23
15.5.2
Events auf verschiedenen Ebenen
15.5.3
Swings Ereignisquellen und Horcher (Listener)
15.5.4
Listener implementieren
15.5.5
Listener bei dem Ereignisauslöser anmelden/abmelden
15.5.6 Aufrufen der Listener im AWT-Event-Thread
15.5.7 Adapterklassen nutzen
15.5.8
Innere Mitgliedsklassen und innere anonyme Klassen
15.6 Schaltflächen
15.6.1
Normale Schaltflächen (JButton)
15.6.2
Der aufmerksame ActionListener
15.6.3
Basisklasse AbstractButton
15.6.4 Wechselknopf (JToggleButton)
15.7 Swing Action
15.7.1 javax.swing.Action
15.7.2
Eigenschaften der Action-Objekte
15.8 JComponent und Component als Basis aller Komponenten
15.8.1 Tooltips
15.8.2
Rahmen (Border)
15.8.3
Fokus und Navigation
15.8.4
Ereignisse jeder Komponente
15.8.5
Die Größe und Position einer Komponente
15.8.6
Komponenten-Ereignisse
15.8.7
Hinzufügen von Komponenten
15.8.8
Ul-Delegate - der wahre Zeichner
15.8.9
Undurchsichtige (opak) Komponente
15.8.10 Properties und Listener für Änderungen
15.9 Container
15.9.1 Standardcontainer (JPanel)
15.9.2
Bereich mit automatischen Rollbalken (JScrollPane)
15.9.3
Reiter (JTabbedPane)
15.9.4 Teilung-Komponente (JSplitPane)
15.10 Alles Auslegungssache: die Layoutmanager
15.10.1 Übersicht über Layoutmanager
15.10.2 Zuweisen eines Layoutmanagers
15.10.3 Im Fluss mit FlowLayout
15.10.4 M i t BorderLayout in allen Himmelsrichtungen
15.10.5 Rasteranordnung mit GridLayout
15.10.6 Der GridBagLayout-Manager
15.10.7 Null-Layout
15.10.8 BoxLayout
15.10.9 Weitere Layoutmanager
914
916
916
919
919
920
922
923
923
925
927
929
929
930
930
931
931
932
935
936
938
939
940
940
943
943
944
944
945
946
947
947
947
948
949
951
954
955
960
961
962
Inhalt
15.11 Rollbalken und Schieberegler
15.11.1 Schieberegler (JSlider)
15.11.2 Rollbalken (JScrollBar)
15.12 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
15.12.1 Kontrollfelder (JCheckBox)
15.12.2 ItemSelectable, Itemüstener und das ItemEvent
15.12.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
15.13 Fortschritte bei Operationen überwachen
15.13.1 Fortschrittsbalken (JProgressBar)
15.13.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
15.14 Menüs und Symbolleisten
15.14.1 Die Menüleisten und die Einträge
15.14.2 Menüeintrage definieren
15.14.3 Einträge durch Action-Objekte beschreiben
15.14.4 M i t der Tastatur: Mnemonics und Shortcut
15.14.5 DerTastatur-Shortcut(Accelerator)
15.14.6 Tastenkürzel (Mnemonics)
15.14.7 Symbolleisten alias Toolbars
15.14.8 Popup-Menüs
15.14.9 System-Tray nutzen
15.15 Das Model-View-Controller-Konzept
15.16 Auswahlmenüs, Listen und Spinner
15.16.1 Auswahlmenü (JComboBox)
15.16.2 Zuordnung einer Taste mit einem Eintrag
15.16.3 Datumsauswahl
15.16.4 Listen (JList)
15.16.5 Drehfeld (JSpinner)
15.17 Texteingabefelder
15.17.1 Text in einer Eingabezeile
15.17.2 Die Oberklasse der Text-Komponenten (JTextComponent)
15.17.3 Geschützte Eingaben (JPasswordField)
15.17.4 Validierende Eingabefelder (JFormattedTextField)
15.17.5 Einfache mehrzellige Textfelder (JTextArea)
15.17.6 Editor-Klasse (JEditorPane)
15.18 Tabellen (JTable)
15.18.1 Ein eigenes Tabellen-Model
15.18.2 Basisklasse für eigene Modelle (AbstractTableModel)
15.18.3 Vorgefertigtes Standard-Modell (DefaultTableModel)
15.18.4 Ein eigener Renderer für Tabellen
15.18.5 Zeil-Editoren
15.18.6 Größe und Umrandung der Zellen
15.18.7 Spalteninformationen
962
962
964
968
968
971
972
974
974
976
976
977
978
980
981
981
983
983
986
989
990
992
992
996
997
997
1002
1004
1004
1005
1006
1006
1008
1010
1013
1014
1015
1018
1019
1023
1024
1024
25
Inhalt
15.19
15.20
15.21
15.22
15.23
15.24
15.25
15.26
15.27
26
15.18.8 Tabellenkopf von Swing-Tabellen
1025
15.18.9 Selektionen einer Tabelle
1025
15.18.10 Automatisches Sortieren und Filtern mit RowSorter
1026
15.18.11 Ein professionelles Tabellenlayout mit JGrid
1027
Bäume (JTree)
1028
15.19.1 JTree und sein TreeModel und TreeNode
1028
15.19.2 Selektionen bemerken
1029
15.19.3 Das TreeModel von JTree
1030
JRootPane, JLayeredPane und JDesktopPane
1032
15.20.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane) ... 1032
15.20.2 JLayeredPane
1033
15.20.3 JDesktopPane und die Kinder JlnternalFrame
1033
Dialoge und Window-Objekte
1035
15.21.1 JWindowundJDialog
1035
15.21.2 Modal oder nicht-modal
1036
15.21.3 Standarddialoge mit JOptionPane
1036
15.21.4 Der Farbauswahldialog JColorChooser
1038
15.21.5 Der Dateiauswahldialog
1040
Flexibles Java-Look & Feel
1044
15.22.1 L & F global setzen
1044
15.22.2 UlManager
1044
15.22.3 Verbessern des Aussehens unter Windows mit JGoodies Looks ... 1046
Die Zwischenablage (Clipboard)
1046
15.23.1 Clipboard-Objekte
1046
15.23.2 Auf den Inhalt zugreifen mit Transferable
1047
15.23.3 DataFlavor ist das Format der Daten in der Zwischenablage
1048
15.23.4 Einfügungen in der Zwischenablage erkennen
1050
15.23.5 Drag & Drop
1050
Undo durchführen
1051
AWT, Swing und die Threads
1053
15.25.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
1053
15.25.2 Swing ist nicht Thread-sicher
1054
15.25.3 Swing-Elemente mit invokeLaterO und invokeAndWaitO
bedienen
1055
15.25.4 SwingWorker
1056
15.25.5 Eigene Ereignisse in die Queue setzen
1058
15.25.6 Auf alle Ereignisse hören
1059
Barrierefreiheit mit der Java Accessibility API
1059
Benutzerinteraktionen automatisieren
1060
15.27.1 Automatisch in die Tasten hauen
1061
15.27.2 Mausoperationen
1062
15.27.3 Methoden zur Zeitsteuerung
1062
Inhalt
15.27.4 Screenshots
15.27.5 Mouselnfo und Pointerlnfo
15.28 Zeitliches Ausführen mit dem javax.swing.Timer
15.29 Alternativen zu AWT und Swing
15.29.1 XML-Beschreibungen der Oberfläche: Swixml, XUL/Luxor
15.29.2 SWT (Standard Widget Toolkit)
15.30 Zum Weiterlesen
1063
1063
1064
1064
1065
1065
1067
16.1
1069
1069
1071
16.2
16.3
16.4
16.5
Grundlegendes zum Zeichnen
16.1.1
Die paintO-Methode für das AWT-Frame
16.1.2
Zeichen von Inhalten mit JFrame
16.1.3
Auffordern zum Neuzeichnen mit repaintO
1072
16.1.4 Grundbegriffe: Koordinaten, Punkte, Pixel
1073
16.1.5
Die ereignisorientierte Programmierung ändert Fensterinhalte ... 1073
16.1.6 Java2D-API
1074
Einfache Zeichenfunktionen
1075
16.2.1
Linien
1075
16.2.2
Rechtecke
1076
16.2.3
Ovale und Kreisbögen
1077
16.2.4
Polygone und Polylines
1077
Zeichenketten schreiben und Fonts
1080
16.3.1
Zeichenfolgen schreiben
1080
16.3.2
Die Font-Klasse
1081
16.3.3
Einen neuen Font aus einem gegebenen Font ableiten
1082
16.3.4 Zeichensätze des Systems ermitteln
1083
16.3.5
Neue TrueType-Fonts in Java nutzen
1084
16.3.6
Font-Metadaten durch FontMetrics
1085
Geometrische Objekte
1088
16.4.1
Die Schnittstelle Shape
1089
16.4.2
Kreisförmiges
1090
16.4.3
Kurviges
1091
16.4.4 Area und die konstruktive Flächengeometrie
1091
16.4.5
Pfade
1091
16.4.6
Punkt in Form, Schnitt von Linien, Abstand Punkt/Linie und
Weiteres
1094
Das Innere und Äußere einer Form
1095
16.5.1
Farben und die Paint-Schnittstelle
1095
16.5.2
Farben mit der Klasse Color
1096
16.5.3
Die Farben des Systems über SystemColor
1101
16.5.4
Composite und Xor
1104
16.5.5
Dicke und Art der Linien von Formen bestimmen über Stroke ... 1105
27
Inhalt
16.6
Bilder
16.6.1
16.6.2
16.6.3
16.6.4
16.6.5
16.6.6
16.6.7
16.6.8
16.6.9
16.6.10
16.6.11
Eine Übersicht über die Bilder-Bibliotheken
Bilder mit ImagelO lesen
Ein Bild zeichnen
Programm-Icon/Fenster-Icon setzen
Splash-Screen
Bilder im Speicher erzeugen
Pixel für Pixel auslesen und schreiben
Bilder skalieren
Schreiben mit ImagelO
Asynchrones Laden mitgetImageO und dem MediaTracker
Selbst definierte Cursor
16.6.12 Volatilelmage
16.7
1109
1110
1111
1113
1116
1117
1117
1119
1121
1123
1126
1127
1129
Weitere Eigenschaften von Graphics
16.7.1
Eine Kopie von Graphics erstellen
16.7.2
Koordinatensystem verschieben
16.7.3
Beschnitt (Clipping)
16.8 Zeichenhinweise durch RenderingHints
16.9 Transformationen mit einem AffineTransform-Objekt
16.10 Drucken
16.10.1 Drucken der Inhalte
16.10.2 Bekannte Drucker
16.11 Grafikverarbeitung ohne grafische Oberfläche
16.11.1 Xvfb-Server
16.11.2 Pure Java AWT Toolkit (PJA)
16.12 Zum Weiterlesen
1129
1129
1130
1130
1134
1134
1136
1137
1138
1139
1140
1140
1141
17.1
1143
1144
1144
1144
1144
1147
1148
1150
1151
1151
1153
1154
1155
17.2
17.3
Grundlegende Begriffe
17.1.1
Internet-Standards und RFC
URI und URL
17.2.1
URI
17.2.2
Die Klasse URL
17.2.3
Informationen über eine URL
17.2.4
Der Zugriff auf die Daten über die Klasse URL
17.2.5 Verbindungen durch einen Proxy-Server
Die Klasse URLConnection
17.3.1 Methoden und Anwendung von URLConnection
17.3.2
Protokoll- und Content-Handler
17.3.3
Im Detail: vom URL zur URLConnection
17.3.4
Der Protokoll-Handler für Jar-Dateien
Inhalt
17.3.5
17.4
17.5
17.6
17.7
Passwort-geschützte Seiten mit Basic Authentication/
Proxy-Authentifizierung
Mit GET und POST Daten übergeben
17.4.1
Kodieren der Parameter für Serverprogramme
17.4.2
Eine Suchmaschine ansprechen
Host- und IP-Adressen
17.5.1
Lebt der Rechner?
17.5.2
Das Netz ist Klasse
17.5.3
IP-Adresse des lokalen Hosts
Networkinterface
Mit dem Socket zum Server
17.7.1
Das Netzwerk ist der Computer
17.7.2
Sockets
17.7.3
Eine Verbindung zum Server aufbauen
17.7.4 Server unter Spannung: die Ströme
17.7.5
Die Verbindung wieder abbauen
17.7.6
Informationen über den Socket
17.7.7
Reine Verbindungsdaten über SocketAddress
17.8 Client/Server-Kommunikation
17.8.1 Warten auf Verbindungen
17.8.2
Ein Multiplikationsserver
17.8.3
Blockierendes Lesen
17.8.4 Von außen erreichbar sein
17.9 Apache Jakarta Commons HttpClient und Net
17.9.1 Jakarta Commons HttpClient
17.9.2 Jakarta Commons Net
17.10 Arbeitsweise eines Webservers
17.10.1 Das Hypertext Transfer Protocol (HTTP)
17.10.2 Anfragen an den Server
17.10.3 Die Antworten vom Server
17.10.4 Webserver mit com.sun.net.httpserver.HttpServer
17.11 Datagram-Sockets
17.11.1 Die Klasse DatagramSocket
17.11.2 Datagramme und die Klasse Datagram Packet
17.11.3 Auf ein hereinkommendes Paket warten
17.11.4 Ein Paket zum Senden vorbereiten
17.11.5 Methoden der Klasse Datagram Packet
17.11.6 Das Paketsenden
17.12 E-Mail
17.12.1 Wie eine E-Mail um die Welt geht
17.12.2 Das Simple Mail Transfer Protocol und RFC 822
17.12.3 POP (Post Office Protocol)
1157
1159
1159
1160
1161
1163
1164
1164
1165
1166
1166
1166
1167
1168
1169
1169
1171
1172
1173
1174
1176
1177
1178
1178
1179
1180
1180
1180
1183
1186
1187
1189
1190
1191
1192
1193
1193
1194
1195
1195
1196
29
Inhalt
17.12.4 Die JavaMail API
17.12.5 E-Mails mittels POP3 abrufen
17.12.6 E-Mails versenden
17.12.7 Ereignisse und Suchen
17.13 Tieferliegende Netzwerkeigenschaften
17.13.1 Internet Control Message Protocol (ICMP)
17.13.2 MAC-Adresse
17.14 Zum Weiterlesen
1196
1197
1199
1202
1203
1203
1203
1204
18.1
1205
1205
1207
1207
1207
1207
1208
1210
1210
1211
1211
1211
1212
1213
1213
18.2
18.3
18.4
18.5
18.6
18.7
30
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
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
Weitere Eigenschaften von RMI
18.6.1
RMI und CORBA
18.6.2
RMI über HTTP getunnelt
18.6.3
Automatische Remote-Objekt-Aktivierung
Daily Soap
18.7.1
SOAP-Protokoll
18.7.2
Die technische Realisierung
18.7.3
SOAP-Implementierungen
18.7.4
@WebService in Java 6
1215
1217
1218
1218
1219
1220
1220
1220
1220
1221
1222
1222
1223
1223
1224
Inhalt
18.8
18.9
19.1
19.2
18.7.5
Einen Web-Service definieren
18.7.6 Web-Services veröffentlichen
18.7.7
Einen JAX-WS-Client implementieren
JavaMessage Service (JMS)
Zum Weiterlesen
1224
1225
1225
1227
1228
Dynamisch generierte Webseiten
19.1.1 Was sind Servlets?
19.1.2 Was sind JavaServer Pages?
Servlets und JSPs mit Tomcat entwickeln
19.2.1
Servlet-Container
19.2.2
Entwicklung der Servlet/JSP-Spezifikationen
19.2.3
Webserver mit Servlet-Funktionalität
1229
1229
1230
1231
1231
1232
1232
19.2.4
1232
19.2.5
19.2.6
19.2.7
19.3
19.4
19.5
19.6
19.7
19.8
Tomcat
Ablageort für eigene JSP-Seiten
Web-Applikationen
Zuordnung von Web-Applikationen zu physikalischen
Verzeichnissen
19.2.8
M i t dem WTP ein Web-Projekt entwickeln
Statisches und Dynamisches
19.3.1
Statischer Template-Code
19.3.2
Dynamische Inhalte
19.3.3
Kommentare
Die Expression Language (EL)
19.4.1
Operatoren der EL
19.4.2
Literale
19.4.3
Implizite EL-Objekte
Formulardaten
Auf Beans zurückgreifen
19.6.1
Beans in JSP-Seiten anlegen
19.6.2
Properties einer Bean im EL-Ausdruck erfragen
19.6.3
Properties mit <jsp:setProperty> setzen
19.6.4
Bean-Klasse zum Testen von E-Mail-Adressen
19.6.5
Parameterwerte in Bean übertragen
JSP Tag-Libraries
19.7.1
Standard Tag Library (JSTL)
19.7.2 Jakarta Taglibs Project
Einbinden und Weiterleiten
19.8.1
Einbinden von Inhalten
19.8.2
Forward und Redirect
19.8.3
Applets einbinden
1233
1234
1235
1235
1236
1236
1237
1237
1237
1238
1238
1239
1239
1240
1240
1241
1241
1242
1243
1243
1244
1247
1248
1248
1250
1250
31
Inhalt
19.9
Skripten
19.9.1
19.9.2
19.9.3
19.9.4
19.10
19.11
19.12
19.13
19.14
20.1
20.2
20.3
32
von JSPs
Scriptlets
JSP-Ausdrücke
JSP-Deklarationen
Quoting
1251
1251
1251
1252
1252
19.9.5
Entsprechende XML-Tags
19.9.6
Implizite Objekte für Scriptlets und JSP-Ausdrücke
JSP-Direktiven
19.10.1 page-Direktiven im Überblick
19.10.2 MitJSPs Bilder generieren
Sitzungsverfolgung (Session Tracking)
19.11.1 Lösungen für Sitzungsverfolgung
19.11.2 Auf Session-Dateien zurückgreifen
Servlets
19.12.1 Servlets compilieren
19.12.2 Servlet-Mapping
19.12.3 Der Lebenszyklus eines Servlets
19.12.4 Mehrere Anfragen beim Servlet und die Thread-Sicherheit
19.12.5 Servlets und Sessions
19.12.6 Weiterleiten und Einbinden von Servlet-Inhalten
Internationalisierung
19.13.1 Die Länderkennung des Anfragers auslesen
19.13.2 Länderkennung für die Ausgabe setzen
19.13.3 Westeuropäische Texte senden
Zum Weiterlesen
1252
1253
1253
1254
1255
1256
1257
1258
1258
1259
1260
1261
1261
1261
1262
1263
1264
1264
1264
1265
Applets in der Wiege von Java
20.1.1
(J)Applet und Applikationen
20.1.2
Das erste Hallo-Applet
20.1.3
Die Zyklen eines Applets
20.1.4
Parameter an das Applet übergeben
20.1.5
Wie das Applet den Browser-Inhalt ändern kann
20.1.6
Den Ursprung des Applets erfragen
20.1.7
Datenaustausch zwischen Applets
20.1.8
Was ein Applet alles darf
Fehler in Applets finden
20.2.1
Ist Java im Browser aktiviert?
20.2.2
Läuft das Applet unter Netscape oder Microsoft Explorer?
20.2.3
Datenaustausch zwischen Applets und Java-Skripten
1267
1267
1267
1269
1269
1271
1271
1273
1275
1276
1276
1277
1278
Webstart
1279
Inhalt
21.1
21.2
21.3
21.4
21.5
21.6
22.1
22.2
22.3
22.4
22.5
22.6
Java Platform, Micro Edition (Java ME)
Konfigurationen
21.2.1
Connected Limited Device Configuration (CLDQ
21.2.2
Connected Device Configuration (CDC)
Profile
21.3.1
Mobile Information Device Profile (MIDP)
21.3.2
Weitere Profile
Wireless Toolkits
21.4.1
Sun Java Wireless Toolkit for CLDC
21.4.2
Eclipse-Plugin
Die Midlet-API
21.5.1
Paketstruktur Mobile Information Device Profile (2.0)
Zum Weiterlesen
1281
1281
1281
1282
1282
1282
1283
1283
1283
1284
1286
1286
1287
Das relationale Modell
Datenbanken und Tools
22.2.1
HSQLDB
22.2.2
Weitere Datenbanken
22.2.3
Edipse-Plugins zum Durchschauen von Datenbanken
JDBC und Datenbanktreiber
22.3.1 Treibertypen
22.3.2 JDBC-Versionen
Eine Beispielabfrage
22.4.1
Schritte zur Datenbankabfrage
22.4.2
Client für HSQLDB-Datenbank
Mit Java an eine Datenbank andocken
22.5.1
Der Treiber-Manager
22.5.2
Den Treiber laden
22.5.3
Eine Aufzählung aller Treiber
22.5.4
Log-Informationen
22.5.5
Verbindung zur Datenbank auf-und abbauen
22.5.6
DataSource
22.5.7
Gepoolte Verbindungen
Datenbankabfragen
22.6.1 Abfragen über das Statement-Objekt
22.6.2
Ergebnisse einer Abfrage in ResultSet
22.6.3
Java und SQL-Datentypen
22.6.4
Unicode in der Spalte korrekt auslesen
1289
1290
1290
1291
1293
1295
1296
1297
1298
1298
1299
1300
1301
1301
1302
1303
1304
1307
1310
1310
1310
1312
1314
1317
33
Inhalt
22.7
22.8
22.9
22.10
22.11
22.12
22.13
22.14
23.1
23.2
23.3
34
22.6.5
Eine SQL-NULL und wasNullO bei ResultSet
22.6.6 Wie viele Zeilen hat ein ResultSet?
Die Ausnahmen beiJDBC
Elemente einer Datenbank hinzufügen und aktualisieren
22.8.1
Batch-Updates
ResultSets in Bohnen durch RowSet
22.9.1
Die Schnittstelle RowSet
22.9.2
Implementierungen von RowSet
22.9.3
Der Typ CachedRowSet
22.9.4
Der Typ WebRowSet
Vorbereitete Anweisungen (Prepared Statements)
22.10.1 PreparedStatement-Objekte vorbereiten
22.10.2 Werte für die Platzhaltereines PreparedStatement
Transaktionen
Metadaten
22.12.1 Metadaten über die Tabelle
22.12.2 Informationen über die Datenbank
Einführung in SQL
22.13.1 Ein Rundgang durch SQL-Anfragen
22.13.2 Datenabfrage mit der Data Query Language (DQL)
22.13.3 Tabellen mit der Data Definition Language (DDL) anlegen
Zum Weiterlesen
1317
1318
1318
1319
1320
1321
1321
1322
1322
1323
1325
1326
1326
1328
1328
1328
1332
1333
1333
1335
1337
1337
Metadaten
23.1.1 Metadaten durch Java-Doc Tags
23.1.2
XDodet
Metadaten der Klassen mit dem Class-Objekt
23.2.1 An ein Class-Objekt kommen
23.2.2
Was das Class-Objekt beschreibt
23.2.3
Der Name der Klasse
23.2.4
instanceof mit Class-Objekten
23.2.5
Oberklassen finden
23.2.6
Implementierte Interfaces einer Klasse oder eines Interfaces
23.2.7 Modifizierer und die Klasse Modifier
23.2.8
Die Arbeit auf dem Feld
Attribute, Methoden und Konstruktoren
23.3.1
Reflections Gespür für Attribute einer Klasse
23.3.2
Methoden einer Klasse erfragen
23.3.3
Properties einer Bean erfragen
23.3.4
Konstruktoren einer Klasse
23.3.5
Annotationen
1339
1339
1340
1340
1341
1343
1345
1347
1347
1348
1349
1350
1351
1352
1355
1358
1359
1361
Inhalt
23.4
23.5
23.6
23.7
24.1
24.2
24.3
24.4
24.5
24.6
24.7
Objekte erzeugen und manipulieren
23.4.1
Objekte erzeugen
23.4.2
Die Belegung der Variablen erfragen
23.4.3
Eine generische toStringO-Funktion
23.4.4 Variablen setzen
23.4.5
Private Attribute ändern
Methoden aufrufen
23.5.1
Statische Methoden aufrufen
23.5.2
Dynamische Methodenaufrufe bei festen Methoden
beschleunigen
Informationen und Identifizierung von Paketen
23.6.1
Geladene Pakete
Annotationen
23.7.1
Neue Annotationen definieren
23.7.2
Annotationen mit genau einem Element
23.7.3
Beliebige Schlüssel-Werte-Paare
23.7.4 Vorbelegte Elemente
23.7.5
Annotieren von Annotationstypen
23.7.6 Annotationen zur Laufzeit ausgelesen
23.7.7
Mögliche Nachteile von Annotationen
1361
1361
1363
1365
1366
1368
1369
1370
1371
1372
1373
1373
1373
1373
1375
1378
1379
1381
1383
Die Logging-API
24.1.1
Einfaches Logging
24.1.2
Log-Level
24.1.3
Logging in eine Datei
Überwachen von Systemzuständen
MBean-Typen, MBean-Server und weitere Begriffe
24.3.1
MXBeans des Systems
Geschwätzige Programme und JConsole
24.4.1 JConsole
Der MBeanServer
Eine eigene Standard-MBean
24.6.1
Management-Schnittstelle
24.6.2
Implementierung der managed Ressource
24.6.3
Anmeldung beim Server
24.6.4
Eigene Bean in JConsole
24.6.5 JMX mit RMI-Adaptor
Zum Weiterlesen
1385
1385
1386
1386
1387
1388
1389
1391
1391
1393
1394
1394
1394
1395
1395
1397
1399
,
35
Inhalt
25.1
25.2
25.3
25.4
25.5
25.6
25.7
26.1
26.2
26.3
36
Zentrale Elemente der Java-Sicherheit
25.1.1
Security-API derJavaSE
25.1.2
Cryptographic Service Providers
Der Sandkasten (Sandbox)
Sicherheitsmanager (Security Manager)
25.3.1
Der Sicherheitsmanager bei Applets
25.3.2
Sicherheitsmanager aktivieren
25.3.3
Wie nutzen die Java-Bibliotheken den Sicherheitsmanager?
25.3.4
Rechte durch Policy-Dateien vergeben
25.3.5
Erstellen von Rechtedateien mit dem grafischen Policy-Tool
25.3.6
Kritik an den Policies
Signierung
25.4.1 Warum signieren?
25.4.2
Digitale Ausweise und die Zertifizierungsstelle
25.4.3
Mit keytool Schlüssel erzeugen
25.4.4 Signieren mitjarsigner
Digitale Unterschriften
,
25.5.1
Die MDx-Reihe
25.5.2
Secure Hash Algorithm (SHA)
25.5.3
Mit der Security-API einen Fingerabdruck berechnen
25.5.4
Die Klasse MessageDigest
25.5.5
Unix-Crypt
Verschlüsseln von Daten(-strömen)
25.6.1
Den Schlüssel bitte
25.6.2
Verschlüsseln mit Cipher
25.6.3
Verschlüsseln von Datenströmen
Zum Weiterlesen
1401
1401
1402
1403
1403
1405
1406
1407
1408
1410
1410
1412
1412
1412
1413
1414
1414
1415
1415
1416
1416
1418
1418
1418
1420
1420
1422
Java Native Interface und Invocation-API
Einbinden einer C-Funktion in ein Java-Programm
26.2.1
Schreiben des Java-Codes
26.2.2
Compilieren des Java-Programms
26.2.3
Erzeugen der Header-Datei
26.2.4
Implementierung der Methode in C
26.2.5
Übersetzen der C-Programme und Erzeugen der dynamischen
Bibliothek
26.2.6
Suchort der dynamischen Bibliothek
Nativ die Stringlänge ermitteln
1423
1424
1424
1425
1425
1426
1427
1429
1429
Inhalt
26.4
Erweiterte JNI-Eigenschaften
26.4.1
Klassendefinitionen
26.4.2
Zugriff auf Attribute
Einfache Anbindung von existierenden Bibliotheken
26.5.1
C++ Klassen ansprechen
26.5.2
COM-Schnittstellen anzapfen
1430
1430
1431
1433
1433
1433
26.6
Zum Weiterlesen
1434
27.1
27.2
Die Werkzeuge im Überblick
Java-Compiler
27.2.1
Bytecode Compiler javac
27.2.2
Native Compiler
27.2.3 Java-Programme in ein natives ausführbares Programm
einpacken
Der Java-Interpreter java
27.3.1
DerUnterschiedzwischenjava.exeundjavaw.exe
Das Archivformat Jar
27.4.1
Das Dienstprogramm Jar benutzen
27.4.2
Das Manifest
27.4.3
Applikationen in Jar-Archiven starten
27.4.4 Applets in Jar-Archiven
Monitoringprogramme
27.5.1 jps
1435
1435
1435
1436
1437
1437
1438
1439
1439
1442
1442
1443
1444
1444
27.5.2
27.5.3
27.5.4
1444
1444
1445
26.5
27.3
27.4
27.5
27.6
27.7
27.8
27.9
Index
jstat
jmap
jstack
Ant
27.6.1
Bezug und Installation von Ant
27.6.2
Properties
27.6.3
Externe und vordefinierte Properties
27.6.4 Weitere Ant-Tasks
Decompiler und Obfuscatoren
27.7.1
Der Decompiler Jad
27.7.2
Das Obfuscator-Programm ProGuard
Weitere Dienstprogramme
27.8.1
Sourcecode Beautifier
27.8.2
Java-Programme als Systemdienst ausführen
Zum Weiterlesen
1445
1446
1447
1448
1449
1450
1451
1451
1452
1452
1453
1454
1457
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