1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100008.html;106,k100009.html;107,k100011.html;108,k100013.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100008.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100009.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100011.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100013.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 1 - Was ist Java?
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id001002"></a>
<h2>1.2 Eigenschaften von Java </h2>
<hr>
<ul>
<li><a href="k100010.html#sectlevel2id001002">1.2 Eigenschaften von Java</a>
<ul>
<li><a href="k100010.html#sectlevel3id001002001">1.2.1 Sprachmerkmale</a>
<li><a href="k100010.html#sectlevel3id001002002">1.2.2 Applets: eine neue Klasse von Programmen</a>
<li><a href="k100010.html#sectlevel3id001002003">1.2.3 Grafikprogrammierung</a>
<li><a href="k100010.html#sectlevel3id001002004">1.2.4 Umfangreiche Klassenbibliothek</a>
</ul>
</ul>
<hr>
<!-- Section -->
<a name="sectlevel3id001002001"></a>
<h3>1.2.1 <a name="ixa100065">Sprachmerkmale</a></h3>
<p>
Java wurde vollständig neu entworfen. Die Designer versuchten,
die Syntax der Sprachen C und C++ soweit wie möglich nachzuahmen,
verzichteten aber auf einen Großteil der komplexen und fehlerträchtigen
Merkmale beider Sprachen. Das Ergebnis ihrer Bemühungen haben
sie wie folgt zusammengefasst:
<p>
<i>»Java soll eine einfache, objektorientierte, verteilte, interpretierte,
robuste, sichere, architekturneutrale, portable, performante, nebenläufige,
dynamische Programmiersprache sein.«</i>
<p>
Der Erfolg von Java hängt eng damit zusammen, dass ein wesentlicher
Teil dieser Forderungen tatsächlich in einer für viele Programmierer
akzeptablen Weise erfüllt wurde - obgleich wir am Ende dieses
Kapitels auch einige kritische Anmerkungen dazu geben werden.
<p>
Java ist sowohl eine objektorientierte Programmiersprache in der Tradition
von Smalltalk als auch eine klassische imperative Programmiersprache
nach dem Vorbild von C. Im Detail unterscheidet sich Java aber recht
deutlich von C++, das denselben Anspruch erhebt. Durch die Integration
einer großen Anzahl anspruchsvoller Features wie Multithreading,
strukturiertem Exceptionhandling oder eingebauten grafischen Fähigkeiten
implementiert Java eine Reihe interessanter Neuerungen auf dem Gebiet
der Programmiersprachen.
<p>
Zudem profitiert Java davon, dass viele der Features von C++ <i>nicht</i>
realisiert wurden und die Sprache dadurch schlank und übersichtlich
wurde. So gibt es beispielsweise keine expliziten <a name="ixa100066"><i>Pointer</i></a>,
keine separaten Header-Dateien und keine <a name="ixa100067"><i>Mehrfachvererbung</i></a>
in Java. Wer allerdings glaubt, Java sei eine Programmiersprache,
die nur das Allernötigste bietet, irrt. Tatsächlich ist
Java eine elegante Sprache, die auch für größere Projekte
und anspruchsvolle Aufgaben alle erforderlichen Reserven besitzt.
<p>
In Java gibt es die meisten elementaren Datentypen, die auch C besitzt.
Arrays und Strings sind als Objekte implementiert und sowohl im Compiler
als auch im Laufzeitsystem verankert. Methodenlose Strukturtypen wie
<font color="#000077"><tt>struct</tt></font> oder <font color="#000077"><tt>union</tt></font>
gibt es in Java nicht. Alle primitiven Datentypen sind vorzeichenbehaftet
und in ihrer Größe unabhängig von der Zielplattform
exakt spezifiziert. Java besitzt einen eingebauten logischen Datentyp
<a href="index_b.html#ixb100072"><font color=#000080><tt>boolean</tt></font></a>.
<p>
Java bietet <a name="ixa100068">semidynamische Arrays</a>, deren initiale
Größe zur Laufzeit festgelegt werden kann. Arrays werden
als Objekte angesehen, die einige wohldefinierte Eigenschaften haben.
Mehrdimensionale Arrays werden wie in C dadurch realisiert, dass einfache
Arrays ineinandergeschachtelt werden. Dabei können auch nicht-rechteckige
Arrays erzeugt werden. Alle Array-Zugriffe werden zur Laufzeit auf
Einhaltung der Bereichsgrenzen geprüft.
<p>
Die <a name="ixa100069">Ausdrücke</a> in Java entsprechen weitgehend
denen von C und C++. Java besitzt eine <a name="ixa100070"><a href="index_i.html#ixb100075"><font color=#000080><tt>if</tt></font></a></a>-Anweisung,
eine <a name="ixa100071"><a href="index_w.html#ixb100076"><font color=#000080><tt>while</tt></font></a></a>-,
<a name="ixa100072"><a href="index_d.html#ixb100077"><font color=#000080><tt>do</tt></font></a></a>-
und <a name="ixa100073"><a href="index_f.html#ixb100078"><font color=#000080><tt>for</tt></font></a></a>-Schleife
und ein <a name="ixa100074"><a href="index_s.html#ixb100079"><font color=#000080><tt>switch</tt></font></a></a>-Statement.
Es gibt die von C bekannten <a name="ixa100075"><a href="index_b.html#ixb100080"><font color=#000080><tt>break</tt></font></a></a>-
und <a name="ixa100076"><a href="index_c.html#ixb100081"><font color=#000080><tt>continue</tt></font></a></a>-Anweisungen
in normaler und gelabelter Form. Letztere ermöglicht es, mehr
als eine Schleifengrenze zu überspringen. Java besitzt kein <font color="#000077"><tt>goto</tt></font>-Statement
(obgleich es sich um ein reserviertes Wort handelt). Variablendeklarationen
werden wie in C++ als Anweisungen angesehen und können an beliebiger
Stelle innerhalb des Codes auftauchen. Seit der Version 1.4 besitzt
Java eine <a name="ixa100077"><a href="index_a.html#ixb100056"><font color=#000080><tt>assert</tt></font></a></a>-Anweisung,
die zur Laufzeit an- und abgeschaltet werden kann.
<p>
Als objektorientierte Programmiersprache <a name="ixa100078"></a>
(OOP-Sprache<a name="ixa100079"></a>) besitzt Java alle Eigenschaften
moderner objektorientierter Sprachen. Wie C++ erlaubt Java die Definition
von Klassen, aus denen Objekte erzeugt werden können. Objekte
werden dabei stets als Referenzdatentypen behandelt, die wie Variablen
angelegt und verwendet werden können. Zur Initialisierung gibt
es Konstruktoren, und es kann eine optionale <i>Finalizer</i>-Methode
definiert werden, die bei der Zerstörung des Objekt aufgerufen
wird. Seit der Version 1.1 gibt es lokale Klassen, die innerhalb einer
anderen Klasse definiert werden.
<p>
Alle Methodenaufrufe in Java sind dynamisch. Methoden können
überladen werden, Operatoren allerdings nicht. Anders als in
C++ ist das Late-Binding standardmäßig aktiviert, kann
aber per Methode deaktiviert werden. Java erlaubt Einfach-, aber keine
Mehrfachvererbung von Implementierungen. Mit Hilfe von <i>Interfaces</i>
- das sind abstrakte Klassendefinitionen, die nur aus Methodensignaturen,
bzw. den Schnittstellen bestehen - ist eine restriktive Form der Mehrfachvererbung
möglich, die einen Kompromiss zwischen beiden Alternativen darstellt.
Java erlaubt die Definition abstrakter Basisklassen, die neben konkreten
auch abstrakte Methoden enthalten.
<p>
Neben Instanzvariablen und -methoden können auch Klassenvariablen
und -methoden definiert werden. Alle Elemente einer Klassendefinition
können mit Hilfe der aus C++ bekannten Schlüsselwörter
<a name="ixa100080"><a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a></a>,
<a name="ixa100081"><a href="index_p.html#ixb100085"><font color=#000080><tt>private</tt></font></a></a>
und <a name="ixa100082"><a href="index_p.html#ixb100086"><font color=#000080><tt>protected</tt></font></a></a>
in ihrer Sichtbarkeit eingeschränkt werden. Es gibt zwar keine
<a name="ixa100083"><a href="index_f.html#ixb100087"><font color=#000080><tt>friends</tt></font></a></a>,
aber die Sichtbarkeit von Methoden oder Klassen kann auf das eigene
Paket beschränkt werden. Objektvariablen werden als Referenzen
implementiert. Mit ihrer Hilfe ist eine gegenüber C/C++ eingeschränkte
Zeigerverarbeitung möglich, die das Erstellen dynamischer Datenstrukturen
ermöglicht.
<p>
Das Speichermanagement in Java erfolgt automatisch.<a name="ixa100084"></a>
Während das Erzeugen von Objekten (von wenigen Ausnahmen abgesehen)
immer einen expliziten Aufruf des <a href="index_n.html#ixb100089"><font color=#000080><tt>new</tt></font></a>-Operators
erfordert, erfolgt die Rückgabe von nicht mehr benötigtem
Speicher automatisch. Ein Garbage-Collector <a name="ixa100085"></a>,
der als niedrigpriorisierter Hintergrundprozess läuft, sucht
in regelmäßigen Abständen nach nicht mehr referenzierten
Objekten und gibt den durch sie belegten Speicher an das Laufzeitsystem
zurück. Viele der Fehler, die bei der Programmierung in C oder
C++ dadurch entstehen, dass der Entwickler selbst für das Speichermanagement
verantwortlich ist, können in Java damit nicht mehr auftreten.
<p>
In Java gibt es eine strukturierte Ausnahmebehandlung (engl. Exceptionhandling).
<a name="ixa100086"></a> Damit ist es möglich, Laufzeitfehler
zu erkennen und in strukturierter Weise zu behandeln. Eine Methode
muss jeden Laufzeitfehler, der während ihrer Abarbeitung auftreten
kann, entweder abfangen oder durch eine geeignete Deklaration an den
Aufrufer weitergeben. Dieser hat dann seinerseits die Pflicht, sich
um den Fehler zu kümmern. Exceptions sind normale Objekte, und
die zugehörigen Klassen können erweitert und als Grundlage
für anwendungsspezifische Fehler-Objekte verwendet werden.
<!-- Section -->
<a name="sectlevel3id001002002"></a>
<h3>1.2.2 <a name="ixa100087">Applets</a>: eine neue Klasse von Programmen
</h3>
<p>
Eine der am meisten gebrauchten Erklärungen für den überraschenden
Erfolg von Java ist die enge Verbindung der Sprache zum Internet und
zum World Wide Web. Mit Hilfe von Java ist es möglich, Programme
zu entwickeln, die über das Web verbreitet und innerhalb eines
Browsers wie <a name="ixa100088">Netscape</a> Navigator, <a name="ixa100089">Mozilla Firefox</a>,
<a name="ixa100090">SUN HotJava</a> oder <a name="ixa100091">Microsoft Internet Explorer</a>
ausgeführt werden können. Dazu wurde die Sprache HTML um
das APPLET-Tag<a name="ixa100092"></a> erweitert. Sie bietet so die
Möglichkeit, kompilierten Java-Code in normale Webseiten einzubinden.
<p>
Ein Java-fähiger Browser enthält einen Java-Interpreter
(die virtuelle Java-Maschine<a name="ixa100093"></a>, auch kurz <a name="ixa100094"><i>VM</i></a>
genannt) und die Laufzeitbibliothek, die benötigt wird, um die
Ausführung des Programms zu unterstützen. Die genaue Beschreibung
der virtuellen Maschine ist Bestandteil der Java-Spezifikation, und
Java-VMs sind auf praktisch alle bedeutenden Betriebssystem-Plattformen
portiert worden. Ein Applet kann damit als eine neue Art von Binärprogramm
angesehen werden, das über verschiedene Hardware- und Betriebssystemplattformen
hinweg portabel ist und auf einfache Weise im Internet verteilt werden
kann.
<p>
Im Gegensatz zu den eingeschränkten Möglichkeiten, die Script-Sprachen
wie <a name="ixa100095">JavaScript</a> bieten, sind Applets vollständige
Java-Programme, die alle Merkmale der Sprache nutzen können.
Insbesondere besitzt ein Applet alle Eigenschaften eines grafischen
Ausgabefensters und kann zur Anzeige von Text, Grafik und Dialogelementen
verwendet werden. Einer der großen Vorteile von Applets gegenüber
herkömmlichen Programmen ist ihre einfache Verteilbarkeit. Anstelle
explizit auszuführender Installationsroutinen lädt der <a name="ixa100096"><i>Classloader</i></a>
des Browsers die Bestandteile eines Applets einfach aus dem Netz und
führt sie direkt aus. Das ist vor allem bei kleineren und mittelgroßen
Anwendungen in einer lokalen Netzwerkumgebung sehr hilfreich, insbesondere
wenn diese sich häufig ändern.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Sicherheit<a name="ixa100097"></a> war eines der wichtigsten Designziele
bei der Entwicklung von Java, und es gibt eine ganze Reihe von Sicherheitsmechanismen,
die verhindern sollen, dass Java-Applets während ihrer Ausführung
Schaden anrichten. So ist es einem Applet, das in einem Web-Browser
läuft, beispielsweise nicht erlaubt, Dateioperationen auf dem
lokalen Rechner durchzuführen oder externe Programme zu starten.
<p>
Es soll allerdings nicht verschwiegen werden, dass die Applet-Euphorie
im Laufe der Zeit deutlich abgeklungen ist. Dies lag einerseits an
den Java-Implementierungen der Web-Browser, die mit den JDKs nicht
Schritt halten konnten. Zudem legten die Sicherheitsfeatures den Entwicklern
oft so große Beschränkungen auf, dass sie die Nützlichkeit
von Applets erheblich einschränkten. Der große Erfolg von
Java in der Post-1.1-Ära ist eher in der Entwicklung von Applikationen
als von Applets zu sehen. Mit der Veröffentlichung der <i>WebStart</i>-Technologie
während des JDK 1.3 wurden dann die Vorteile beider Technologien
wieder miteinander verbunden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel3id001002003"></a>
<h3>1.2.3 Grafikprogrammierung </h3>
<p>
Die Java-Laufzeitbibliothek bietet umfassende grafische Fähigkeiten.
Diese sind im wesentlichen plattformunabhängig und können
dazu verwendet werden, portable Programme mit GUI-Fähigkeiten
auszustatten. Seit der Version 1.2 des JDK werden diese Fähigkeiten
unter dem Begriff <a name="ixa100098"><i>Java Foundation Classes</i></a>
(kurz <a name="ixa100099"><i>JFC</i></a>) zusammengefasst, deren drei
wichtigste Komponenten die folgenden sind:
<ul>
<li>Das <a name="ixa100100"><i>Abstract Windowing Toolkit</i></a>
(kurz <a name="ixa100101"><i>AWT</i></a>) bietet elementare Grafik-
und Fensterfunktionen auf der Basis der auf der jeweiligen Zielmaschine
verfügbaren Fähigkeiten.
<li>Das <a name="ixa100102"><i>Swing Toolset</i></a> stellt darüber
hinaus eine Reihe zusätzlicher Dialogelemente zur Verfügung
und ermöglicht die Konstruktion sehr komplexer grafischer Oberflächen.
Mit seinem <a name="ixa100103"><i>Pluggable Look-and-Feel</i></a>
bietet es die Möglichkeit, das Look-and-Feel eines Programms
zur Laufzeit umzuschalten und den Bedürfnissen des jeweiligen
Benutzers und den Fähigkeiten der Systemumgebung anzupassen.
<li>Die dritte wichtige Komponente ist das <a name="ixa100104"><i>Java 2D API</i></a>,
das komplexe Grafikoperationen und Bildbearbeitungsroutinen zur Verfügung
stellt.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Es ist eine bemerkenswerte Innovation, dass Elemente für die
GUI-Programmierung in einer Programmiersprache <i>portabel</i> zur
Verfügung gestellt werden. Zwar gab es im Prinzip auch früher
schon Programmiersprachen, die grafische Fähigkeiten hatten,
aber wer einmal die Aufgabe hatte, eine grafische Benutzeroberfläche
unter Windows, OS/2, UNIX und auf dem MAC zur Verfügung zu stellen,
hatte meistens dennoch erheblichen Portierungsaufwand. Mit den Standardmitteln
der Sprachen C oder C++ und ihren Laufzeitbibliotheken war dies jedenfalls
nicht möglich. Mit Java und ihren Klassenbibliotheken steht nun
erstmals eine einfach zu verwendende Sprache zur Verfügung, die
das Erstellen von GUI-Programmen bereits als Kernfunktionalität
bietet.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Das AWT stellt eine Reihe von elementaren Operationen zur Verfügung,
um grafische Ausgabeelemente, wie Linien, Polygone, Kreise, Ellipsen,
Kreisabschnitte oder Rechtecke, zu erzeugen. Diese Methoden können
auch in einem Füllmodus verwendet werden, der dafür sorgt,
dass die gezeichneten Flächen mit Farbe ausgefüllt werden.
Wie in den meisten Grafik-Libraries realisiert auch Java die Bildschirmausgabe
mit Hilfe des Konzepts eines <i>Grafikkontexts</i>, der eine Abstraktion
des tatsächlichen Ausgabegerätes bildet.
<p>
Neben grafischen Elementen kann natürlich auch Text ausgegeben
und an beliebiger Stelle innerhalb der Fenster platziert werden. Text
kann skaliert werden, und es ist möglich, mit unterschiedlichen
Fonts zu arbeiten. Das AWT bemüht sich, einen portablen Weg zur
Font-Auswahl anzubieten, indem eine Reihe von elementaren Schriftarten
auch über Plattformgrenzen hinweg angeboten werden. Mit Hilfe
von Font-Metriken können numerische Eigenschaften der verwendeten
Schriftarten bestimmt und bei der Ausgabe berücksichtigt werden.
<p>
Das Farbmodell von Java basiert auf dem RGB-Modell, das seine Farben
additiv auf der Basis der enthaltenen Rot-, Grün- und Blauanteile
bestimmt. Daneben wird auch das HSB-Modell unterstützt (<i>hue,
saturation, brightness</i>), und es gibt Methoden zur Konvertierung
zwischen beiden. Das Farbsystem unterstützt eine Reihe von vordefinierten
Farben, die plattformübergreifend zur Verfügung stehen.
<p>
Neben Grafik kann auch <a name="ixa100105">Sound</a> ausgegeben werden.
Java unterstützt die Wiedergabe von <a name="ixa100106"><i>au-Dateien</i></a>
(ein von SUN eingeführtes Format zur Speicherung von digitalen
Sound-Samples) und seit der Version 1.2 auch <a name="ixa100107"><i>wav-</i></a><a name="ixa100108"></a>
und <a name="ixa100109"><i>aiff-Dateien</i></a><a name="ixa100110"></a>,
die entweder über das Internet oder aus einer lokalen Datei geladen
werden können. Die Samples können einmalig abgespielt oder
in einer Schleife wiederholt werden. Daneben ist es möglich,
zwei oder mehr Sound-Dateien gleichzeitig abzuspielen. Seit dem JDK
1.2 gibt es ein eigenes Sound-API, das neben <a name="ixa100111"><i>Wave-Dateien</i></a>
auch <a name="ixa100112"><i>Midi-Dateien</i></a> wiedergeben und bearbeiten
kann.
<p>
Das AWT erlaubt die Anzeige und Manipulation von Bilddaten. Mit Hilfe
von Standardmethoden können Grafiken in elementaren Formaten
wie GIF oder JPEG geladen, skaliert und auf dem Bildschirm angezeigt
werden. Zusätzlich gibt es das Paket <a name="ixa100113"><a href="index_j.html#ixb100112"><font color=#000080><tt>java.awt.image</tt></font></a></a>,
das für die Manipulation von Bilddaten entworfen wurde und ausgefeilte
Funktionen zur Bild- und Farbmanipulation zur Verfügung stellt.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Wie in den meisten grafischen Entwicklungsumgebungen wird auch beim
AWT der Programmfluss durch Nachrichten (Events) gesteuert. Sie werden
beim Auftreten bestimmter Ereignisse an das Programm gesendet und
von diesem in geeigneter Weise behandelt. Java stellt Nachrichten
zur Bearbeitung von Maus-, Tastatur-, Fenster-, Dialog- und vielen
anderen Ereignissen zur Verfügung. Das Event-Handling seit dem
JDK 1.1 erlaubt es, Nachrichten an jedes beliebige Objekt zu senden,
das die Schnittstelle eines Nachrichtenempfängers implementiert.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Die zweite grafische Oberfläche des JDK, das Swing-Toolkit, bietet
noch weitreichendere Fähigkeiten als das AWT. Dazu wurde eine
vollkommen neue Architektur entworfen, und es stehen viele zusätzliche
Dialogelemente, wie Tabellen, Trees oder Karteikarten, zur Verfügung.
Anstatt wie im AWT auf die Eigenschaften vorgefertigter GUI-Elemente
zu vertrauen, verwendet Swing lediglich einen sehr eingeschränkten
Satz an plattformspezifischen Grafikoperationen. Alle Dialogelemente
werden unter Verwendung einfacher und portabler Grafikprimitive selbst
dargestellt. Die Anzahl der Unterschiede zwischen den verschiedenen
Plattformen wird auf diese Weise drastisch reduziert, und die Swing-Dialogelemente
lassen sich wesentlich einfacher und konsistenter auf unterschiedliche
Grafiksysteme portieren.
<!-- Section -->
<a name="sectlevel3id001002004"></a>
<h3>1.2.4 Umfangreiche Klassenbibliothek </h3>
<p>
Die Java-Klassenbibliothek bietet mit einer ganzen Reihe nützlicher
Klassen und Interfaces die Möglichkeit, sehr problemnah zu programmieren.
Einige dieser Features sind von Anfang an nützlich, andere erschließen
sich erst nach einer gewissen Einarbeitung.
<p>
Neben grafischen Ausgabemöglichkeiten stellt Java auch einfache
Textausgaben zur Verfügung, ähnlich den entsprechenden Funktionen
in C oder C++. Damit ist es möglich, Programme mit einfachen,
zeilenorientierten Ein-/Ausgabemöglichkeiten auszustatten, wenn
keine aufwändige Benutzerschnittstelle benötigt wird. Einfache
<a name="ixa100114">Textausgaben</a> werden mit den Methoden der Klasse
<a name="ixa100115"><a href="index_p.html#ixb100114"><font color=#000080><tt>PrintStream</tt></font></a></a>
erzeugt. Diese erlauben es, alle gängigen Datentypen in ein Terminalfenster
auszugeben. Die Klassenvariable <a name="ixa100116"><a href="index_o.html#ixb100115"><font color=#000080><tt>System.out</tt></font></a></a>
bietet einen vordefinierten <a href="index_p.html#ixb100114"><font color=#000080><tt>PrintStream</tt></font></a>,
der vom Laufzeitsystem initialisiert wird. In ähnlicher Weise
steht mit <a name="ixa100117"><a href="index_s.html#ixb100116"><font color=#000080><tt>System.in</tt></font></a></a>
die Möglichkeit zur Verfügung, einfache Texteingaben von
der Tastatur einzulesen.
<p>
Eines der wichtigsten Elemente der Klassenbibliothek ist die Klasse
<a name="ixa100118"><a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a></a>,
die Java-Implementierung von <a name="ixa100119">Zeichenketten</a>.
<a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
bietet eine Vielzahl wichtiger Methoden zur Manipulation und zum Zugriff
auf Zeichenketten, wie beispielsweise Operationen für numerische
Konvertierungen, Zeichen- und Teilstringextraktion sowie für
Textsuche und Stringvergleich.
<p>
Interessanterweise kann sich ein String-Objekt nach seiner Initialisierung
nicht mehr verändern, sondern behält stets seinen ursprünglichen
Wert. Was zunächst wie eine schwerwiegende Restriktion aussieht,
ist in der Praxis meist bedeutungslos. Denn in Zusammenarbeit mit
der Klasse <a name="ixa100120"><a href="index_s.html#ixb100119"><font color=#000080><tt>StringBuffer</tt></font></a></a>
(die variabel lange Strings repräsentiert) und der Fähigkeit
des Compilers, selbige automatisch bei der String-Initialisierung,
-Zuweisung und -Verkettung zu verwenden, bleibt diese Tatsache für
den Programmierer normalerweise verborgen. Dank des automatischen
Speichermanagements und der effizienten Konvertierung von <a href="index_s.html#ixb100119"><font color=#000080><tt>StringBuffer</tt></font></a>
nach <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
ähnelt der Umgang mit Strings aus der Sicht des Programmierers
dem mit variabel langen Zeichenketten in anderen Programmiersprachen.
Wegen des automatischen Speichermanagements sind Java-Strings sehr
viel sicherer als nullterminierte Strings in C oder C++.
<p>
Ein <a name="ixa100121"><a href="index_v.html#ixb100120"><font color=#000080><tt>Vector</tt></font></a></a>
in Java ist eine lineare Liste, die jede Art von Objekt aufnehmen
kann und auf deren Elemente sowohl sequenziell als auch wahlfrei zugegriffen
werden kann. Die Länge eines Vektors ist veränderlich, und
Elemente können am Ende oder an einer beliebigen anderen Stelle
eingefügt werden. Aufgrund dieser Flexibilität kann ein
<a href="index_v.html#ixb100120"><font color=#000080><tt>Vector</tt></font></a>
oft da verwendet werden, wo ansonsten eine lineare Liste durch Verkettung
von Objektreferenzen manuell erstellt werden müsste. Wie gewöhnlich
erfolgt auch das Speichermanagement eines Vektors vollkommen automatisch.
Neben <a href="index_v.html#ixb100120"><font color=#000080><tt>Vector</tt></font></a>
gibt es weitere Container-Klassen. So bietet beispielsweise <a name="ixa100122"><a href="index_h.html#ixb100121"><font color=#000080><tt>HashMap</tt></font></a></a>
die Möglichkeit, Schlüssel-Wert-Paare zusammenhängend
zu speichern und bei gegebenem Schlüssel den zugehörigen
Wert effizient wieder aufzufinden.
<p>
Ein nützlicher Mechanismus zum Durchlaufen von Container-Klassen
ist das <a name="ixa100123"><a href="index_e.html#ixb100122"><font color=#000080><tt>Enumeration</tt></font></a></a>-Interface,
das die Methoden <a name="ixa100124"><a href="index_h.html#ixb100123"><font color=#000080><tt>hasMoreElements()</tt></font></a></a>
und <a name="ixa100125"><a href="index_n.html#ixb100124"><font color=#000080><tt>nextElement()</tt></font></a></a>
zur Verfügung stellt. Diese können verwendet werden, um
in einer Schleife alle Elemente des Containers sukzessive zu durchlaufen.
Alle vordefinierten Container-Klassen stellen Methoden zur Verfügung,
die Enumeration-Objekte zum Durchlaufen der eigenen Elemente zurückgeben.
<p>
Seit dem JDK 1.2 gibt es in Java eine eigene Bibliothek für Container-Klassen,
das <a name="ixa100126"><i>Collection-API</i></a>. Sie stellt eine
umfassende Sammlung an Interfaces für Container-Klassen zur Verfügung
und bietet unterschiedliche Implementierungen für verschiedene
Anwendungsfälle. Die zuvor erwähnte Klasse <a href="index_e.html#ixb100122"><font color=#000080><tt>Enumeration</tt></font></a>
wird hier durch das Interface <a name="ixa100127"><a href="index_i.html#ixb100125"><font color=#000080><tt>Iterator</tt></font></a></a>
ersetzt, das einfacher zu bedienen ist. Das Collection-API stellt
daneben einige Algorithmen zur Verarbeitung von Containern zur Verfügung
(z.B. Sortieren), die es in den älteren Container-Klassen nicht
gab.
<p>
Java stellt auch <a name="ixa100128">Zufallszahlen</a> zur Verfügung.
Das Paket <a href="index_j.html#ixb100127"><font color=#000080><tt>java.util</tt></font></a>
bietet eine Klasse <a name="ixa100129"><a href="index_r.html#ixb100128"><font color=#000080><tt>Random</tt></font></a></a>,
die das Initialisieren von Zufallszahlengeneratoren und den Zugriff
auf ganzzahlige oder Fließkomma-Zufallszahlen ermöglicht.
Neben <i>gleichverteilten</i> stellt die Klasse <a href="index_r.html#ixb100128"><font color=#000080><tt>Random</tt></font></a>
auch <i>normalverteilte</i> Zufallszahlen zur Verfügung.
<p>
Seit dem JDK 1.1 werden darüber hinaus mit jedem Release weitere
hochspezialisierte (und teilweise sehr aufwändige) Bibliotheken
zur Verfügung gestellt. So bietet beispielsweise <a name="ixa100130">JDBC</a>
(<a name="ixa100131"><i>Java Database Connectivity</i></a>) den Zugriff
auf relationale Datenbanken, <a name="ixa100132"><i>JavaBeans</i></a>
stellt eine portable Komponentenarchitektur zur Verfügung, und
mit dem <a name="ixa100133"><i>Networking-API</i></a>, RMI (<a name="ixa100134"><i>Remote
Method Invocation</i></a>) und der Java-eigenen
CORBA-Implementierung<a name="ixa100135"></a> <a name="ixa100136"><i>javaidl</i></a>
kann unternehmensweit auf Netzwerkressourcen und verteilte Objekte
zugegriffen werden. Per <a name="ixa100137"><i>Serialisierung</i></a>
können Objekte persistent gemacht werden, und mit dem <a name="ixa100138"><i>Reflection-API</i></a>
kann der Aufbau von Objekten und Klassen zur Laufzeit untersucht und
dynamisch darauf zugegriffen werden. Wir werden in diesem Buch die
wichtigsten dieser Bibliotheken ausführlich erläutern.
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100008.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100009.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100011.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100013.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|