summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100085.html
blob: 234e032979a75036f7690cfd1422cb6da55f2653 (plain)
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
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
<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,k100083.html;106,k100084.html;107,k100086.html;108,k100090.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">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100084.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100086.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">Kapitel 13 - Strukturierung von Java-Programmen
</table>
<hr>


<!-- Section -->
<a name="sectlevel2id013002"></a>
<h2>13.2 <a name="ixa100760">Pakete</a></h2>
<hr>
<ul>
<li><a href="k100085.html#sectlevel2id013002">13.2 Pakete</a>
<ul>
<li><a href="k100085.html#sectlevel3id013002001">13.2.1 Verwendung von Paketen</a>
<ul>
<li><a href="k100085.html#sectlevel4id013002001001">Der Import von java.lang</a>
<li><a href="k100085.html#sectlevel4id013002001002">Die vordefinierten Pakete im JDK</a>
</ul>
<li><a href="k100085.html#bedeutungpaketnamen">13.2.2 Die Bedeutung der Paketnamen</a>
<ul>
<li><a href="k100085.html#sectlevel4id013002002001">Laden von Klassen im JDK 1.0 und 1.1</a>
<li><a href="k100085.html#sectlevel4id013002002002">Laden von Klassen seit dem JDK 1.2</a>
<li><a href="k100085.html#sectlevel4id013002002003">Die Dateien classes.zip und rt.jar</a>
<li><a href="k100085.html#sectlevel4id013002002004">Umgekehrte Domain-Namen</a>
</ul>
<li><a href="k100085.html#zuspaketeeinbinden">13.2.3 Einbinden zus&auml;tzlicher Pakete</a>
<li><a href="k100085.html#sectlevel3id013002004">13.2.4 Erstellen eigener Pakete</a>
<ul>
<li><a href="k100085.html#sectlevel4id013002004001">Benannte Pakete</a>
<li><a href="k100085.html#sectlevel4id013002004002">Das Default-Paket</a>
<li><a href="k100085.html#sectlevel4id013002004003">Das public-Attribut</a>
</ul>
</ul>
</ul>
<hr>


<!-- Section -->
<a name="sectlevel3id013002001"></a>
<h3>13.2.1 Verwendung von Paketen </h3>

<p>
Jede Klasse in Java ist Bestandteil eines Pakets. Der vollst&auml;ndige
Name einer Klasse besteht aus dem Namen des Pakets, gefolgt von einem
Punkt, dem sich der eigentliche Name der Klasse anschlie&szlig;t.
Der Name des Pakets selbst kann ebenfalls einen oder mehrere Punkte
enthalten. 

<p>
Damit eine Klasse verwendet werden kann, muss angegeben werden, in
welchem Paket sie liegt. Hierzu gibt es zwei unterschiedliche M&ouml;glichkeiten:
<ul>
<li>Die Klasse wird &uuml;ber ihren vollen (qualifizierten) Namen
angesprochen: 
<font color="#000077">
<pre>
java.util.Date d = new java.util.Date();
</pre>
</font>
<li>Am Anfang des Programms werden die gew&uuml;nschten Klassen mit
Hilfe einer <a name="ixa100761"><a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a></a>-Anweisung
eingebunden: 
<font color="#000077">
<pre>
import java.util.*;
...
Date d = new Date();
</pre>
</font>
</ul>

<p>
Die Verwendung voll qualifizierter Namen hat den Nachteil, dass die
Klassennamen sehr lang und unhandlich werden. Bequemer ist daher die
Anwendung der zweiten Variante, bei der die ben&ouml;tigten Klassen
mit Hilfe einer <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
dem Compiler bekanntgemacht werden. 

<p>
Die <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
gibt es in zwei unterschiedlichen Auspr&auml;gungen: 
<ul>
<li>Mit der Syntax <font color="#000077"><tt>import Paket.Klasse;</tt></font>
wird genau eine Klasse importiert. Alle anderen Klassen des Pakets
bleiben unsichtbar: 
<font color="#000077">
<pre>
import java.util.Date;
...
Date d = new Date();
java.util.Vector v = new java.util.Vector();
</pre>
</font>
<li>Unter Verwendung der Syntax <font color="#000077"><tt>import Paket.*;</tt></font>
k&ouml;nnen alle Klassen des angegebenen Pakets auf einmal importiert
werden: 
<font color="#000077">
<pre>
import java.util.*;
...
Date d = new Date();
Vector v = new Vector();
</pre>
</font>
</ul>

<p>
Im Gegensatz zu &auml;hnlichen Konstrukten in anderen Sprachen ist
die Verwendung der zweiten Variante der <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
nicht zwangsl&auml;ufig ineffizienter als die der ersten. In der Sprachspezifikation
wird sie als <i>type import on demand</i> bezeichnet, was bedeutet,
dass die Klasse erst dann in den angegebenen Paketen gesucht wird,
wenn das Programm sie wirklich ben&ouml;tigt. Keinesfalls muss der
Compiler beim Parsen der <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
zwangsl&auml;ufig alle Klassendateien des angegebenen Pakets in den
Hauptspeicher laden oder &auml;hnlich zeit- und speicheraufw&auml;ndige
Dinge machen. Es schadet also im allgemeinen nichts, die zweite Variante
der <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
zu verwenden. 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Allerdings kann es zur Vermeidung von Verwechslungen mitunter n&ouml;tig
sein, die erste Variante zu verwenden. Enthalten n&auml;mlich zwei
oder mehr Pakete, die mit der *-Notation importiert wurden, Klassen
mit demselben Namen, w&uuml;rde der Compiler die &Uuml;bersetzung
mit einer Fehlermeldung &#187;mehrdeutige Referenz auf Klasse...&#171;
abbrechen. In diesem Fall muss im Programm entweder der qualifizierte
Klassenname verwendet oder die gew&uuml;nschte Variante der Klasse
mit einer expliziten <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
eingebunden werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Seit der J2SE 5.0 gibt es unter dem Stichwort <i>static import</i>
eine weitere Variante der <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung.
Weitere Informationen dazu finden Sie in <a href="k100061.html#weitereanwinterfaces">Abschnitt 9.4</a>.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
<tr>
<td><font color="#FFFFFF">&nbsp;JDK1.1-6.0&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
</tr>
</table>


<!-- Section -->
<a name="sectlevel4id013002001001"></a>
<h4>Der <a name="ixa100762">Import von java.lang</a> </h4>

<p>
In vielen verschiedenen Beispielen in diesem Buch werden Klassennamen
(wie beispielsweise <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>,
<a href="index_t.html#ixb100591"><font color=#000080><tt>Thread</tt></font></a>
oder <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>)
verwendet, ohne dass eine zugeh&ouml;rige <a name="ixa100763"><a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a></a>-Anweisung
zu erkennen w&auml;re. In diesem Fall entstammen die Klassen dem Paket
<a name="ixa100764"><a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a></a>.

<p>
Dieses Paket wurde von den Entwicklern der Sprache als so wichtig
angesehen, dass es bei jedem Compilerlauf automatisch importiert wird.
Man kann sich das so vorstellen, als wenn am Anfang jeder Quelldatei
implizit die folgende Anweisung stehen w&uuml;rde: 
<font color="#000077">
<pre>
import java.lang.*;
</pre>
</font>

<p>
Ein expliziter Import von <a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a>
ist daher niemals n&ouml;tig. Alle anderen Pakete m&uuml;ssen jedoch
vor ihrer Verwendung importiert werden, wenn auf die Anwendung voll
qualifizierter Klassennamen verzichtet werden soll. 

<!-- Section -->

<a name="sectlevel4id013002001002"></a>
<h4>Die vordefinierten Pakete im JDK<a name="ixa100765"></a> </h4>

<p>
W&auml;hrend beim Wechsel der Java-Versionen die Sprachspezifikation
relativ stabil geblieben ist, hat sich der Umfang der Laufzeitbibliothek
um ein Vielfaches erh&ouml;ht. Dies zeigt sich unter anderem an der
gestiegenen Anzahl an vordefinierten Paketen, die mit dem JDK ausgeliefert
werden (siehe <a href="k100085.html#vordefiniertestdpakete">Tabelle 13.1</a>
und <a href="k100085.html#vordefinierteextpakete">Tabelle 13.2</a>).
Sie stieg von 8 Standardpaketen im JDK 1.0 auf 22 im JDK 1.1, 50 im
JDK 1.2, 70 im JDK 1.3, 130 im JDK 1.4 und schlie&szlig;lich knapp
200 seit der Java 5 Standard Edition. <a name="vordefiniertestdpakete"></a>

<p>
<table cols=2 border width=100%>

<tr>
<td valign=top align=left width=33%><b>Paket</b></td>
<td valign=top align=left width=66%><b>Bedeutung </b></td></tr>
<tr>
<td valign=top align=left><a name="ixa100766"><a href="index_j.html#ixb100593"><font color=#000080><tt>java.applet</tt></font></a></a></td>
<td valign=top align=left>Applets </td></tr>
<tr>
<td valign=top align=left><a name="ixa100767"><a href="index_j.html#ixb100190"><font color=#000080><tt>java.awt</tt></font></a></a></td>
<td valign=top align=left>Das Abstract Windowing Toolkit inkl. diverser
Unterpakete </td></tr>
<tr>
<td valign=top align=left><a name="ixa100768"><a href="index_j.html#ixb100594"><font color=#000080><tt>java.beans</tt></font></a></a></td>
<td valign=top align=left>Java Beans </td></tr>
<tr>
<td valign=top align=left><a name="ixa100769"><a href="index_j.html#ixb100189"><font color=#000080><tt>java.io</tt></font></a></a></td>
<td valign=top align=left>Bildschirm- und Datei-I/O </td></tr>
<tr>
<td valign=top align=left><a name="ixa100770"><a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a></a></td>
<td valign=top align=left>Elementare Sprachunterst&uuml;tzung </td></tr>
<tr>
<td valign=top align=left><a name="ixa100771"><a href="index_j.html#ixb100595"><font color=#000080><tt>java.lang.ref</tt></font></a></a></td>
<td valign=top align=left>Referenz-Objekte </td></tr>
<tr>
<td valign=top align=left><a name="ixa100772"><a href="index_j.html#ixb100596"><font color=#000080><tt>java.lang.reflect</tt></font></a></a></td>
<td valign=top align=left>Reflection-API </td></tr>
<tr>
<td valign=top align=left><a name="ixa100773"><a href="index_j.html#ixb100597"><font color=#000080><tt>java.math</tt></font></a></a></td>
<td valign=top align=left>Flie&szlig;komma-Arithmetik </td></tr>
<tr>
<td valign=top align=left><a name="ixa100774"><a href="index_j.html#ixb100194"><font color=#000080><tt>java.net</tt></font></a></a></td>
<td valign=top align=left>Netzwerkunterst&uuml;tzung </td></tr>
<tr>
<td valign=top align=left><a name="ixa100775"><a href="index_j.html#ixb100598"><font color=#000080><tt>java.nio</tt></font></a></a></td>
<td valign=top align=left>Das seit dem JDK 1.4 vorhandene <a name="ixa100776"><i>New I/O
Package</i></a> </td></tr>
<tr>
<td valign=top align=left><a name="ixa100777"><a href="index_j.html#ixb100600"><font color=#000080><tt>java.rmi</tt></font></a></a></td>
<td valign=top align=left>Remote Method Invocation (RMI) </td></tr>
<tr>
<td valign=top align=left><a name="ixa100778"><a href="index_j.html#ixb100601"><font color=#000080><tt>java.security</tt></font></a></a></td>
<td valign=top align=left>Security-Dienste </td></tr>
<tr>
<td valign=top align=left><a name="ixa100779"><a href="index_j.html#ixb100193"><font color=#000080><tt>java.sql</tt></font></a></a></td>
<td valign=top align=left>Datenbankzugriff (JDBC) </td></tr>
<tr>
<td valign=top align=left><a name="ixa100780"><a href="index_j.html#ixb100556"><font color=#000080><tt>java.text</tt></font></a></a></td>
<td valign=top align=left>Internationalisierung </td></tr>
<tr>
<td valign=top align=left><a name="ixa100781"><a href="index_j.html#ixb100127"><font color=#000080><tt>java.util</tt></font></a></a></td>
<td valign=top align=left>Diverse Utilities, Collection-Klassen und
Datenstrukturen </td></tr>
</table>
<p><i>
Tabelle 13.1: Wichtige Standard-Pakete des JDK </i></p>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Neben den Standardpaketen gibt es seit der Version 1.2 des JDK eine
Reihe von <a name="ixa100782"><i>Standarderweiterungen</i></a>, deren
Paketname mit <font color="#000077"><tt>javax.</tt></font><a name="ixa100783"></a>
beginnt. Sie stellen erweiterte Funktionalit&auml;ten in einem oder
mehreren <font color="#660099">.jar</font>-Dateien zur Verf&uuml;gung
und werden typischerweise im Unterverzeichnis <font color="#660099">lib\ext</font>
des JDK installiert. Im Gegensatz zu den Standardpaketen des JDK sind
sie nicht unbedingt Bestandteil jedes Java-Entwicklungssystems und
m&uuml;ssen nicht auf allen Plattformen zur Verf&uuml;gung stehen.
Sie stellen h&auml;ufig gebrauchte Erweiterungen zur Verf&uuml;gung,
deren Umfang die reinen Kernbibliotheken um ein Vielfaches &uuml;bertrifft:</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
<tr>
<td><font color="#FFFFFF">&nbsp;JDK1.1-6.0&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
</tr>
</table>
<a name="vordefinierteextpakete"></a>
<p>
<table cols=2 border width=100%>

<tr>
<td valign=top align=left width=33%><b>Paket</b></td>
<td valign=top align=left width=66%><b>Bedeutung </b></td></tr>
<tr>
<td valign=top align=left><a name="ixa100784"><a href="index_j.html#ixb100604"><font color=#000080><tt>javax.accessibility</tt></font></a></a></td>
<td valign=top align=left>Unterst&uuml;tzung f&uuml;r Braille-Zeilen
und &auml;hnliche Ein-/Ausgabeger&auml;te </td></tr>
<tr>
<td valign=top align=left><a name="ixa100785"><a href="index_j.html#ixb100605"><font color=#000080><tt>javax.crypto</tt></font></a></a></td>
<td valign=top align=left>Kryptografische Erweiterungen </td></tr>
<tr>
<td valign=top align=left><a name="ixa100786"><a href="index_j.html#ixb100606"><font color=#000080><tt>javax.imageio</tt></font></a></a></td>
<td valign=top align=left>Lesen und Schreiben von Bilddateien </td></tr>
<tr>
<td valign=top align=left><a name="ixa100787"><a href="index_j.html#ixb100607"><font color=#000080><tt>javax.naming</tt></font></a></a></td>
<td valign=top align=left>Zugriff auf Namens-Services </td></tr>
<tr>
<td valign=top align=left><a name="ixa100788"><a href="index_j.html#ixb100608"><font color=#000080><tt>javax.print</tt></font></a></a></td>
<td valign=top align=left>Unterst&uuml;tzung zum Drucken </td></tr>
<tr>
<td valign=top align=left><a name="ixa100789"><a href="index_j.html#ixb100609"><font color=#000080><tt>javax.security.auth</tt></font></a></a></td>
<td valign=top align=left>Authentifizierung und Autorisierung </td></tr>
<tr>
<td valign=top align=left><a name="ixa100790"><a href="index_j.html#ixb100610"><font color=#000080><tt>javax.sound</tt></font></a></a></td>
<td valign=top align=left>Das Sound-API </td></tr>
<tr>
<td valign=top align=left><a name="ixa100791"><a href="index_j.html#ixb100192"><font color=#000080><tt>javax.swing</tt></font></a></a></td>
<td valign=top align=left>Das SWING-Toolkit </td></tr>
<tr>
<td valign=top align=left><a name="ixa100792"><a href="index_j.html#ixb100611"><font color=#000080><tt>javax.xml</tt></font></a></a></td>
<td valign=top align=left>Zugriff auf XML-Dateien </td></tr>
</table>
<p><i>
Tabelle 13.2: Wichtige Standarderweiterungen des JDK </i></p>

<p>
Des weiteren sind einige Pakete im JDK enthalten, deren Inhalt von
Dritten hergestellt wurde. Beispiele daf&uuml;r sind die diversen
Pakete unterhalb der <a name="ixa100793"><a href="index_o.html#ixb100612"><font color=#000080><tt>org.omg</tt></font></a></a>-Hierarchie,
mit deren Hilfe CORBA-Support<a name="ixa100794"></a> zur Verf&uuml;gung
gestellt wird. Oder die Paket-Hierarchien <a name="ixa100795"><a href="index_o.html#ixb100613"><font color=#000080><tt>org.xml</tt></font></a></a>
und <a name="ixa100796"><a href="index_o.html#ixb100614"><font color=#000080><tt>org.w3c</tt></font></a></a>,
die Unterst&uuml;tzung zum Zugriff auf <a name="ixa100797"><i>XML-Dateien</i></a>
zur Verf&uuml;gungv stellen. 

<!-- Section -->

<a name="bedeutungpaketnamen"></a>
<h3>13.2.2 Die Bedeutung der Paketnamen </h3>

<p>
Paketnamen bestehen in Java aus mehreren Komponenten, die durch Punkte
voneinander getrennt sind. Neben der Aufgabe, die Paketnamen <i>visuell</i>
zu strukturieren, hat die Unterteilung aber noch eine andere, sehr
viel wichtigere Bedeutung. 

<p>
Jeder Teil eines mehrstufigen Paketnamens bezeichnet n&auml;mlich
ein Unterverzeichnis auf dem Weg zu der gew&uuml;nschten Klassendatei.
Soll beispielsweise eine Klasse aus dem Paket <a href="index_j.html#ixb100112"><font color=#000080><tt>java.awt.image</tt></font></a>
eingebunden werden, sucht es der Java-Compiler im Unterverzeichnis
<font color="#660099">java\awt\image</font>. Soll dagegen eine Klasse
aus dem Paket <a name="ixa100798"><a href="index_c.html#ixb100616"><font color=#000080><tt>com.sun.image.codec.jpeg</tt></font></a></a>
geladen werden, wird es im Unterverzeichnis <font color="#660099">com\sun\image\codec\jpeg</font>
gesucht. Interessant ist in diesem Zusammenhang nat&uuml;rlich die
Frage, in welchem Verzeichnis der Compiler mit der Suche beginnt.
Bei der Antwort darauf muss zwischen den JDKs 1.2, 1.3 und 1.4 und
ihren Vorg&auml;ngerversionen 1.0 und 1.1 unterschieden werden. 

<!-- Section -->

<a name="sectlevel4id013002002001"></a>
<h4>Laden von Klassen im JDK 1.0 und 1.1 </h4>

<p>
Wurde keine Umgebungsvariable <a name="ixa100799"><a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a></a>
angegeben und der Schalter <a href="index_0.html#ixb100183"><font color=#000080><tt>-classpath</tt></font></a>
beim Compiler-Aufruf nicht verwendet, so suchen der Java-Compiler
und die &uuml;brigen Tools in einem systemspezifischen Installationsverzeichnis
(z.B. <font color="#660099">c:\java1.1.7\lib</font> beim JDK 1.1.7)
und zus&auml;tzlich im aktuellen Verzeichnis nach den Klassendateien.

<p>
Anders als im JDK 1.0 ist es bei einer Standardinstallation des JDK
1.1 unter Windows 95 nicht erforderlich, den <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
explizit zu setzen. Alle Tools generieren den <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
implizit aus der Position des <font color="#660099">bin</font>-Verzeichnisses
(z.B. <font color="#660099">c:\java1.1.7\bin</font>) nach folgendem
Schema: 
<font color="#000077">
<pre>
.;[bin]\..\classes;[bin]\..\lib\classes.zip
</pre>
</font>

<p>
<font color="#000077"><tt>[bin]</tt></font> steht hier f&uuml;r den
Pfad des <font color="#660099">bin</font>-Verzeichnisses. Nur wenn
die Klassendateien in einem anderen Verzeichnis liegen oder Klassendateien
in weiteren Verzeichnissen eingebunden werden sollen, muss die <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>-Variable
manuell ge&auml;ndert werden. 

<p>
Existiert zum Zeitpunkt des Compiler-Aufrufs die Umgebungsvariable
<a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>,
beginnt der Compiler die Suche nach den eingebundenen Klassen in allen
im <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
angegebenen Verzeichnissen. Die einzelnen Verzeichnisse werden durch
ein Semikolon (bzw. einen Doppelpunkt unter UNIX) voneinander getrennt.

<p>
Beim Aufruf des Compilers kann der Schalter <a href="index_0.html#ixb100183"><font color=#000080><tt>-classpath</tt></font></a>,
gefolgt von einer Liste von Verzeichnisnamen, &uuml;bergeben werden.
Er hat dieselbe Bedeutung wie die Umgebungsvariable <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
und definiert die Verzeichnisse, in denen der Compiler nach den <font color="#660099">.class</font>-Dateien
sucht. Der Compiler-Schalter hat dabei Vorrang gegen&uuml;ber einer
m&ouml;glichen Umgebungsvariablen. 

<!-- Section -->

<a name="sectlevel4id013002002002"></a>
<h4>Laden von Klassen seit dem JDK 1.2 </h4>

<p>
Die Verwendung der <a name="ixa100800"><a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a></a>-Variable
hat immer wieder zu Schwierigkeiten und Missverst&auml;ndnissen gef&uuml;hrt.
Es ist insbesondere h&auml;ufig passiert, dass durch falsches Setzen
der Umgebungsvariable die Systemklassen selbst nicht mehr gefunden
werden konnten und auf diese Weise das gesamte Laufzeitsystem unbenutzbar
wurde. 

<p>
Seit dem JDK 1.2 wurde daher die Bedeutung der <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>-Umgebungsvariable
dahingehend ver&auml;ndert, dass sie nur noch zur Suche der <i>benutzerspezifischen</i>
Klassen verwendet wird. Alle Standardpakete und Standarderweiterungen
(beide zusammen werden seit dem JDK 1.2 <a name="ixa100801"><i>Bootstrap Classes</i></a>
genannt) werden dagegen unabh&auml;ngig vom <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
mit Hilfe der auf das Installationsverzeichnis verweisenden Systemeigenschaft
<a name="ixa100802"><a href="index_s.html#ixb100618"><font color=#000080><tt>sun.boot.class.path</tt></font></a></a>
gefunden. Sie wird bei der JDK-Installation automatisch gesetzt und
sollte sp&auml;ter nicht mehr ver&auml;ndert werden. Der <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
braucht also nur noch dann explizit gesetzt zu werden, wenn benutzerspezifische
Klassen vorhanden sind, die nicht im aktuellen Verzeichnis liegen
(letzteres wird ebenfalls automatisch durchsucht). 
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Falls Sie zuvor eine &auml;ltere Versionen des Java Development Kit
auf Ihrem Rechner installiert hatten, &uuml;berpr&uuml;fen Sie bitte
nach der Installation die Umgebungsvariablen. Sorgen Sie daf&uuml;r,
dass nicht ein veralteter <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>
auf Verzeichnisse oder Dateien verweist, aus denen das Laufzeitsystem
versehentlich unbrauchbare Klassendateien laden w&uuml;rde.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>


<!-- Section -->
<a name="sectlevel4id013002002003"></a>
<h4>Die Dateien classes.zip und rt.jar </h4>

<p>
Im Installationsverzeichnis von JDKs der Versionen 1.0 und 1.1 findet
man meist eine Datei <font color="#660099">classes.zip</font><a name="ixa100803"></a>
anstelle der erw&auml;hnten Unterverzeichnisse mit den Klassendateien.
Aus Gr&uuml;nden der Performance beim &Uuml;bersetzen haben sich die
Entwickler entschlossen, alle Standardklassendateien in diesem Archiv
abzulegen, um einen schnelleren Lesezugriff auf sie zu erm&ouml;glichen.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Die Datei <font color="#660099">classes.zip</font> sollte nicht ausgepackt
werden, denn der Compiler verwendet sie in archivierter Form. Obwohl
beim Einpacken der Klassen auf die Komprimierung verzichtet wurde,
bietet diese Form der Archivierung den Vorteil, dass viele kleine
Dateien in einer einzigen gro&szlig;en zusammengefasst werden. Zeitaufw&auml;ndige
Verzeichniszugriffe und -wechsel k&ouml;nnen so entfallen, wenn der
Compiler nach Klassennamen suchen muss oder den Inhalt einer Klassendatei
lesen will.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>

<p>
Um dem Compiler diese Art der Speicherung der Klassendateien bekanntzumachen,
muss in der <a name="ixa100804"><a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a></a>-Umgebungsvariable
nicht nur das Verzeichnis, sondern auch der Name der <font color="#660099">.zip</font>-Datei
angegeben werden, z.B.: 
<font color="#000077">
<pre>
CLASSPATH=.;c:\java\LIB\CLASSES.ZIP
</pre>
</font>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Seit dem JDK 1.2 gibt es die Datei <font color="#660099">classes.zip</font>
nicht mehr. Die Klassenbibliotheken liegen nun als <font color="#660099">.jar</font>-Dateien
(z.B. <font color="#660099">rt.jar</font> <a name="ixa100805"></a>)
vor und befinden sich im Unterverzeichnis <font color="#660099">jre\lib</font>
der JDK-Installation. Wie zuvor erw&auml;hnt, werden sie unabh&auml;ngig
vom Inhalt der <a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a>-Umgebungsvariable
gefunden. Weitere Informationen zu jar-Dateien finden Sie in <a href="k100317.html#kapitelwerkzeuge">Kapitel 51</a>.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#FF9900">
<tr>
<td><font color="#FFFFFF">&nbsp;JDK1.1-6.0&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#FF9900"><img src="trp1_1.gif"></td>
</tr>
</table>


<!-- Section -->
<a name="sectlevel4id013002002004"></a>
<h4>Umgekehrte Domain-Namen </h4>

<p>
Die Entwickler von Java haben sich einen Mechanismus ausgedacht, um
auch bei sehr gro&szlig;en Projekten, an denen m&ouml;glicherweise
viele Entwickler beteiligt sind, Namenskollisionen zwischen den beteiligten
Klassen und Paketen zu vermeiden. Auch die Verwendung einer gro&szlig;en
Anzahl unterschiedlicher Klassenbibliotheken von verschiedenen Herstellern
sollte m&ouml;glich sein, ohne dass Namens&uuml;berschneidungen dies
schon im Keim ersticken. 

<p>
Um diese Probleme zu l&ouml;sen, hat sich das Java-Team eine Vorgehensweise
zur Vergabe von Paketnamen &uuml;berlegt, die an das <i>Domain-Namen</i>-System
bei Internet-Adressen angelehnt ist. Danach sollte jeder Anbieter
seine Pakete entsprechend dem eigenen Domain-Namen benennen, dabei
allerdings die Namensbestandteile in umgekehrter Reihenfolge verwenden.

<p>
So sollten beispielsweise die Klassen der Firma SUN, deren Domain-Name
<font color="#000077"><tt>sun.com</tt></font> ist, in einem Paket
<font color="#000077"><tt>com.sun</tt></font> oder in darunter befindlichen
Subpaketen liegen. Da die Domain-Namen weltweit eindeutig sind, werden
Namenskollisionen zwischen Paketen unterschiedlicher Hersteller auf
diese Weise von vornherein vermieden. Beispiele f&uuml;r derartige
Paketnamen liefert die Standardinstallation gleich mit. So stellt
das JDK 1.2 diverse Pakete <font color="#000077"><tt>com.sun.*</tt></font>
zur Verf&uuml;gung. Sie geh&ouml;ren nicht zum Standard-Sprachumfang
eines Java-Entwicklungssystems, sondern werden von SUN als eigenst&auml;ndige
Erweiterung mit dem JDK ausgeliefert. 
<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>
Unterhalb des Basispakets k&ouml;nnen Unterpakete beliebig geschachtelt
werden. Die Namensvergabe liegt dabei in der Entscheidung des Unternehmens.
Gibt es beispielsweise die Abteilungen <font color="#000077"><tt>is</tt></font>,
<font color="#000077"><tt>se</tt></font> und <font color="#000077"><tt>tx</tt></font>
in einem Unternehmen mit der Domain <font color="#000077"><tt>tl.de</tt></font>,
kann es sinnvoll sein, diese Abteilungsnamen auch als Unterprojekte
zu verwenden. Die von diesen Abteilungen erstellten Klassen w&uuml;rden
dann in den Paketen <font color="#000077"><tt>de.tl.is</tt></font>,
<font color="#000077"><tt>de.tl.se</tt></font> und <font color="#000077"><tt>de.tl.tx</tt></font>
liegen.</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">&nbsp;Hinweis&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>

<p>
Der Vollst&auml;ndigkeit halber sollte man anmerken, dass sich das
hier beschriebene System in der Praxis noch nicht komplett durchgesetzt
hat und insbesondere die Klassen der <font color="#000077"><tt>java.*</tt></font>-
und <font color="#000077"><tt>javax.*</tt></font>-Hierarchie Ausnahmen
bilden. Es wird mit der zunehmenden Anzahl allgemein verf&uuml;gbarer
Pakete jedoch an Bedeutung gewinnen. Manche Entwickler verwenden ein
leicht abgewandeltes Schema, bei dem nur die Top-Level-Domain ausgelassen
wird. Die Paketnamen beginnen in diesem Fall nicht mit <font color="#000077"><tt>org</tt></font>
oder <font color="#000077"><tt>com</tt></font>, sondern direkt mit
dem zweiten Teil des Domain-Namens (oder einem &auml;hnlichen herstellerspezifischen
K&uuml;rzel). Dadurch werden sie etwas k&uuml;rzer und sind leichter
zu handhaben. 

<!-- Section -->

<a name="zuspaketeeinbinden"></a>
<h3>13.2.3 Einbinden zus&auml;tzlicher Pakete<a name="ixa100806"></a>
</h3>

<p>
In der Praxis wird man neben der Klassenbibliothek des JDK h&auml;ufig
zus&auml;tzliche Pakete von Drittanbietern verwenden wollen. Um den
Klassenpfad nicht unn&ouml;tig lang werden zu lassen, empfiehlt es
sich, die Pakete in einem gemeinsamen Verzeichnis abzulegen. Falls
sich alle Entwickler von Libraries an das oben besprochene Schema
zur Vergabe von Paketnamen halten, kann es keine &Uuml;berschneidungen
geben. 

<p>
Als Beispiel wollen wir einige Java-Klassen des Autors (zu finden
als Datei <font color="#660099">gkjava.zip</font> unter <a href="http://www.gkrueger.com">http://www.gkrueger.com</a>
oder auf der DVD zum Buch im Verzeichnis <font color="#660099">\misc</font>)
und die Utilities der &#187;ACME-Labs&#171; von Jef Poskanzer (<a href="http://www.acme.com">http://www.acme.com</a>)
installieren: 
<ul>
<li>Zun&auml;chst legen wir ein gemeinsames Unterverzeichnis f&uuml;r
unsere Klassendateien an, beispielsweise <font color="#660099">c:\classes</font>.
<li>Nun wird die <font color="#660099">.zip</font>-Datei mit den Klassen
des Autors geladen und im Verzeichnis <font color="#660099">c:\classes</font>
ausgepackt. Da alle Paketnamen mit <font color="#000077"><tt>gk</tt></font>
beginnen, landen alle Dateien im Unterverzeichnis <font color="#660099">gk</font>.
<li>Auf die gleiche Weise packen wir die Klassendateien von Jef Poskanzer
aus. Alle Klassen liegen im Paket <font color="#000077"><tt>acme</tt></font>
oder in Unterpaketen und landen damit im Unterverzeichnis <font color="#660099">acme</font>.
<li>Nun braucht lediglich noch der <a name="ixa100807"><a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a></a>
so gesetzt zu werden, dass er das Verzeichnis <font color="#660099">c:\classes</font>
beinhaltet: 
<font color="#000077">
<pre>
set CLASSPATH=.;c:\classes
</pre>
</font>
</ul>

<p>
Alle Libraries, die sich an diese Konventionen halten, k&ouml;nnen
in der beschriebenen Weise installiert werden. Probleme gibt es nur,
wenn ein Anbieter seine Klassendateien nicht in Paketen ablegt. In
diesem Fall m&uuml;ssten die Klassendateien in das aktuelle Verzeichnis
oder nach <font color="#660099">c:\classes</font> kopiert werden.
Das w&uuml;rde bei Klassendateien von mehr als einem Anbieter nat&uuml;rlich
schnell zum Chaos f&uuml;hren, l&auml;&szlig;t sich aber nicht so
einfach &auml;ndern. Es bieten sich zwei Handlungsalternativen an:
<ul>
<li>Wenn man die Pakete in unterschiedlichen Unterverzeichnissen ablegt,
ben&ouml;tigen die Programme einen relativ langen und m&ouml;glicherweise
schwer zu pflegenden Klassenpfad, in dem alle ben&ouml;tigten Verzeichnisse
verzeichnet sind.
<li>Wenn man die &#187;paketlosen&#171; Dateien verschiedener Anbieter
in unterschiedliche Unterverzeichnisse von <font color="#660099">c:\classes</font>
legen will, m&uuml;sste man dazu die Quelldateien um die entsprechenden
<a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>-Anweisungen
(siehe nachfolgenden Abschnitt) erg&auml;nzen.
</ul>

<p>
Beide Varianten sind unbefriedigend, und es bleibt zu hoffen, dass
die Anbieter von Java-Klassenbibliotheken sich verst&auml;rkt an die
Namenskonventionen des Java-Teams halten werden. 

<!-- Section -->

<a name="sectlevel3id013002004"></a>
<h3>13.2.4 <a name="ixa100808">Erstellen eigener Pakete</a><a name="ixa100809"></a></h3>


<!-- Section -->
<a name="sectlevel4id013002004001"></a>
<h4>Benannte Pakete </h4>

<p>
Bisher wurde nur gezeigt, wie man Klassen aus fremden Paketen verwendet,
nicht aber, wie man selbst Pakete erstellt. Gl&uuml;cklicherweise
ist das aber keine Aufgabe f&uuml;r Spezialisten, sondern sehr einfach
mit Bordmitteln realisierbar. 

<p>
Um eine Klasse einem ganz bestimmten Paket zuzuordnen, muss lediglich
am Anfang des Quelltextes eine geeignete <a name="ixa100810"><a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a></a>-Anweisung
verwendet werden. Diese besteht (analog zur <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung)
aus dem Schl&uuml;sselwort <a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>
und dem Namen des Pakets, dem die nachfolgende Klasse zugeordnet werden
soll. Die <a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>-Anweisung
muss als erste Anweisung in einer Quelldatei stehen, so dass der Compiler
sie noch vor den <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisungen
findet. 

<p>
Der Aufbau und die Bedeutung der Paketnamen in der <a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>-Anweisung
entspricht exakt dem der <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung.
Der Compiler l&ouml;st ebenso wie beim <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>
den dort angegebenen hierarchischen Namen in eine Kette von Unterverzeichnissen
auf, an deren Ende die Quelldatei steht. Neben der Quelldatei wird
auch die Klassendatei in diesem Unterverzeichnis erstellt. 

<p>
Da der Java-Compiler eingebundene Quelldateien, die noch nicht &uuml;bersetzt
sind, w&auml;hrend der &Uuml;bersetzung einer anderen Klasse automatisch
mit &uuml;bersetzt, ist das Erstellen eines neuen Pakets sehr einfach.
Wir wollen uns ein Beispiel ansehen, bei dem zwei Pakete <font color="#000077"><tt>demo</tt></font>
und <font color="#000077"><tt>demo.tools</tt></font> angelegt und
die darin enthaltenen Klassen <font color="#000077"><tt>A</tt></font>,
<font color="#000077"><tt>B</tt></font> und <font color="#000077"><tt>C</tt></font>
in einer Klasse <font color="#000077"><tt>PackageDemo</tt></font>
verwendet werden. Am einfachsten ist es, wie nachfolgend beschrieben
vorzugehen. 

<p>
Wir gehen davon aus, dass der <a name="ixa100811"><a href="index_c.html#ixb100143"><font color=#000080><tt>CLASSPATH</tt></font></a></a>
das aktuelle Verzeichnis enth&auml;lt (also beispielsweise den Inhalt
&#187;.;c:\classes&#171; hat), und legen im aktuellen Verzeichnis
die Unterverzeichnisse <font color="#660099">demo</font> und <font color="#660099">demo\tools</font>
an. 
<ul>
<li>Zun&auml;chst wird im Unterverzeichnis <font color="#660099">demo</font>
die Datei <font color="#660099">A.java</font> angelegt: 
<a name="listingid013003"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">package</font> demo;
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> A
<font color="#555555">004 </font>{
<font color="#555555">005 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> hello()
<font color="#555555">006 </font>  {
<font color="#555555">007 </font>    System.out.println(<font color="#0000FF">"Hier ist A"</font>);
<font color="#555555">008 </font>  }
<font color="#555555">009 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/demo/A.java"><font color="#000055" size=-1>demo/A.java</font></a></td>
</tr>
</table>
<i>
Listing 13.3: Die Klasse A des Pakets demo</i></p>

<p>
Sie enth&auml;lt die Anweisung <font color="#000077"><tt>package demo;</tt></font>,
um anzuzeigen, dass die Klasse <font color="#000077"><tt>A</tt></font>
zum Paket <font color="#000077"><tt>demo</tt></font> geh&ouml;rt.
<li>Im Unterverzeichnis <font color="#660099">demo</font> wird weiterhin
die Datei <font color="#660099">B.java</font> angelegt: 
<a name="listingid013004"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">package</font> demo;
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> B
<font color="#555555">004 </font>{
<font color="#555555">005 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> hello()
<font color="#555555">006 </font>  {
<font color="#555555">007 </font>    System.out.println(<font color="#0000FF">"Hier ist B"</font>);
<font color="#555555">008 </font>  }
<font color="#555555">009 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/demo/B.java"><font color="#000055" size=-1>demo/B.java</font></a></td>
</tr>
</table>
<i>
Listing 13.4: Die Klasse B des Pakets demo</i></p>

<p>
Auch diese Quelldatei enth&auml;lt die Anweisung <font color="#000077"><tt>package
demo;</tt></font>, um anzuzeigen, dass die Klasse zum Paket <font color="#000077"><tt>demo</tt></font>
geh&ouml;rt. 
<li>Im Unterverzeichnis <font color="#660099">demo\tools</font> wird
die Datei <font color="#660099">C.java</font> angelegt: 
<a name="listingid013005"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">package</font> demo.tools;
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> C
<font color="#555555">004 </font>{
<font color="#555555">005 </font>  <font color="#0000AA">public</font> <font color="#006699">void</font> hello()
<font color="#555555">006 </font>  {
<font color="#555555">007 </font>    System.out.println(<font color="#0000FF">"Hier ist C"</font>);
<font color="#555555">008 </font>  }
<font color="#555555">009 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/demo/tools/C.java"><font color="#000055" size=-1>demo/tools/C.java</font></a></td>
</tr>
</table>
<i>
Listing 13.5: Die Klasse C des Pakets demo.tools</i></p>

<p>
Diese Quelldatei enth&auml;lt die Anweisung <font color="#000077"><tt>package
demo.tools;</tt></font>, um anzuzeigen, dass die Klasse zum Paket
<font color="#000077"><tt>demo.tools</tt></font> geh&ouml;rt. 
<li>Nun wird im Stammverzeichnis die Datei <font color="#660099">PackageDemo.java</font>
angelegt: 
<a name="listingid013006"></a>

<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">import</font> demo.*;
<font color="#555555">002 </font><font color="#0000AA">import</font> demo.tools.*;
<font color="#555555">003 </font>
<font color="#555555">004 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> PackageDemo
<font color="#555555">005 </font>{
<font color="#555555">006 </font>  <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
<font color="#555555">007 </font>  {
<font color="#555555">008 </font>    (<font color="#0000AA">new</font> A()).hello();
<font color="#555555">009 </font>    (<font color="#0000AA">new</font> B()).hello();
<font color="#555555">010 </font>    (<font color="#0000AA">new</font> C()).hello();
<font color="#555555">011 </font>  }
<font color="#555555">012 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/PackageDemo.java"><font color="#000055" size=-1>PackageDemo.java</font></a></td>
</tr>
</table>
<i>
Listing 13.6: Verwendung der Klassen aus selbstdefinierten Paketen</i></p>
</ul>

<p>
Ohne vorher die Klassen <font color="#000077"><tt>A</tt></font>, <font color="#000077"><tt>B</tt></font>
oder <font color="#000077"><tt>C</tt></font> separat &uuml;bersetzen
zu m&uuml;ssen, kann nun einfach <font color="#000077"><tt>PackageDemo</tt></font>
kompiliert werden. Der Compiler erkennt die Verwendung von <font color="#000077"><tt>A</tt></font>,
<font color="#000077"><tt>B</tt></font> und <font color="#000077"><tt>C</tt></font>,
findet die Paketverzeichnisse <font color="#660099">demo</font> und
<font color="#660099">demo\tools</font> und erkennt, dass die Quellen
noch nicht &uuml;bersetzt wurden. Er erzeugt dann aus den <font color="#660099">.java</font>-Dateien
<a name="ixa100812"></a> die zugeh&ouml;rigen <font color="#660099">.class</font>-Dateien
<a name="ixa100813"></a> (in demselben Verzeichnis wie die Quelldateien),
bindet sie ein und &uuml;bersetzt schlie&szlig;lich die Klasse <font color="#000077"><tt>PackageDemo</tt></font>.
Die Ausgabe des Programms ist: 
<font color="#333300">
<pre>
Hier ist A
Hier ist B
Hier ist C
</pre>
</font>


<!-- Section -->
<a name="sectlevel4id013002004002"></a>
<h4>Das <a name="ixa100814">Default-Paket</a> </h4>

<p>
W&uuml;rde nur dann ein eigenes Paket erzeugt werden, wenn die Quelldatei
eine <a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>-Anweisung
enth&auml;lt, m&uuml;sste man sich fragen, zu welchem Paket die Klassen
geh&ouml;ren, in deren Quelldatei die <a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>-Anweisung
fehlt (was ja erlaubt ist). Die Antwort auf diese Frage lautet, dass
es in Java ein <i>Default-Paket</i> gibt, das genau dann verwendet
wird, wenn keine andere Zuordnung getroffen wurde. 

<p>
Das Default-Paket ist ein Zugest&auml;ndnis an kleinere Programme
oder einfache Programmierprojekte, bei denen es sich nicht lohnt,
eigene Pakete anzulegen. Ohne Teile des Projektes in Unterverzeichnissen
abzulegen und durch <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-
und <a href="index_p.html#ixb100622"><font color=#000080><tt>package</tt></font></a>-Anweisungen
unn&ouml;tigen Aufwand zu treiben, ist es auf diese Weise m&ouml;glich,
Quelldateien einfach im aktuellen Verzeichnis abzulegen, dort zu kompilieren
und automatisch einzubinden. Klassen des Default-Pakets k&ouml;nnen
ohne explizite <a href="index_i.html#ixb100169"><font color=#000080><tt>import</tt></font></a>-Anweisung
verwendet werden. 
<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>
Ein Java-Compiler braucht laut Spezifikation nur ein einziges Default-Paket
zur Verf&uuml;gung zu stellen. Typischerweise wird dieses Konzept
aber so realisiert, dass jedes unterschiedliche Verzeichnis die Rolle
eines Default-Pakets &uuml;bernimmt. Auf diese Weise lassen sich beliebig
viele Default-Pakete erzeugen, indem bei Bedarf einfach ein neues
Unterverzeichnis angelegt wird und die Quelldateien eines Java-Projektes
dort abgelegt werden.</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">&nbsp;Hinweis&nbsp;</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="sectlevel4id013002004003"></a>
<h4>Das public-Attribut<a name="ixa100815"></a> </h4>

<p>
Es gibt noch eine wichtige Besonderheit bei der Deklaration von Klassen,
die von anderen Klassen verwendet werden sollen. Damit eine Klasse
<font color="#000077"><tt>A</tt></font> eine andere Klasse <font color="#000077"><tt>B</tt></font>
einbinden darf, muss n&auml;mlich eine der beiden folgenden Bedingungen
erf&uuml;llt sein: 
<ul>
<li>Entweder geh&ouml;ren <font color="#000077"><tt>A</tt></font>
und <font color="#000077"><tt>B</tt></font> zu demselben Paket oder
<li>die Klasse <font color="#000077"><tt>B</tt></font> wurde als <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>
deklariert.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Wenn also nur Default-Pakete verwendet werden, spielt es keine Rolle,
ob eine Klasse vom Typ <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>
ist, denn alle Klassen liegen in demselben Paket. Werden aber Klassen
aus externen Paketen eingebunden, so gelingt das nur, wenn die einzubindende
Klasse vom Typ <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>
ist. Andernfalls verweigert der Compiler deren Einbindung und bricht
die &Uuml;bersetzung mit einer Fehlermeldung ab.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF">&nbsp;Warnung&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</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="k100083.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100084.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100086.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>