handbuch der javaprogrammierung

1275
Handbuch der Java-Programmierung 4. Auflage

Upload: phamnguyet

Post on 08-Dec-2016

278 views

Category:

Documents


31 download

TRANSCRIPT

  • Handbuch derJava-Programmierung4. Auflage

  • An imprint of Pearson Education

    Mnchen Boston San Francisco Harlow, EnglandDon Mills, Ontario Sydney Mexico CityMadrid Amsterdam

    Guido Krger

    Handbuch derJava-Programmierung

    4. Auflage

    praktit01NotizCompleted festgelegt von praktit01

    praktit01NotizMigrationConfirmed festgelegt von praktit01

  • Bibliografische Information Der Deutschen BibliothekDie Deutsche Bibliothek verzeichnet diese Publikation in der DeutschenNationalbibliografie; detaillierte bibliografische Daten sind im Internetber http://dnb.ddb.de abrufbar.

    Die Informationen in diesem Buch werden ohne Rcksicht auf einen eventuellen Patentschutz verffentlicht. Warennamen werden ohne Gewhrleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit grter Sorgfalt vorgegangen. Trotzdem knnen Fehler nicht vollstndig ausgeschlossen werden. Verlag, Herausgeber und Autoren knnen fr fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung bernehmen. Fr Verbesserungsvorschlge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar.

    Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulssig.

    Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwhnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden.

    Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt.Die Einschrumpffolie zum Schutz vor Verschmutzung ist aus umweltvertrglichem und recyclingfhigem PE-Material.

    10 9 8 7 6 5 4 3

    07 06 05

    ISBN 3-8273-2361-4

    2005 by Addison Wesley Verlag,ein Imprint der Pearson Education Deutschland GmbH,Martin-Kollar-Strae 1012, D-81829 Mnchen/GermanyAlle Rechte vorbehaltenEinbandgestaltung: Marco Lindenbeck, webwo GmbH ([email protected])Lektorat: Frank Eller, [email protected]: Simone Meiner, FrstenfeldbruckHerstellung: Elisabeth Prmm, [email protected]: reemers publishing services gmbh, Krefeld, www.reemers.deDruck und Verarbeitung: Ksel, Krugzell (www.KoeselBuch.de)

  • 5Inhaltsverzeichnis

    Vorwort 25

    Die Icons in diesem Buch 29

    Teil I Einleitung 31

    1 Was ist Java? 33

    1.1 Historie 331.2 Eigenschaften von Java 39

    1.2.1 Sprachmerkmale 391.2.2 Applets: Eine neue Klasse von Programmen 421.2.3 Grafikprogrammierung 431.2.4 Umfangreiche Klassenbibliothek 45

    1.3 Bewertung 461.3.1 Einige weitverbreitete Missverstndnisse ... 461.3.2 Ausblick 49

    1.4 Zusammenfassung 51

    2 Schnelleinstieg 53

    2.1 Installation des JDK 532.1.1 Hardware-Voraussetzungen 532.1.2 Installation 54

    2.2 Erste Gehversuche 562.2.1 Quelltext erstellen, bersetzen und ausfhren 572.2.2 Die Beispielprogramme 61

    2.3 Tipps fr eigene Experimente 632.3.1 Der Entwicklungszyklus in Kurzform 632.3.2 Einfache Ausgaben 642.3.3 Einfache Eingaben 652.3.4 Formatierung der Quelltexte 662.3.5 Namenskonventionen 672.3.6 Aufruf von Java-Programmen unter Windows 682.3.7 Troubleshooting 70

    2.4 Zusammenfassung 73

    3 Wie geht es weiter? 75

    3.1 Wie sollte man dieses Buch lesen? 753.1.1 Zu welchem Typ Leser gehren Sie? 753.1.2 Was ist der Inhalt der einzelnen Kapitel? 773.1.3 Wie geht es nun weiter? 79

  • Inhaltsverzeichnis

    6

    3.2 Weiterfhrende Informationen 803.2.1 Die Dokumentation des JDK 803.2.2 Informationen im Internet 823.2.3 Die HTML-Ausgabe 853.2.4 Die im Buch verwendete UML-Notation 88

    3.3 Zusammenfassung 90

    Teil II Grundlagen der Sprache 91

    4 Datentypen 93

    4.1 Lexikalische Elemente eines Java-Programms 934.1.1 Eingabezeichen 934.1.2 Kommentare 934.1.3 Bezeichner 944.1.4 Weitere Unterschiede zu C 95

    4.2 Primitive Datentypen 954.2.1 Der logische Typ 974.2.2 Der Zeichentyp 974.2.3 Die integralen Typen 984.2.4 Die Fliekommazahlen 99

    4.3 Variablen 1004.3.1 Grundeigenschaften 1004.3.2 Deklaration von Variablen 1004.3.3 Lebensdauer/Sichtbarkeit 101

    4.4 Arrays 1024.4.1 Deklaration und Initialisierung 1024.4.2 Zugriff auf Array-Elemente 1044.4.3 Mehrdimensionale Arrays 105

    4.5 Referenztypen 1064.5.1 Beschreibung 1064.5.2 Speichermanagement 107

    4.6 Typkonvertierungen 1084.6.1 Standardkonvertierungen 1084.6.2 Vorzeichenlose Bytes 110

    4.7 Zusammenfassung 112

    5 Ausdrcke 113

    5.1 Eigenschaften von Ausdrcken 1135.2 Arithmetische Operatoren 1155.3 Relationale Operatoren 1165.4 Logische Operatoren 1175.5 Bitweise Operatoren 1185.6 Zuweisungsoperatoren 1195.7 Sonstige Operatoren 120

    5.7.1 Weitere Operatoren fr primitive Typen 1205.7.2 Operatoren fr Objekte 1215.7.3 Welche Operatoren es nicht gibt 125

  • Inhaltsverzeichnis

    7

    5.8 Operator-Vorrangregeln 1255.9 Zusammenfassung 128

    6 Anweisungen 129

    6.1 Elementare Anweisungen 1296.1.1 Die leere Anweisung 1296.1.2 Der Block 1296.1.3 Variablendeklarationen 1296.1.4 Ausdrucksanweisungen 130

    6.2 Verzweigungen 1316.2.1 Die if-Anweisung 1316.2.2 Die switch-Anweisung 133

    6.3 Schleifen 1356.3.1 Die while-Schleife 1356.3.2 Die do-Schleife 1356.3.3 Die for-Schleife 135

    6.4 Sonstige Anweisungen 1406.4.1 Die assert-Anweisung 140

    6.5 Zusammenfassung 148

    Teil III Objektorientierte Programmierung 149

    7 OOP I: Grundlagen 151

    7.1 Konzepte objektorientierter Programmiersprachen 1517.1.1 Einfhrung 1517.1.2 Abstraktion 1517.1.3 Kapselung 1527.1.4 Wiederverwendung 1537.1.5 Beziehungen 1537.1.6 Polymorphismus 1567.1.7 Fazit 158

    7.2 Klassen und Objekte in Java 1587.2.1 Klassen 1587.2.2 Objekte 159

    7.3 Methoden 1607.3.1 Definition 1607.3.2 Aufruf 1617.3.3 Parameter 1627.3.4 Variable Parameterlisten 1637.3.5 Rckgabewert 1657.3.6 berladen von Methoden 1667.3.7 Konstruktoren 1677.3.8 Destruktoren 170

    7.4 Zusammenfassung 171

  • Inhaltsverzeichnis

    8

    8 OOP II: Vererbung, Polymorphismus und statische Elemente 173

    8.1 Vererbung 1738.1.1 Ableiten einer Klasse 1738.1.2 Die Klasse Object 1748.1.3 berlagern von Methoden 1758.1.4 Vererbung von Konstruktoren 177

    8.2 Modifier 1788.2.1 Sichtbarkeit 1788.2.2 Die Attribute im berblick 179

    8.3 Statische Methoden und Membervariablen 1838.3.1 Klassenvariablen 1838.3.2 Konstanten 1848.3.3 Klassenmethoden 1848.3.4 Statische Initialisierer 186

    8.4 Abstrakte Klassen und Polymorphismus 1878.4.1 Abstrakte Klassen 1878.4.2 Ein Beispiel fr Polymorphismus 1878.4.3 Polymorphe Methodenaufrufe in Konstruktoren 191

    8.5 Zusammenfassung 192

    9 OOP III: Interfaces 193

    9.1 Grundlagen 1939.1.1 Definition eines Interfaces 1939.1.2 Implementierung eines Interfaces 1939.1.3 Verwenden eines Interfaces 196

    9.2 Das Interface Comparable 1989.3 Mehrfachimplementierung und Vererbung 200

    9.3.1 Mehrfachimplementierung 2009.3.2 Vererbung von Interfaces 2019.3.3 Ableiten von Interfaces 202

    9.4 Weitere Anwendungen von Interfaces 2039.4.1 Konstanten in Interfaces 2039.4.2 Implementierung von Flags 2059.4.3 Nachbildung von Funktionszeigern 206

    9.5 Interfaces und Hilfsklassen 2089.5.1 Die Default-Implementierung 2099.5.2 Delegation an die Default-Implementierung 2109.5.3 Die leere Implementierung 211

    9.6 Zusammenfassung 212

    10 OOP IV: Verschiedenes 213

    10.1 Lokale und anonyme Klassen 21310.1.1 Grundlagen 21310.1.2 Nicht-statische lokale Klassen 21310.1.3 Anonyme Klassen 21610.1.4 Statische lokale Klassen 218

  • Inhaltsverzeichnis

    9

    10.2 Wrapper-Klassen 21910.2.1 Vordefinierte Wrapper-Klassen 21910.2.2 Call by Reference 22210.2.3 Autoboxing und Autounboxing 224

    10.3 Aufzhlungstypen 22510.3.1 Grundlagen 22510.3.2 Erweiterung der Aufzhlungsklasse 228

    10.4 Design-Patterns 22910.4.1 Singleton 23010.4.2 Immutable 23110.4.3 Interface 23310.4.4 Factory 23310.4.5 Iterator 24010.4.6 Delegate 24310.4.7 Composite 24610.4.8 Visitor 24910.4.9 Observer 254

    10.5 Zusammenfassung 257

    Teil IV Weiterfhrende Spracheigenschaften 259

    11 Strings 261

    11.1 Grundlegende Eigenschaften 26111.2 Methoden der Klasse String 261

    11.2.1 Konstruktoren 26211.2.2 Zeichenextraktion 26211.2.3 Die Lnge der Zeichenkette 26311.2.4 Vergleichen von Zeichenketten 26411.2.5 Suchen in Zeichenketten 26611.2.6 Ersetzen von Zeichenketten 26611.2.7 Konvertierungsfunktionen 267

    11.3 Weitere Eigenschaften 26811.3.1 Die Klasse String ist final 26811.3.2 Was ist ein String fr den Compiler? 26811.3.3 String-Objekte sind nicht dynamisch 269

    11.4 Die Klasse StringBuffer 27011.4.1 Konstruktoren 27011.4.2 Einfgen von Elementen 27011.4.3 Lschen von Elementen 27111.4.4 Verndern von Elementen 27111.4.5 Lngeninformationen 27111.4.6 Konvertierung in einen String 271

    11.5 Ausgabeformatierung 27211.5.1 Grundlagen 27211.5.2 Die Formatangaben 273

    11.6 Zusammenfassung 277

  • Inhaltsverzeichnis

    10

    12 Exceptions 279

    12.1 Grundlagen und Begriffe 27912.2 Behandlung von Exceptions 280

    12.2.1 Die try-catch-Anweisung 28012.2.2 Das Fehlerobjekt 28212.2.3 Die Fehlerklassen von Java 28312.2.4 Fortfahren nach Fehlern 28312.2.5 Mehr als eine catch-Klausel 28412.2.6 Die finally-Klausel 286

    12.3 Weitergabe von Exceptions 28712.3.1 Die catch-or-throw-Regel 28712.3.2 Weitergabe einer Exception 28812.3.3 Auslsen von Ausnahmen 288

    12.4 Zusammenfassung 290

    13 Strukturierung von Java-Programmen 291

    13.1 Programmelemente 29113.1.1 Anweisungen 29113.1.2 Blcke 29113.1.3 Methoden 29413.1.4 Klassen 29413.1.5 Pakete 29513.1.6 Applikationen 29513.1.7 Applets 296

    13.2 Pakete 29613.2.1 Verwendung von Paketen 29613.2.2 Die Bedeutung der Paketnamen 29913.2.3 Einbinden zustzlicher Pakete 30213.2.4 Erstellen eigener Pakete 303

    13.3 Der Entwicklungszyklus 30713.3.1 Schematische Darstellung 30713.3.2 Projektverwaltung 308

    13.4 Auslieferung von Java-Programmen 31013.4.1 Weitergabe des Bytecodes 31013.4.2 Einbinden von Ressourcen-Dateien 313

    13.5 Java Web Start 31613.5.1 Einleitung und Funktionsweise 31613.5.2 Erstellen einer WebStart-Applikation 31813.5.3 Das jnlp-API 324

    13.6 Zusammenfassung 328

    14 Collections I 329

    14.1 Grundlagen und Konzepte 32914.2 Die Klasse Vector 330

    14.2.1 Einfgen von Elementen 33014.2.2 Zugriff auf Elemente 33114.2.3 Der Vektor als Iterator 331

  • Inhaltsverzeichnis

    11

    14.3 Die Klasse Stack 33314.4 Die Klasse Hashtable 334

    14.4.1 Einfgen von Elementen 33514.4.2 Zugriff auf Elemente 33514.4.3 Hashtable als Iterator 33614.4.4 Die Klasse Properties 337

    14.5 Die Klasse BitSet 33914.5.1 Elementweise Operationen 33914.5.2 Mengenorientierte Operationen 339

    14.6 Zusammenfassung 341

    15 Collections II 343

    15.1 Grundlagen und Konzepte 34315.2 Die Collection des Typs List 346

    15.2.1 Abstrakte Eigenschaften 34615.2.2 Implementierungen 347

    15.3 Iteratoren 34915.3.1 Das Interface Iterator 34915.3.2 Das Interface ListIterator 351

    15.4 Eine eigene Queue-Klasse 35215.4.1 Anforderungen 35215.4.2 Implementierung 353

    15.5 Die Collection des Typs Set 35815.5.1 Abstrakte Eigenschaften 35815.5.2 Implementierungen 359

    15.6 Die Collection des Typs Map 36015.6.1 Abstrakte Eigenschaften 36015.6.2 Implementierungen 362

    15.7 Sortierte Collections 36315.7.1 Comparable und Comparator 36315.7.2 SortedSet und TreeSet 36415.7.3 SortedMap und TreeMap 368

    15.8 Die Klasse Collections 36815.8.1 Sortieren und Suchen 36815.8.2 Synchronisieren von Collections 37015.8.3 Erzeugen unvernderlicher Collections 371

    15.9 Typisierte Klassen und generische Collections 37115.9.1 Grundlagen 37115.9.2 Collections mit mehreren Typparametern 37415.9.3 Eine eigene typisierte Listenklasse 37515.9.4 Typkompatibilitt 37915.9.5 Sonstiges 383

    15.10 Zusammenfassung 384

  • Inhaltsverzeichnis

    12

    16 Utility-Klassen I 385

    16.1 Die Klasse Random 38516.1.1 Initialisierung des Zufallszahlengenerators 38516.1.2 Erzeugen von Zufallszahlen 385

    16.2 Die Klassen Date, Calendar und GregorianCalendar 38716.2.1 Konstruktoren 38816.2.2 Abfragen und Setzen von Datumsbestandteilen 38916.2.3 Vergleiche und Datums-/Zeitarithmetik 39316.2.4 Umwandlung zwischen Date und Calendar 396

    16.3 Die Klasse System 39616.3.1 System-Properties 39616.3.2 in, err und out 39816.3.3 exit 39916.3.4 gc 39916.3.5 currentTimeMillis 40016.3.6 arraycopy 403

    16.4 Die Klasse Runtime 40416.4.1 Grundlagen 40416.4.2 Interaktion mit dem externen Programm 405

    16.5 Die Klasse Arrays 41016.6 Zusammenfassung 411

    17 Utility-Klassen II 413

    17.1 Die Klasse StringTokenizer 41317.1.1 Anlegen eines StringTokenizers 41317.1.2 Zugriff auf Tokens 413

    17.2 Die Klasse Math 41517.2.1 Winkelfunktionen 41517.2.2 Minimum und Maximum 41517.2.3 Arithmetik 41617.2.4 Runden und Abschneiden 416

    17.3 Die Klassen BigInteger und BigDecimal 41617.3.1 Die Klasse BigInteger 41717.3.2 Die Klasse BigDecimal 419

    17.4 Internationalisierung und Lokalisierung 42217.4.1 Die Klasse Locale 42317.4.2 Zahlen formatieren 42517.4.3 Datum und Uhrzeit formatieren 42817.4.4 Laden von Ressourcen 430

    17.5 Zusammenfassung 437

    18 Character-Streams 439

    18.1 Allgemeine Konzepte 43918.2 Ausgabe-Streams 440

    18.2.1 Die abstrakte Klasse Writer 44018.2.2 Auswahl des Ausgabegertes 44118.2.3 Schachteln von Ausgabe-Streams 444

  • Inhaltsverzeichnis

    13

    18.3 Eingabe-Streams 45218.3.1 Die abstrakte Klasse Reader 45218.3.2 Auswahl des Eingabegertes 45318.3.3 Schachteln von Eingabe-Streams 456

    18.4 Zusammenfassung 459

    19 Byte-Streams 461

    19.1 Architektur und Vergleich mit Character-Streams 46119.2 Ausgabe-Streams 461

    19.2.1 Die Basisklasse OutputStream 46119.2.2 Aus OutputStream direkt abgeleitete Klassen 46219.2.3 Aus FilterOutputStream abgeleitete Klassen 463

    19.3 Eingabe-Streams 46919.3.1 Die Basisklasse InputStream 46919.3.2 Aus InputStream direkt abgeleitete Klassen 47019.3.3 Aus FilterInputStream abgeleitete Klassen 472

    19.4 Zusammenfassung 477

    20 Random-Access-I/O 479

    20.1 Grundlegende Operationen 47920.2 Navigation in der Datei 480

    20.2.1 Positionierung des Dateizeigers 48020.2.2 Die Lnge der Datei 481

    20.3 Lesezugriffe 48120.4 Schreibzugriffe 48420.5 Zusammenfassung 486

    21 Datei- und Verzeichnis-Handling 487

    21.1 Konstruktion eines File-Objekts 48721.2 Zugriff auf Teile des Pfadnamens 48821.3 Informationen ber die Datei 48821.4 Zugriff auf Verzeichniseintrge 490

    21.4.1 Lesen von Verzeichniseintrgen 49021.4.2 ndern von Verzeichniseintrgen 494

    21.5 Temporre Dateien und Lockdateien 49621.5.1 Temporre Dateien 49621.5.2 Lockdateien 497

    21.6 Zusammenfassung 498

    22 Multithreading 499

    22.1 Grundlagen und Begriffe 49922.2 Die Klasse Thread 500

    22.2.1 Erzeugen eines neuen Threads 50022.2.2 Abbrechen eines Threads 50122.2.3 Anhalten eines Threads 50522.2.4 Weitere Methoden 505

  • Inhaltsverzeichnis

    14

    22.3 Das Interface Runnable 50622.3.1 Implementieren von Runnable 50722.3.2 Multithreading durch Wrapper-Klassen 508

    22.4 Synchronisation 51322.4.1 Synchronisationsprobleme 51322.4.2 Monitore 51522.4.3 wait und notify 51922.4.4 PipedInputStream und PipedOutputStream 522

    22.5 Verwalten von Threads 52522.5.1 Prioritt und Name 52522.5.2 Thread-Gruppen 526

    22.6 Zusammenfassung 526

    Teil V Grafikprogrammierung mit dem AWT 529

    23 Grafikausgabe 531

    23.1 Das Abstract Windowing Toolkit 53123.1.1 Grundlegende Eigenschaften 53123.1.2 Von AWT nach Swing 531

    23.2 Grundlagen der Grafikausgabe 53223.2.1 Anlegen eines Fensters 53223.2.2 Die Methode paint 53423.2.3 Das grafische Koordinatensystem 53423.2.4 Schlieen eines Fensters 535

    23.3 Elementare Grafikroutinen 53723.3.1 Linie 53823.3.2 Rechteck 53923.3.3 Polygon 54123.3.4 Kreis 54223.3.5 Kreisbogen 543

    23.4 Weiterfhrende Funktionen 54423.4.1 Linien- oder Fllmodus 54423.4.2 Kopieren und Lschen von Flchen 54623.4.3 Die Clipping-Region 548

    23.5 Zusammenfassung 550

    24 Textausgabe 551

    24.1 Ausgabefunktionen 55124.2 Unterschiedliche Schriftarten 553

    24.2.1 Font-Objekte 55324.2.2 Standardschriftarten 555

    24.3 Eigenschaften von Schriftarten 55724.3.1 Font-Informationen 55724.3.2 Font-Metriken 558

    24.4 Zusammenfassung 562

  • Inhaltsverzeichnis

    15

    25 Farben 563

    25.1 Das Java-Farbmodell 56325.2 Erzeugen von Farben 56325.3 Verwenden von Farben 56425.4 Systemfarben 56625.5 Zusammenfassung 569

    26 Drucken 571

    26.1 Einleitung 57126.2 Drucken mit dem JDK 1.1 571

    26.2.1 Grundlagen 57126.2.2 Seitenweise Ausgabe 57226.2.3 Platzierung des Codes zur Druckausgabe 573

    26.3 Drucken seit dem JDK 1.2 57726.3.1 berblick 57726.3.2 Zusammenspiel der Klassen 57726.3.3 Ausdrucken einer Textdatei 583

    26.4 Zugriff auf serielle und parallele Schnittstellen 58826.4.1 Das Java Communications API 58926.4.2 Ein einfaches Beispielprogramm 590

    26.5 Zusammenfassung 592

    27 Fenster 593

    27.1 Die verschiedenen Fensterklassen 59327.2 Aufrufen und Schlieen eines Fensters 59527.3 Visuelle Eigenschaften 59727.4 Anzeigezustand 59927.5 Fensterelemente 600

    27.5.1 Der Fenstertitel 60027.5.2 Das Icon des Fensters 60127.5.3 Der Mauscursor 60127.5.4 Die Vorder- und Hintergrundfarbe 60227.5.5 Der Standard-Font 602

    27.6 Zusammenfassung 605

    28 Event-Handling 607

    28.1 Das Event-Handling im JDK 1.1 60728.1.1 Grundlagen 60728.1.2 Ereignistypen 60828.1.3 Ereignisempfnger 61028.1.4 Ereignisquellen 61128.1.5 Adapterklassen 61228.1.6 Zusammenfassung 612

    28.2 Entwurfsmuster fr den Nachrichtenverkehr 61628.2.1 Variante 1: Implementierung eines EventListener-Interfaces 61828.2.2 Variante 2: Lokale und anonyme Klassen 620

  • Inhaltsverzeichnis

    16

    28.2.3 Variante 3: Trennung von GUI- und Anwendungscode 62328.2.4 Variante 4: berlagern der Event-Handler in den Komponenten 62528.2.5 Ausblick 627

    28.3 Zusammenfassung 628

    29 Low-Level-Events 629

    29.1 Window-Events 62929.2 Component-Events 63129.3 Mouse-Events 63429.4 MouseMotion-Events 63829.5 Focus-Events 64229.6 Key-Events 64529.7 Zusammenfassung 650

    30 Mens 651

    30.1 Grundlagen 65130.2 Menleiste 65130.3 Mens 65230.4 Meneintrge 653

    30.4.1 Einfache Meneintrge 65330.4.2 CheckboxMenuItem 65430.4.3 Beschleunigertasten 65730.4.4 Untermens 660

    30.5 Action-Events 66230.6 Kontextmens 66730.7 Datenaustausch mit der Zwischenablage 670

    30.7.1 berblick 67030.7.2 Kommunikation mit der Zwischenablage 670

    30.8 Zusammenfassung 673

    31 GUI-Dialoge 675

    31.1 Erstellen eines Dialogs 67531.1.1 Anlegen eines Dialogfensters 67531.1.2 Zuordnen eines Layoutmanagers 67631.1.3 Einfgen von Dialogelementen 67631.1.4 Anzeigen des Dialogfensters 677

    31.2 Die Layoutmanager 67831.2.1 FlowLayout 67931.2.2 GridLayout 68131.2.3 BorderLayout 68331.2.4 GridBagLayout 68631.2.5 NULL-Layout 69131.2.6 Schachteln von Layoutmanagern 693

    31.3 Modale Dialoge 69531.4 Zusammenfassung 704

  • Inhaltsverzeichnis

    17

    32 AWT-Dialogelemente 705

    32.1 Rahmenprogramm 70532.2 Label 70832.3 Button 70932.4 Checkbox 71032.5 CheckboxGroup 71232.6 TextField 71432.7 TextArea 71732.8 Choice 71932.9 List 72232.10 Scrollbar 72432.11 ScrollPane 72732.12 Zusammenfassung 734

    33 Eigene Dialogelemente 735

    33.1 Die Klasse Canvas 73533.2 Entwicklung einer 7-Segment-Anzeige 736

    33.2.1 Anforderungen 73633.2.2 Bildschirmanzeige 73633.2.3 Ereignisbehandlung 737

    33.3 Einbinden der Komponente 74333.4 Zusammenfassung 745

    34 Bitmaps und Animationen 747

    34.1 Bitmaps 74734.1.1 Laden und Anzeigen einer Bitmap 74734.1.2 Entwicklung einer eigenen Bitmap-Komponente 751

    34.2 Animation 75334.2.1 Prinzipielle Vorgehensweise 75334.2.2 Abspielen einer Folge von Bitmaps 75734.2.3 Animation mit Grafikprimitiven 76034.2.4 Reduktion des Bildschirmflackerns 766

    34.3 Zusammenfassung 775

    Teil VI Grafikprogrammierung mit Swing 777

    35 Swing: Grundlagen 779

    35.1 Eigenschaften und Architektur von Swing 77935.1.1 Einleitung 77935.1.2 Eigenschaften von Swing 77935.1.3 Wie geht es weiter? 782

    35.2 Ein einfhrendes Beispiel 78335.2.1 Das Beispielprogramm 78335.2.2 Beschreibung des Beispielprogramms 785

    35.3 Zusammenfassung 790

  • Inhaltsverzeichnis

    18

    36 Swing: Container und Mens 793

    36.1 Hauptfenster 79336.1.1 JFrame 79336.1.2 JWindow 79736.1.3 JDialog 79936.1.4 JOptionPane 80036.1.5 JApplet 80536.1.6 JInternalFrame 806

    36.2 Mens 81036.2.1 Einfache Mens 81036.2.2 Grundlagen von Swing-Mens 81036.2.3 Weitere Mglichkeiten 81536.2.4 Kontextmens 820

    36.3 Weitere Swing-Container 82236.3.1 JComponent 82236.3.2 JPanel und JLayeredPane 832

    36.4 Zusammenfassung 833

    37 Swing: Komponenten I 835

    37.1 Label und Textfelder 83537.1.1 JLabel 83537.1.2 JTextField 83737.1.3 JPasswordField 84037.1.4 JTextArea 84137.1.5 JSpinner 843

    37.2 Buttons 84537.2.1 JButton 84537.2.2 JCheckBox 84837.2.3 JRadioButton 850

    37.3 Listen und Comboboxen 85237.3.1 JList 85237.3.2 JComboBox 856

    37.4 Quasi-analoge Komponenten 85937.4.1 JScrollBar 85937.4.2 JSlider 86237.4.3 JProgressBar 866

    37.5 Zusammenfassung 868

    38 Swing: Komponenten II 871

    38.1 Spezielle Panels 87138.1.1 JScrollPane 87138.1.2 JSplitPane 87538.1.3 JTabbedPane 878

    38.2 JTable 88238.2.1 Erzeugen von Tabellen 88238.2.2 Konfiguration der Tabelle 88538.2.3 Selektieren von Elementen 886

  • Inhaltsverzeichnis

    19

    38.2.4 Zugriff auf den Inhalt der Tabelle 88838.2.5 Das Tabellenmodell 88938.2.6 Das Spaltenmodell 89438.2.7 Rendering der Zellen 89638.2.8 Reaktion auf Ereignisse 900

    38.3 JTree 90138.3.1 Erzeugen eines Baums 90138.3.2 Selektieren von Knoten 90538.3.3 ffnen und Schlieen der Knoten 90838.3.4 Verndern der Baumstruktur 909

    38.4 Zusammenfassung 913

    Teil VII Applets 915

    39 Applets I 917

    39.1 Die Architektur eines Applets 91739.1.1 Grundlagen 91739.1.2 Die Klasse java.applet.Applet 91839.1.3 Initialisierung und Endebehandlung 91839.1.4 Weitere Methoden der Klasse Applet 920

    39.2 Einbinden eines Applets 92239.2.1 Das APPLET-Tag 92239.2.2 Die Parameter des Applet-Tags 92339.2.3 Parameterbergabe an Applets 924

    39.3 Die Ausgabe von Sound 92639.3.1 Soundausgabe in Applets 92639.3.2 Soundausgabe in Applikationen 929

    39.4 Animation in Applets 93039.5 Zusammenfassung 936

    40 Applets II 937

    40.1 Verweise auf andere Seiten 93740.1.1 Die Klasse URL 93740.1.2 Der Applet-Kontext 93840.1.3 Die Methode showDocument 939

    40.2 Kommunikation zwischen Applets 94340.3 Umwandlung einer Applikation in ein Applet 945

    40.3.1 Die Beispiel-Applikation 94640.3.2 Variante 1: Das Programm als Popup-Fenster 94740.3.3 Variante 2: Erstellen eines gleichwertigen Applets 948

    40.4 Das Java-Plugin 95040.4.1 Funktionsweise 95040.4.2 Verwendung des Plugins 952

    40.5 Zusammenfassung 953

  • Inhaltsverzeichnis

    20

    Teil VIII Spezielle APIs 955

    41 Serialisierung 957

    41.1 Grundlagen 95741.1.1 Begriffsbestimmung 95741.1.2 Schreiben von Objekten 95741.1.3 Lesen von Objekten 961

    41.2 Weitere Aspekte der Serialisierung 96541.2.1 Versionierung 96541.2.2 Nicht-serialisierte Membervariablen 96741.2.3 Objektreferenzen 96841.2.4 Serialisieren von Collections 972

    41.3 Anwendungen 97241.3.1 Ein einfacher Objektspeicher 97241.3.2 Kopieren von Objekten 977

    41.4 Zusammenfassung 980

    42 Datenbankzugriffe mit JDBC 981

    42.1 Einleitung 98142.1.1 Grundstzliche Arbeitsweise 98142.1.2 Die Architektur von JDBC 982

    42.2 Grundlagen von JDBC 98342.2.1 ffnen einer Verbindung 98342.2.2 Erzeugen von Anweisungsobjekten 98542.2.3 Datenbankabfragen 98642.2.4 Datenbanknderungen 98842.2.5 Die Klasse SQLException 988

    42.3 Die DirDB-Beispieldatenbank 98942.3.1 Anforderungen und Design 98942.3.2 Das Rahmenprogramm 99042.3.3 Die Verbindung zur Datenbank herstellen 99342.3.4 Anlegen und Fllen der Tabellen 99542.3.5 Zhlen der Verzeichnisse und Dateien 99842.3.6 Suchen von Dateien und Verzeichnissen 99942.3.7 Die zehn grten Dateien 100242.3.8 Speicherverschwendung durch Clustering 1003

    42.4 Weiterfhrende Themen 100442.4.1 Metadaten 100442.4.2 Escape-Kommandos 100542.4.3 Transaktionen 100542.4.4 JDBC-Datentypen 100642.4.5 Umgang mit JDBC-Objekten 100742.4.6 Prepared Statements 100942.4.7 SQL-Kurzreferenz 1010

    42.5 Zusammenfassung 1015

  • Inhaltsverzeichnis

    21

    43 Reflection 1017

    43.1 Einleitung 101743.2 Die Klassen Object und Class 1017

    43.2.1 Die Klasse Object 101743.2.2 Die Klasse Class 1018

    43.3 Methoden- und Konstruktorenaufrufe 102143.3.1 Parameterlose Methoden 102143.3.2 Parametrisierte Methoden 102643.3.3 Parametrisierte Konstruktoren 1030

    43.4 Zugriff auf Membervariablen 103243.5 Arrays 1036

    43.5.1 Erzeugen von Arrays 103643.5.2 Zugriff auf Array-Elemente 1038

    43.6 Zusammenfassung 1041

    44 Beans 1043

    44.1 Grundlagen und Begriffe 104344.2 Entwurf einer einfachen Bean 1045

    44.2.1 Grundstzliche Architektur 104544.2.2 Grafische Darstellung 104644.2.3 Eigenschaften 104744.2.4 Implementierung 104844.2.5 Verwendung der Bean 1051

    44.3 Die Beanbox 105244.3.1 Beschreibung und Installation 105244.3.2 Grundlagen der Bedienung 105344.3.3 Integration eigener Beans 105544.3.4 Serialisierte Beans 1058

    44.4 Bean-Ereignisse 105944.4.1 Bound Properties 106044.4.2 Constrained Properties 106544.4.3 Anwendungsbeispiel 1069

    44.5 Panel-Beans 107144.6 BeanInfo-Klassen und Property-Editoren 1075

    44.6.1 BeanInfo-Klassen 107544.6.2 Property-Editoren 1079

    44.7 Zusammenfassung 1086

    45 Netzwerkprogrammierung 1087

    45.1 Grundlagen der Netzwerkprogrammierung 108745.1.1 Was ist ein Netzwerk? 108745.1.2 Protokolle 108845.1.3 Adressierung von Daten 108945.1.4 Ports und Applikationen 109145.1.5 Request for Comments 109245.1.6 Firewalls und Proxys 1094

  • Inhaltsverzeichnis

    22

    45.2 Client-Sockets 109445.2.1 Adressierung 109445.2.2 Aufbau einer einfachen Socket-Verbindung 109645.2.3 Lesen und Schreiben von Daten 109945.2.4 Zugriff auf einen Web-Server 1102

    45.3 Server-Sockets 110545.3.1 Die Klasse ServerSocket 110545.3.2 Verbindungen zu mehreren Clients 110745.3.3 Entwicklung eines einfachen Web-Servers 1109

    45.4 Daten mithilfe der Klasse URL lesen 111745.5 Zusammenfassung 1118

    46 Remote Method Invocation 1121

    46.1 Einleitung 112146.1.1 Prinzipielle Arbeitsweise 112146.1.2 Einzelheiten der Kommunikation 1122

    46.2 Aufbau eines einfachen Uhrzeit-Services 112446.2.1 Vorgehensweise 112446.2.2 Das Remote-Interface 112546.2.3 Implementierung des Remote-Interfaces 112646.2.4 Registrieren der Objekte 112846.2.5 Zugriff auf den Uhrzeit-Service 113146.2.6 Ausblick 1134

    46.3 Zusammenfassung 1135

    47 Sicherheit und Kryptographie 1137

    47.1 Kryptographische Grundlagen 113747.1.1 Wichtige Begriffe 113747.1.2 Einfache Verschlsselungen 113847.1.3 Message Digests 114047.1.4 Kryptographische Zufallszahlen 114547.1.5 Public-Key-Verschlsselung 114647.1.6 Digitale Unterschriften 114847.1.7 Zertifikate 1156

    47.2 Sicherheitsmechanismen in Java 115747.2.1 Sprachsicherheit 115747.2.2 Das Sandbox-Konzept 115847.2.3 Vernderungen im JDK 1.1 und 1.2 1159

    47.3 Signierte Applets 115947.3.1 Ein unerlaubtes Applet 115947.3.2 Signieren des Applets 116247.3.3 Ex- und Import von Zertifikaten 116347.3.4 Anpassen der Policy-Datei 116447.3.5 Die Klasse SecurityManager 1167

    47.4 Zusammenfassung 1169

  • Inhaltsverzeichnis

    23

    48 Sound 1171

    48.1 Grundlagen und Konzepte 117148.2 Gesampelter Sound 1172

    48.2.1 Was ist Sampling? 117248.2.2 Das Sampling-API 117348.2.3 Abspielen einer Sample-Datei 1177

    48.3 Midi 117948.3.1 Was ist Midi? 117948.3.2 Grundlegende Klassen des Midi-APIs 118048.3.3 Alle meine Entchen - Erster Versuch 118148.3.4 Alle meine Entchen mit dem Sequenzer 118548.3.5 Zugriff auf Midi-Dateien 1189

    48.4 Zusammenfassung 1191

    Teil IX Verschiedenes 1193

    49 Performance-Tuning 1195

    49.1 Einleitung 119549.2 Tuning-Tipps 1196

    49.2.1 String und StringBuffer 119649.2.2 Methodenaufrufe 120049.2.3 Vektoren und Listen 120249.2.4 Dateizugriffe 120449.2.5 Speicher-Optimierung 1207

    49.3 Einsatz eines Profilers 120849.3.1 Grundlagen 120849.3.2 Eine Beispielsitzung mit dem Profiler 121049.3.3 Ausblick 1216

    49.4 Zusammenfassung 1217

    50 Hilfsprogramme des JDK 1219

    50.1 javac Der Compiler 121950.1.1 Aufruf 121950.1.2 Beschreibung 121950.1.3 Optionen 1220

    50.2 java Der Interpreter 122150.2.1 Aufruf 122150.2.2 Beschreibung 122150.2.3 Optionen 1222

    50.3 appletviewer Der Appletviewer 122350.3.1 Aufruf 122350.3.2 Beschreibung 122350.3.3 Optionen 1223

    50.4 jdb Der Debugger 122350.4.1 Aufruf 122350.4.2 Beschreibung 122350.4.3 Vorbereitungen 1224

  • Inhaltsverzeichnis

    24

    50.5 javadoc Der Dokumentationsgenerator 122650.5.1 Aufruf 122650.5.2 Beschreibung 122650.5.3 Dokumentationskommentare 122650.5.4 Aufruf von javadoc 122850.5.5 Optionen 1229

    50.6 jar Das Archivierungswerkzeug 122950.6.1 Aufruf 122950.6.2 Beschreibung 123050.6.3 Kommandos 123050.6.4 Verwendung von jar-Dateien in Applets 1231

    50.7 javap Der Disassembler 123250.7.1 Aufruf 123250.7.2 Beschreibung 123250.7.3 Optionen 1232

    50.8 serialver Zugriff auf die serialVersionUID 123350.8.1 Aufruf 123350.8.2 Beschreibung 123350.8.3 Optionen 1233

    50.9 keytool Verwaltung von kryptografischen Schlsseln 123350.9.1 Aufruf 123350.9.2 Beschreibung 1233

    50.10 policytool Bearbeiten von Policy-Dateien 123350.10.1 Aufruf 123350.10.2 Beschreibung 1233

    50.11 jarsigner Signieren von Archiven 123450.11.1 Aufruf 123450.11.2 Beschreibung 123450.11.3 Optionen 1234

    50.12 rmic Erzeugen von RMI-Stubs und -Skeletons 123450.12.1 Aufruf 123450.12.2 Beschreibung 123550.12.3 Optionen 1235

    50.13 rmiregistry Der RMI-Namensservice 123550.13.1 Aufruf 123550.13.2 Beschreibung 1235

    50.14 Zusammenfassung 1235

    Sun Microsystems, Inc. Binary Code License Agreement 1237

    Stichwortverzeichnis 1243

  • 25

    Vorwort

    Vorwort zur 4. Auflage

    Die 4. Auflage des Handbuchs der Java-Programmierung behandelt die Neuerungen, diemit der Version 5.0 der Java 2 Standard Edition eingefhrt wurden. Dieser, unter demCodenamen "Tiger" entwickelte Nachfolger der Version 1.4 bringt viele Verbesserungen,die vor allem den Java-Entwicklern selbst das Leben leichter machen sollen (StichwortEase Of Development). Zu ihnen zhlen unter anderem folgende Features:

    X Autoboxing/Autounboxing (Abschnitt 10.2.3 auf Seite 224)X Die Erweiterte for-Schleife (Abschnitt 6.3.3 auf Seite 135)X Variable Parameterlisten (Abschnitt 7.3.4 auf Seite 163)X Statische Imports (Abschnitt 9.4 auf Seite 203)X Aufzhlungstypen (Abschnitt 10.3 auf Seite 225),X Printf-hnliche Ausgabeformatierung (Abschnitt 11.5 auf Seite 272)X Generische (oder typisierte) Klassen und Collections (Abschnitt 15.9 auf Seite 371)

    Neben der Beschreibung dieser Erweiterungen wurden kleinere Fehler korrigiert und ver-schiedene Unklarheiten beseitigt. Darber hinaus wurden die Einstiegs- und Installations-hinweise berarbeitet sowie der Inhalt der CD-ROM an die aktuellen Java-Versionenangepasst.

    Guido Krger, Oktober 2004

    Vorwort zur 3. Auflage

    Das Handbuch der Java-Programmierung ist der Nachfolger von Go To Java 2 und sei-ner im Sptsommer 2000 erschienenen zweiten Auflage. Somit verlsst das Buch die GoTo-Reihe, in die es, vor allem auf Grund des erneut gestiegenen Umfangs, nicht mehr rechthineinpasste. Dennoch ist das Handbuch der Java-Programmierung nicht mehr und nichtweniger als die konsequente Fortfhrung seiner erfolgreichen Vorgnger, die bis auf "Java1.1 lernen" und "Symantec Visual Cafe" zurckgefhrt werden knnen. Um diese Konti-nuitt deutlich zu machen, haben wir die Nummerierung der Auflagen beibehalten undder aktuellen Auflage die Nummer 3.0 zugeordnet.

  • Vorwort

    26

    Untersttzt durch die groe Zahl an Leserzuschriften und die Diskussion mit Kollegen,Freunden und anderen Java-Enthusiasten wurde das Buch mit vielen Erweiterungen undErgnzungen versehen. Alle fr Java-Einsteiger und Fortgeschrittene wichtigen Themenwerden ausfhrlich behandelt. Der bewhrte Aufbau wurde beibehalten, und das Buchkann sowohl als Lehr- wie auch als Nachschlagewerk eingesetzt werden.

    Das Handbuch der Java-Programmierung besteht aus 50 Kapiteln, die alle wesentlichenAspekte der Programmiersprache Java und seiner umfangreichen Klassenbibliothek erlu-tern. Mit ber 170 Abbildungen, 80 Tabellen, 440 Beispielprogrammen und 600 Querver-weisen ist es fr die Verwendung im Unterricht und zum Selbststudium bestens geeignet.

    Gegenber der zweiten Auflage wurden folgende Abschnitte neu aufgenommen:

    X Zugriff auf Arrays per Reflection (Abschnitt 43.5 auf Seite 1036)X Java WebStart (Abschnitt 13.5 auf Seite 316)X Assertions (Abschnitt 6.4.1 auf Seite 140)X Das Sound-API (Kapitel 48 auf Seite 1171)

    Zudem wurde das Buch an die Version 1.4 des JDK angepasst und viele kleine Fehler ausder vorigen Auflage korrigiert. Die Linkliste wurde ebenso angepasst wie die Java-Historie,die Beschreibung der Standardpakete oder die Syntax der JDK-Werkzeuge. Fr Anfngerwurden die Kapitel 2 und 3 erneut erweitert, es gibt detaillierte Erklrungen zum Aufrufvon Java-Programmen unter Windows, und Abschnitt 2.3.7 auf Seite 70 beschreibt hufiggemachte Fehler und wie man sie umgeht. Weitere Verbesserungen gab es bei denAbschnitten ber die Swing-Komponenten, die jetzt auch die neuen 1.4-KomponentenJFormattedTextField und JSpinner sowie animierte Fortschrittsanzeigen umfassen und aufdas neue Focus-Subsystem eingehen. Der JDBC-Teil wurde um Hinweise zur Konfigura-tion von MS Access, InstantDB und HSQLDB erweitert, und der ExperimentalWebServerbeherrscht jetzt das HEAD-Kommando und eignet sich fr den Betrieb von Java WebStart.Nicht zuletzt gab es Verbesserungen bei der HTML-Ausgabe, die jetzt noch umfangreicherund leichter zu bedienen ist.

    Gegenber der ersten Auflage wurden in der zweiten die einleitenden Kapitel vereinfacht,um Anfngern den Einstieg zu erleichtern. Zudem wurden weiterfhrende Themen auf-genommen, um auch dem fortgeschrittenen Leser gengend Lesestoff zu bieten.

    Die wichtigsten nderungen der zweiten Auflage waren:

    X Die ersten Schritte werden ausfhrlicher erklrt, und das fr viele Anfnger zu schwie-rige Kapitel 2 wurde entfernt

  • Vorwort

    27

    X Es gibt eine Einfhrung in die objektorientierte Programmierung sowie ein Kapitelber objektorientiertes Design und Design-Patterns

    X Bei vielen Themenkomplexen werden in einer Einleitung zunchst die wichtigsten fach-lichen Grundlagen vermittelt, bevor auf die Umsetzung in Java eingegangen wird (Objek-torientierte Programmierung, Netzwerkprogrammierung, SQL, Kryptographie etc.)

    X Viele neue Kapitel oder Abschnitte sind hinzugekommen, beispielsweise Java Beans (Kapitel 44 auf Seite 1043)

    Sicherheit und Kryptographie (Kapitel 47 auf Seite 1137)

    Remote Methode Invocation (Kapitel 46 auf Seite 1121)

    Byte-Streams (Kapitel 19 auf Seite 461)

    Beliebig genaue Arithmetik (Abschnitt 17.3 auf Seite 416)

    Internationalisierung und Ressourcen-Management (Abschnitt 17.4 auf Seite 422)

    Drucken und Zugriff auf serielle und parallele Schnittstelle (Kapitel 26 auf Seite 571)

    Fortgeschrittene Applet-Programmierung (Kapitel 40 auf Seite 937)

    X Zudem gibt es eine komplette Einfhrung in die Swing-Programmierung, die folgendeThemen behandelt:

    Grundlagen und Abgrenzung zwischen Swing und AWT (Kapitel 35 auf Seite 779)

    Swing-Container und Mens (Kapitel 36 auf Seite 793)

    Alle elementaren Swing-Komponenten (Kapitel 37 auf Seite 835)

    Komplexe Komponenten und Panels, Tables und Trees (Kapitel 38 auf Seite 871)

    Ebenso wie zu den Vorgngerversionen wurde auch zu diesem Buch eine HTML-Ausgabeerstellt. Sie ist auf der beigefgten CD-ROM enthalten und stellt das komplette Buch imHypertext-Format dar. Mit ihren Navigationshilfen und der groen Zahl an Querverwei-sen (es sind inkl. Index ber 20000) ist sie ausgezeichnet als Referenz verwendbar. Dane-ben enthlt die CD-ROM die Beispiele aus dem Buch sowie das Java Development Kitund weitere ntzliche Werkzeuge und Hilfsmittel.

    Wie bisher kann die HTML-Ausgabe frei aus dem Internet geladen werden. Studenten undLeser mit eingeschrnkten finanziellen Mglichkeiten knnen so Java lernen, ohne das Buchkaufen zu mssen, oder knnen es vor dem Kauf eingehend studieren. Auch Universittenund vergleichbare Einrichtungen werden die Mglichkeit zur Installation einer gespiegeltenVersion erhalten, um das Buch effizient in der Java-Ausbildung nutzen zu knnen.

  • Vorwort

    28

    Um weitere Informationen zum Handbuch der Java-Programmierung zu erhalten, knnenSie seine Homepage unter http://www.javabuch.de besuchen. Dort knnen Sie auch diefreie HTML-Ausgabe herunterladen, und Sie finden eine Liste aller bekannten Fehler undUngenauigkeiten. Teilen Sie mir Ihre Kritik und Anregungen mit, oder schreiben Sie mir,wenn Sie Fehler gefunden haben. Natrlich knnen Sie auch schreiben, dass Ihnen dasBuch gefallen hat! Verstndnisfragen zu einzelnen Aspekten der Java-Programmierungkann ich aus Zeitgrnden leider nicht mehr beantworten. Sie sind besser in einer der zahl-reichen Java-Newsgroups aufgehoben (siehe Abschnitt 3.2.2 auf Seite 82).

    Wie die Vorversionen wurde auch die dritte Auflage vollstndig in SGML geschrieben (derMutter von HTML und XML). Alle Werkzeuge zum Erstellen der verschiedenen Ausga-ben wurden vom Autor selbst entwickelt und sind in Java geschrieben. Die ohne zustzli-chen Aufwand erstellbare HTML-Ausgabe kann bei Fehlern oder Erweiterungen sehrschnell aktualisiert und unabhngig von den Nachdruckzyklen der Papierversion gepflegtwerden. Alle nderungen werden versioniert, der Erstdruck des Buchs entspricht derHTML-Ausgabe 3.0.

    Ich wnsche allen Lesern, dass ihnen dieses Buch beim Erlernen und Anwenden von Javaein unentbehrlicher Helfer sein wird und dass sie nach seiner Lektre ber umfassendeKenntnisse in der Java-Programmierung verfgen mgen.

    Mein Dank gilt allen, die bei der Entstehung mitgewirkt haben. Besonders mchte ichKollegen und Bekannten danken, die sich der Mhe unterzogen haben, einzelne Kapitel zulesen, und mit ihren Hinweisen und Anregungen zu seiner jetzigen Form beigetragenhaben. Hier sind vor allem Ilona Brinkmeier, Holger Jdicke, Boris Gruschko, ThomasBackens, Goetz Perry, Stefan Stark, Andi Mller, Jacques Nietsch und Carsten Leutzingerzu nennen. Den vielen Lesern der Vorversionen, die Fehler gefunden oder Anregungengegeben haben, mchte ich ebenso danken wie Christiane Auf und Christina Gibbs, diedas Buch als Lektorinnen bei Addison-Wesley betreut haben.

    Wie immer geht ein besonderer Dank an Sabine, Jana und Jasmin, ohne deren Unterstt-zung und Geduld auch dieses Buch nicht mglich gewesen wre.

    Guido Krger, Februar 2002

  • Die Icons in diesem Buch

    Um Ihnen die Orientierung in diesem Buch zu erleichtern, haben wir den Text inbestimmte Funktionsabschnitte gegliedert und diese durch entsprechende Symbole oderIcons gekennzeichnet. Folgende Icons finden Verwendung:

    Manches ist von besonderer Bedeutung und verdient darum auch, besonders hervorge-hoben zu werden. Solche Hinweise sind sehr ntzlich, sie bringen einen geschwinderans Ziel.

    Manches geht ganz leicht. Wenn man nur wei, wie. Praxistipps finden Sie in denAbschnitten mit diesem Icon.

    Beim Erlernen einer Programmiersprache gibt es immer wieder Fallen, in die man alsAhnungsloser hineintreten kann. Die Warnungen im Buch fhren Sie sicher an ihnenvorbei.

    Zwischen den unterschiedlichen Java-Versionen gibt es teilweise betrchtliche Diffe-renzen. Mit diesem Icon markieren wir die wichtigsten Unterschiede zwischen den Ver-sionen 1.1, 1.2, 1.3, 1.4 und 5.0 der Sprache.

  • TEIL IEinleitung

  • 33

    1 Was ist Java?

    1.1 Historie

    Als offizieller Geburtstag der Programmiersprache Java gilt der 23. Mai 1995.

    Mit dem Erscheinen dieses Buchs wird Java also fast zehn Jahre alt sein. Nach einer wech-selhaften Vorgeschichte, dem darauf folgenden Enthusiasmus und fast ebenso vielen techni-schen Schwierigkeiten wie Errungenschaften hat sich Java heute vollstndig etabliert. Nachwie vor verzeichnet die Sprache ein steigendes Interesse in breiten Kreisen der Entwickler-gemeinschaft und wird in Krze C++ als am hufigsten genutzte Programmierspracheabgelst haben. Bevor wir uns in den nachfolgenden Kapiteln mit den technischen Detailsder Sprache beschftigen, wollen wir einen kurzen Blick auf die Entstehungsgeschichte vonJava werfen.

    Nach einschlgigen Berichten fing alles mit einer Mail des damals 25jhrigen Programmie-rers Patrick Naughton an den SUN-Chef Scott McNealy an. Naughton hatte angekndigt,das Unternehmen zu verlassen, um zu Next Computer, Inc. zu gehen. Er war der Meinung,dass manches bei SUN nicht gut funktionierte, und die weitaus moderneren Technologienvon Next reizten ihn sehr. McNealy, mit dem Naughton zusammen Eishockey spielte, for-derte ihn auf, seine Kritik samt mglicher Lsungsvorschlge niederzuschreiben, ganzgleich, wie radikal sie auch sein mgen.

    Naughtons Mail hat seine Wirkung nicht verfehlt! In einer fr SUN schwierigen Periodemit internen Diskussionen um den Kurs des Unternehmens und seiner Produkte rannteNaughton offene Tren ein. Seine Hauptkritikpunkte betrafen die nicht zeitgemen gra-fischen Oberflchen, die unbersehbare Anzahl an Programmierwerkzeugen, die hohenKosten der Workstations und die komplizierte Anwendung der Programme. Kurz, er warfSUN vor, auf dem besten Wege zu sein, sich mehr und mehr von seinen potenziellen Kun-den und Anwendern zu entfernen. Er forderte Hard- und Software, die nicht nur von Aka-demikern und hochspezialisierten Profis, sondern von normalen Menschen angewendetwerden konnte.

    Naughtons Klagen wurden erhrt, und innerhalb weniger Tage wurde ein Projekt aufge-setzt, dessen Ziel es sein sollte, die nchsten groen Trends der Computer- und Softwarein-dustrie aufzuspren. Naughton zog seine angedrohte Kndigung zurck und begann 1991zusammen mit James Gosling und Mike Sheridan die Arbeit an einem geheimen, zunchstfr ein Jahr finanzierten und auerhalb des regulren Unternehmens angesiedelten Vorha-bens, das spter den Namen Green-Projekt erhielt.

  • Kapitel 1 Was ist Java?

    34

    Nach anfnglichen Schwierigkeiten, seine eigene Aufgabe zu definieren, entschied sich dasTeam dafr, einen Prototyp zur Steuerung und Integration von Gerten zu bauen, wie sie innormalen Haushalten in groer Zahl verwendet wurden (Toaster, Videorecorder, Fernseheretc.). Bestandteile dieses Projekts waren ein Betriebssystem (Green-OS), ein portabler Inter-preter (Oak), ein Grafiksubsystem und diverse Hardwarekomponenten. Bis Mitte 1992 ent-wickelte Naughton mit seinen Kollegen ein Gert, das etwa heutigen Palm-Computernglich und mit einer tastaturlosen grafischen Oberflche per drahtloser Datenbertragung zurBedienung unterschiedlichster Gerte der Konsumelektronik verwendet werden konnte.

    Das als *7 (Star Seven) bezeichnete Gert wurde im Herbst 1992 firmenintern prsentiert.Diese Vorstellung konnte einige der Manager unter ihnen SUN-Mitbegrnder Bill Joyund Scott McNealy so beeindrucken, dass im November 1992 aus dem lockeren Teamdie Firma First Person, Inc. gegrndet wurde. Mit zuletzt etwa 70 Mitarbeitern versuchtedas junge Unternehmen, den Prototypen zur Serienreife zu bringen und zu vermarkten.Trotz groer Anstrengungen scheiterten aber alle Versuche, Vertrge und Partnerschaftenzur kommerziellen Verwendung von Star Seven unter Dach und Fach zu bringen. Nachvielen Mhen wurde die Arbeit von First Person, Inc. im April 1994 praktisch beendet.

    Fast wre die Geschichte von Java nun bereits zu Ende gewesen, ehe sie richtig begonnenhatte.

    Bei aller Euphorie ber interaktives Fernsehen und Heimelektronik hatten die Entwicklernmlich eine andere, sehr viel realere Entwicklung bersehen. Mittlerweile hatte das WorldWide Web eine kritische Gre erreicht! Nachdem NCSA Mosaic als erster grafischerWeb-Browser im April 1993 verfgbar war, konnte jedermann ansprechend aufbereiteteInformationen im Internet ansehen und auf einfache Weise zwischen unterschiedlichenDiensten, Medien und Anbietern wechseln. Vor allem Bill Joy, der sich gelegentlich berden Stand des Green-Projekts informierte, erkannte das Potential des World Wide Webund die Bedeutung einer plattformunabhngigen Programmiersprache, mit der neben tex-tuellen Inhalten auch Programme transportiert und ohne Installations- oder Portierungs-aufwand auf einem beliebigen Zielrechner ausgefhrt werden konnten.

    In der Annahme, damit die Bedeutung des Internet zu strken und auf diese Weise indi-rekte Verkaufsfrderung fr SUN-Produkte zu betreiben, beauftragte Joy die KollegenGosling und Naughton mit der Entwicklung einer Killer-Applikation, die dieses Poten-tial offenlegen sollte. Whrend *7 dabei keine Rolle mehr spielte, wurde die Programmier-sprache Oak zur Entwicklung einer ganz neuen Art von Programm verwendet. Im Herbst1994 wurde mit ihrer Hilfe die erste Version von WebRunner fertiggestellt, einem Web-Browser, der neben der Darstellung von HTML-Seiten auch kleine Java-Programme, App-lets genannt, aus dem World Wide Web laden und innerhalb des Browserfensters ausfhrenkonnte.

  • Historie Kapitel 1

    35

    Zu diesem Zeitpunkt war Oak, das spter in Java umbenannt wurde, bereits eine recht sta-bile Sprache. Sie wurde nicht nur dazu benutzt, WebRunner zu entwickeln, sondern vonArthur van Hoff, der Ende 1993 zum Team kam, zur Entwicklung des Java-Compilersselbst verwendet. Ende 1994 stand WebRunner einer kleinen Anzahl von Entwicklernzum Test zur Verfgung und konnte nicht nur diese, sondern auch die Verantwortlichenbei SUN berzeugen. Das Programm wurde nach der Umbenennung in HotJava in dennchsten Monaten stabilisiert und konnte im Mai auf der SunWorld '95 der ffentlichkeitvorgestellt werden.

    Trotz des technologischen Durchbruchs und groen Presserummels mochten sich zunchstnur wenige Anwender mit HotJava anfreunden. Der berlegene Netscape Navigator warzu diesem Zeitpunkt bereits zu stark verbreitet. So war es ein groes Glck, dass Netscapesich entschied, die Java-Technologie von SUN zu lizenzieren und in der Version 2.0 desNavigators, die im Dezember 1995 auf den Markt kam, einem breiten Publikum zur Ver-fgung zu stellen. Die Ankndigung dieser Fortentwicklung, die Netscape-Grnder MarcAndreessen am 23. Mai 1995 zusammen mit der ffentlichen Vorstellung von Java vortrug,wird von SUN als offizielle Geburtsstunde von Java angesehen.

    Nach einigen Monaten des Betatests fr Java und HotJava wurde im Januar 1996 das JDK1.0, die erste Version des Java Development Kit, freigegeben. Bereits whrend der Betatestswurden hunderte von frei verfgbaren Applets geschrieben, die schon frh einen Eindruckvon den Mglichkeiten der Sprache vermittelten. Kurz vor der Fertigstellung des JDK 1.0wurde aus den verbliebenen Mitgliedern des Green-Teams die Firma JavaSoft gegrndet,die von SUN mit der Weiterentwicklung von Java betraut wurde. Unter ihrem PrsidentenAlan Baratz entwickelte und pflegte JavaSoft das JDK und seine Werkzeuge und solltefortan mageblich den weiteren Weg von Java bestimmen.

    Tatschlich stand die Entwicklung nun keinesfalls still, sondern nahm an Dynamik noch zu.In den folgenden Monaten bildeten sich eine Reihe von strategischen Allianzen zwischenSUN bzw. JavaSoft und vielen Groen der Branche. So wurde beispielsweise die im Mai1996 angekndigte Komponentenarchitektur JavaBeans von so prominenten Firmen wieBorland, Lotus, Oracle, IBM, Netscape und Symantec untersttzt.

    Im Laufe der nchsten Monate kam der Hype dann richtig in Fahrt, und Java wurde mitLorbeeren berhuft. In welcher Weise das Interesse an Java anstieg, mgen einige Kenn-zahlen verdeutlichen:

    X Gamelan ist ein Verzeichnis von Java-Ressourcen, das Verweise auf Java-Applets oder -Applikationen verwaltet. Whrend die Zahl der Eintrge im Januar 1996 noch deutlichunter 1000 lag, sollte sie sich innerhalb der nchsten 6 Monate vervierfachen.

  • Kapitel 1 Was ist Java?

    36

    X Eine hnliche Entwicklung nahmen die Java-Newsgroups im Internet. Whrend imJanuar 1996 lediglich eine einzige Gruppe comp.lang.java existierte, gibt es heute 12weitere Newsgroups innerhalb der comp.lang.java-Hierarchie mit insgesamt etwa 15000Nachrichten pro Monat. Zudem gibt es unzhlige nationale Newsgroups, Listserverund nicht-ffentliche Diskussionsforen.

    X Ein weiteres Beispiel fr die rasante Verbreitung ist die Anzahl der bei SUN offiziellregistrierten Java-Usergruppen. Sie lag im Februar 1996 bei 17, stieg bis Ende 1998 auf140 an und liegt heute bei fast 900. Weitere 2600 befinden sich in Grndung.

    X Die Ende 1996 von SUN ins Leben gerufene Java Developer's Connection, die als Down-load- und Service-Plattform fr die Java-Entwicklungswerkzeuge von SUN dient, ver-zeichnet heute mehrere Millionen registrierte Entwickler.

    Nach einer Reihe von Ankndigungen im ersten Halbjahr wurden bis Ende 1996 zahlreicheNeuerungen vorgestellt. Unter ihnen waren die Datenbank-Spezifikation JDBC, die Kom-ponentenarchitektur Beans, das Card API, HotJava Views, die 100 % Pure Java Initiativeund eine Reihe weiterer APIs. Zustzlich kamen die ersten integrierten Entwicklungssys-teme, wie Cafe und Visual Cafe von Symantec oder J++ von Microsoft, auf den Markt.

    Im Dezember 1996 wurde die Version 1.1 des Java Development Kit angekndigt. Siesollte eine Reihe von Bugs der Vorgngerversion beheben und weitere Funktionalittenhinzufgen. Im Februar 1997 standen die ersten Betaversionen des JDK 1.1 zur Verfgungund konnten von interessierten Entwicklern heruntergeladen werden. Im Mrz 1997wurde dann HotJava 1.0 herausgegeben (alle vorigen Versionen hatten lediglich Betacha-rakter), und auch das Java-Betriebssystem JavaOS 1.0 wurde in diesem Monat der ffent-lichkeit vorgestellt.

    Etwa zeitgleich konnte man auf der Cebit 1997 den ersten Prototypen der JavaStation, einerdiskettenlosen Workstation, die ausschlielich auf Java basierte, bewundern. Mit derAnkndigung von Java-Prozessoren wie dem PicoJava erffnete SUN die Perspektive, dassJava-Programme mittelfristig ebenso schnell laufen werden wie kompilierter C- oderC++-Code. Das fr Java-Entwickler herausragende Ereignis des Jahres war die JavaOne imApril 1997, die erste Konferenz, die sich ausschlielich um Java drehte. Sie brachte eineVielzahl von Ankndigungen, Prototypen und neuen Produkten hervor. Die JavaOne fin-det seither jedes Frhjahr in San Francisco statt und ist nach wie vor eines der wichtigstenEreignisse der weltweiten Java-Gemeinde.

    Die folgenden Monate standen fr viele Entwickler und Tool-Hersteller im Zeichen derUmstellung auf die Version 1.1 des JDK. Zwar gab es bereits Ende 1997 mehr als ein Dut-zend integrierte Entwicklungsumgebungen, doch Support fr die Version 1.1 war lngstnicht berall vorhanden. Auch die Browser-Hersteller taten sich schwer und stellten erst

  • Historie Kapitel 1

    37

    zum Jahreswechsel 1997/98 mit den 4er Versionen ihrer Browser erste Implementierungendes JDK 1.1 vor. Bis diese einigermaen stabil waren, vergingen weitere Monate.

    Whrend sich 1998 die meisten Entwickler mit der Version 1.1 beschftigten, wurde beiSUN bereits am neuen JDK 1.2 gearbeitet. Im Frhjahr 1998 stand dessen erste ffentlicheVersion, das JDK 1.2 Beta 2, der ffentlichkeit zur Verfgung. Wichtige Neuerungenwaren die Java Foundation Classes mit dem Swing Toolset, dem Java 2D API und dem Drag-and-Drop API, das Collection-API und das Extension Framework. Daneben gab es viele wei-tere Verbesserungen bestehender Pakete. Nach zwei weiteren Betas, die bis zum Julierschienen, brachte SUN im Oktober und November die Release Candidates 1 und 2heraus. Anfang Dezember 1998 wurde dann schlielich die erste finale Version des JDK 1.2zur Verfgung gestellt und im Januar 1999 in Java 2 Platform umbenannt.

    Mit der Version 1.2 hatte sich der Anspruch SUNs an das JDK gendert. Whrend es zuvordarum ging, mglichst viele Features in das JDK einzubauen, stand seit dem JDK 1.2 offizi-ell die Stabilitt und Performance im Vordergrund. Ersteres sollte mit einem rigorosenQualittssicherungsprogramm erreicht werden, letzteres durch Verbesserung der virtuellenMaschine. Im Mrz 1999 wurde der lange angekndigte HotSpot-Compiler ausgeliefert.Zwar brachte er mit seiner adaptiven Compilertechnologie, bei der interpretierte Pro-grammteile zur Ausfhrungszeit genau dann in direkt ausfhrbaren Maschinencode ber-setzt werden, wenn sie wesentlich zur Laufzeit des Programms beitragen, fr einigeAnwendungen Geschwindigkeitsvorteile. In vielen Fllen reichte den Entwicklern undAnwendern die Performance der Java-Programme jedoch nicht aus. Insbesondere dasSwing-Toolkit, die neue Grafikplattform, galt auf durchschnittlichen Arbeitspltzen als zutrge und trug sehr zu dem Ruf Javas bei, fr echte Anwendungen zu langsam zu sein.

    Zudem wurde das JDK 1.2 nur zgernd von der Industrie angenommen. Zwar gab es aufdem PC bald 1.2-kompatible Entwicklungswerkzeuge, doch auf anderen Betriebssystemen(Macintosh, UNIX, LINUX) blieben die Portierungen bei den 1.1er Versionen stehen.Die groen Browser-Hersteller haben bis heute keine brauchbaren 1.2er Java-Implemen-tierungen vorgestellt. Dies mag einerseits durch technische Schwierigkeiten begrndetgewesen sein, lag aber auch an der damals kaum akzeptierten Community Source Licence vonSUN. Mit dieser sollte ein offener Java-Standard etabliert werden, ohne dass SUN die Kon-trolle ber die Weiterentwicklung von Java verlor. Durch diese Vereinbarung waren Unter-nehmen, die Weiterentwicklungen des JDK vornahmen, unter Umstnden dazu verpflich-tet, diese offenzulegen bzw. unentgeltlich an SUN zu bergeben.

    Nach den fehlerbereinigten Versionen 1.2.1 und 1.2.2 des JDK betrieb SUN die Weiter-entwicklung des JDK unter dem Codenamen Kestrel. Mit einem neuen Garbage Collector,verbessertem Speichermanagement und einem neuen HotSpot-Compiler sollte diese Ver-sion stabiler und performanter werden als alle vorherigen. Viele kleine Verbesserungen

  • Kapitel 1 Was ist Java?

    38

    sollten zudem bei der Swing-Oberflche deutliche Geschwindigkeitsgewinne bringen. Dieintensive Arbeit an dieser Version uerte sich auch darin, dass alle Bugfixes des JDK 1.2.2auf die neue Version verschoben wurden.

    Im August 1999 gab es dann die erste ffentliche Betaversion des JDK 1.3. Tatschlich schie-nen sich die Versprechen zu erfllen. Bereits das Beta lief recht stabil und brachte bei der gra-fischen Oberflche deutliche Geschwindigkeitsgewinne. Durch eine genderte Initialisie-rung der virtuellen Maschine reduzierte sich die Startzeit von Java-Applikationen deutlich,und mit dem neuentwickelten Compiler gab es groe Verbesserungen bei den Turnaround-Zeiten. Auch subjektiv lieferte das JDK 1.3 den Eindruck erheblich besserer Performance.Nach drei weiteren Vorabversionen wurde im Mai 2000 die endgltige Version des JDK 1.3fr Windows ausgeliefert. Versionen fr andere Betriebssysteme (namentlich SOLARIS undLINUX) sollten etwa drei Monate spter folgen. Selbst Apple, dessen Java-Implementierun-gen lange Zeit bei der Version 1.1 stehen geblieben waren, liefert mit dem Mac OS X mitt-lerweile ein aktuelles JDK als integralen Bestandteil des Betriebssystems aus.

    2001 folgte dann das Bug-Fix-Release 1.3.1, und nach einigen Betas und einem ReleaseCandidate brachte SUN Mitte Februar 2002 schlielich das JDK 1.4 heraus diesmal zeit-gleich fr alle untersttzen Plattformen. Neben vielen Detailverbesserungen und umfang-reichen Erweiterungen der Klassenbibliotheken soll das JDK 1.4 weitere Performance-Ver-besserungen bringen. Sie werden unter anderem auch das zuvor schlechte Laufzeitverhaltenvon Swing-Anwendungen auf UNIX-Betriebssystemen beseitigen. Zu den wichtigstenfunktionalen Erweiterungen der Version 1.4 zhlen die assert-Anweisung, XML-Unter-sttzung, neue Bibliotheken fr schnelle I/O-Zugriffe, Benutzer-Voreinstellungen, Log-ging oder regulre Ausdrcke sowie viele Erweiterungen bestehender Bibliotheken. Zudemgibt es Untersttzung fr Solaris 64-Bit-Systeme und IPv6-Support. Das Jahr 2004 markiertden vorlufigen Hhepunkt der aktuellen Java-Entwicklung. Nachdem im Frhsommer daserste Beta unter dem Namen "JDK 1.5" verfgbar war, steht nach zwei weiteren Vorver-sionen pnktlich zum 30. September 2004 die endgltige Version zur Verfgung, nun unterdem offiziellen Namen "J2SE 5.0".

    Das Committment der Softwareentwickler zu den aktuellen Java-Versionen ist betrchtlich.Neben vielen Partnerschaften, bei denen Spezialisten aus der ganzen Welt durch die Mitar-beit im Java Community Process entscheidend zu den Neuerungen und Erweiterungen deraktuellen Versionen beigetragen haben, gibt es mittlerweile auch eine groe Zahl an Appli-kationen, die in Java geschrieben wurden oder bei deren Entwicklung Java eine wichtigeRolle gespielt hat. Auch bei der Entwicklung von Server-Appliationen und Web-Servicesspielt Java mittlerweile in der ersten Liga. So lsst sich feststellen, dass Java nach der ersten(Applet-)Euphorie der Versionen 1.0 und 1.1 und einer dezenten Zurckhaltung whrendder 1.2er Versionen mit dem JDK 1.3 auch bei den meisten Skeptikern den Durchbruchgeschafft hat. Dieser hat sich mit dem JDK 1.4 weiter gefestigt und wird - aller Voraussichtnach - auch in den kommenden Versionen weiter anhalten.

  • Eigenschaften von Java Kapitel 1

    39

    1.2 Eigenschaften von Java

    1.2.1 Sprachmerkmale

    Java wurde vollstndig neu entworfen. Die Designer versuchten, die Syntax der Sprachen Cund C++ soweit wie mglich nachzuahmen, verzichteten aber auf einen Groteil derkomplexen und fehlertrchtigen Merkmale beider Sprachen. Das Ergebnis ihrer Bem-hungen haben sie wie folgt zusammengefasst:

    Java soll eine einfache, objektorientierte, verteilte, interpretierte, robuste, sichere, architekturneutrale,portable, performante, nebenlufige, dynamische Programmiersprache sein.

    Seit der Version 1.2 firmieren alle Java-Versionen unter dem offiziellen Oberbegriff Java2 Platform im Unterschied zu der zwar niemals explizit so bezeichneten, aber dochwohl gemeinten Java 1 Platform, die aus den Versionen 1.0 und 1.1 bestand. Paralleldazu wurden die Entwicklungssysteme dann nicht mehr JDK, sondern Java 2 SDKgenannt (SDK steht fr Software Development Kit). Darber hinaus gilt es, drei unter-schiedlich umfangreiche Auslieferungen zu unterscheiden:

    X Die J2SE (Java 2 Standard Edition), von der in diesem Buch die Rede sein wird.X Die J2ME (Java 2 Micro Edition), fr kleine Gerte wie Mobiltelefone, PDAs oder

    Kreditkarten.

    X Die J2EE (Java 2 Enterprise Edition), fr das Entwickeln verteilter, unternehmenswei-ter Business-Applikationen.

    Mit der neuesten Version wurde bezglich der Namensgebung erneut eine kleine Kurs-korrektur vorgenommen. Einerseits wurde die Versionsnummer 1.5 whrend der Beta-phase auf 5.0 erhht (um laut SUN-Website das hohe Ma an Reife, Stabilitt,Sicherheit und Skalierbarkeit der aktuellen Version zu dokumentieren). Andererseitswurde der Begriff JDK rehabilitiert und darf nun auch offiziell wieder verwendet wer-den (Begrndung: ...due to significant popularity within the Java developer commu-nity...).

    Die offizielle Bezeichnung der aktuellen Java-Version ist also J2SE 5.0. Sie besteht ausden Teilen JDK (voller Name J2SE Development Kit 5.0 und JRE (voller Name J2SERuntime Environment 5.0). Wir werden meist von der J2SE 5.0 sprechen (weiblicheForm (!)), insbesondere wenn die aktuelle Version gemeint ist, mitunter aber auch denBegriff JDK verwenden. Wenn nicht anders erwhnt, beziehen sich alle Ausfhrungenin diesem Buch auf die Standard Edition.

  • Kapitel 1 Was ist Java?

    40

    Der Erfolg von Java hngt eng damit zusammen, dass ein wesentlicher Teil dieser Forderun-gen tatschlich in einer fr viele Programmierer akzeptablen Weise erfllt wurde obgleichwir am Ende dieses Kapitels auch einige kritische Anmerkungen dazu geben werden.

    Java ist sowohl eine objektorientierte Programmiersprache in der Tradition von Smalltalkals auch eine klassische imperative Programmiersprache nach dem Vorbild von C. Im Detailunterscheidet sich Java aber recht deutlich von C++, das denselben Anspruch erhebt.Durch die Integration einer groen Anzahl anspruchsvoller Features wie Multithreading,strukturiertem Exceptionhandling oder eingebauten grafischen Fhigkeiten implementiertJava eine Reihe interessanter Neuerungen auf dem Gebiet der Programmiersprachen.

    Zudem profitiert Java davon, dass viele der Features von C++ nicht realisiert wurden unddie Sprache dadurch schlank und bersichtlich wurde. So gibt es beispielsweise keine expli-ziten Pointer, keine separaten Header-Dateien, keine Mehrfachvererbung und keine Tem-plates in Java. Wer allerdings glaubt, Java sei eine Programmiersprache, die nur das Allern-tigste bietet, irrt. Tatschlich ist Java eine elegante Sprache, die auch fr grere Projekteund anspruchsvolle Aufgaben alle erforderlichen Reserven besitzt.

    In Java gibt es die meisten elementaren Datentypen, die auch C besitzt. Arrays und Stringssind als Objekte implementiert und sowohl im Compiler als auch im Laufzeitsystem veran-kert. Methodenlose Strukturtypen wie struct oder union gibt es in Java nicht. Alle primiti-ven Datentypen sind vorzeichenbehaftet und in ihrer Gre exakt spezifiziert. Java besitzteinen eingebauten logischen Datentyp boolean.

    Java bietet semidynamische Arrays, deren initiale Gre zur Laufzeit festgelegt werdenkann. Arrays werden als Objekte angesehen, die einige wohldefinierte Eigenschaftenhaben. Mehrdimensionale Arrays werden wie in C dadurch realisiert, dass einfache Arraysineinandergeschachtelt werden. Dabei knnen auch nicht-rechteckige Arrays erzeugt wer-den. Alle Array-Zugriffe werden zur Laufzeit auf Einhaltung der Bereichsgrenzen geprft.

    Die Ausdrcke in Java entsprechen weitgehend denen von C und C++. Java besitzt eineif-Anweisung, eine while-, do- und for-Schleife und ein switch-Statement. Es gibt die vonC bekannten break- und continue-Anweisungen in normaler und gelabelter Form. Letztereermglicht es, mehr als eine Schleifengrenze zu berspringen. Java besitzt kein goto-State-ment (obgleich es sich um ein reserviertes Wort handelt). Variablendeklarationen werdenwie in C++ als Anweisungen angesehen und knnen an beliebiger Stelle innerhalb desCodes auftauchen. Seit der Version 1.4 besitzt Java eine assert-Anweisung, die zur Laufzeitan- und abgeschaltet werden kann.

    Als OOP-Sprache besitzt Java alle Eigenschaften moderner objektorientierter Sprachen.Wie C++ erlaubt Java die Definition von Klassen, aus denen Objekte erzeugt werden kn-

  • Eigenschaften von Java Kapitel 1

    41

    nen. Objekte werden dabei stets als Referenzdatentypen behandelt, die wie Variablenangelegt und verwendet werden knnen. Zur Initialisierung gibt es Konstruktoren, und eskann eine optionale Finalizer-Methode definiert werden, die bei der Zerstrung desObjekt aufgerufen wird. Seit der Version 1.1 gibt es lokale Klassen, die innerhalb eineranderen Klasse definiert werden.

    Alle Methodenaufrufe in Java sind dynamisch. Methoden knnen berladen werden, Ope-ratoren allerdings nicht. Anders als in C++ ist das Late-Binding standardmig aktiviert,kann aber per Methode deaktiviert werden. Java erlaubt Einfach-, aber keine Mehrfachver-erbung von Implementierungen. Mithilfe von Interfaces (das sind abstrakte Klassendefinitio-nen, die nur aus Methoden bestehen) ist eine restriktive Form der Mehrfachvererbung mg-lich, die einen Kompromi zwischen beiden Alternativen darstellt. Java erlaubt dieDefinition abstrakter Basisklassen, die neben konkreten auch abstrakte Methoden enthalten.

    Neben Instanzvariablen und -methoden knnen auch Klassenvariablen und -methodendefiniert werden. Alle Elemente einer Klassendefinition knnen mithilfe der aus C++bekannten Schlsselwrter public, private und protected in ihrer Sichtbarkeit einge-schrnkt werden. Es gibt zwar keine friends, aber die Sichtbarkeit von Methoden oderKlassen kann auf das eigene Paket beschrnkt werden. Objektvariablen werden als Referen-zen implementiert. Mit ihrer Hilfe ist eine gegenber C/C++ eingeschrnkte Zeigerverar-beitung mglich, die das Erstellen dynamischer Datenstrukturen ermglicht.

    Das Speichermanagement in Java erfolgt automatisch. Whrend das Erzeugen von Objek-ten (von wenigen Ausnahmen abgesehen) immer einen expliziten Aufruf des new-Opera-tors erfordert, erfolgt die Rckgabe von nicht mehr bentigtem Speicher automatisch. EinGarbage-Collector, der als niedrigpriorisierter Hintergrundprozess luft, sucht in regelm-igen Abstnden nach nicht mehr referenzierten Objekten und gibt den durch sie belegtenSpeicher an das Laufzeitsystem zurck. Viele der Fehler, die bei der Programmierung in Coder C++ dadurch entstehen, dass der Entwickler selbst fr das Speichermanagement ver-antwortlich ist, knnen in Java nicht mehr auftreten.

    In Java gibt es ein strukturiertes Exceptionhandling. Damit ist es mglich, Laufzeitfehler zuerkennen und in strukturierter Weise zu behandeln. Eine Methode muss jeden Laufzeitfeh-ler, der whrend ihrer Abarbeitung auftreten kann, entweder abfangen oder durch einegeeignete Deklaration an den Aufrufer weitergeben. Dieser hat dann seinerseits die Pflicht,sich um den Fehler zu kmmern. Exceptions sind normale Objekte, und die zugehrigenKlassen knnen erweitert und als Grundlage fr anwendungsspezifische Fehler-Objekteverwendet werden.

  • Kapitel 1 Was ist Java?

    42

    1.2.2 Applets: Eine neue Klasse von Programmen

    Eine der am meisten gebrauchten Erklrungen fr den berraschenden Erfolg von Java ist dieenge Verbindung der Sprache zum Internet und zum World Wide Web. Mithilfe von Java istes mglich, Programme zu entwickeln, die ber das Web verbreitet und innerhalb einesBrowsers wie Netscape Navigator, SUN HotJava oder Microsoft Internet Explorer ausge-fhrt werden knnen. Dazu wurde die Sprache HTML um das APPLET-Tag erweitert. Siebietet so die Mglichkeit, kompilierten Java-Code in normale Web-Seiten einzubinden.

    Ein Java-fhiger Browser enthlt einen Java-Interpreter (die virtuelle Java-Maschine, auchkurz VM genannt) und die Laufzeitbibliothek, die bentigt wird, um die Ausfhrung desProgramms zu untersttzen. Die genaue Beschreibung der virtuellen Maschine ist Bestand-teil der Java-Spezifikation, und Java-VMs sind auf praktisch alle bedeutenden Betriebssys-tem-Plattformen portiert worden. Ein Applet kann damit als eine neue Art von Binrpro-gramm angesehen werden, das ber verschiedene Hardware- und Betriebssystemplattformenhinweg portabel ist und auf einfache Weise im Internet verteilt werden kann.

    Im Gegensatz zu den eingeschrnkten Mglichkeiten, die Script-Sprachen wie JavaScriptbieten, sind Applets vollstndige Java-Programme, die alle Merkmale der Sprache nutzenknnen. Insbesondere besitzt ein Applet alle Eigenschaften eines grafischen Ausgabefens-ters und kann zur Anzeige von Text, Grafik und Dialogelementen verwendet werden.Einer der groen Vorteile von Applets gegenber herkmmlichen Programmen ist ihreeinfache Verteilbarkeit. Anstelle explizit auszufhrender Installationsroutinen ldt derClassloader des Browsers die Bestandteile eines Applets einfach aus dem Netz und fhrt siedirekt aus. Das ist vor allem bei kleineren und mittelgroen Anwendungen in einer lokalenNetzwerkumgebung sehr hilfreich, insbesondere wenn diese sich hufig ndern.

    Sicherheit war eines der wichtigsten Designziele bei der Entwicklung von Java, und esgibt eine ganze Reihe von Sicherheitsmechanismen, die verhindern sollen, dass Java-Applets whrend ihrer Ausfhrung Schaden anrichten. So ist es einem Applet, das ineinem Web-Browser luft, beispielsweise nicht erlaubt, Dateioperationen auf dem loka-len Rechner durchzufhren oder externe Programme zu starten.

    Es soll allerdings nicht verschwiegen werden, dass die Applet-Euphorie im Laufe derZeit deutlich abgeklungen ist. Dies lag einerseits an den Java-Implementierungen derWeb-Browser, die mit den JDKs nicht Schritt halten konnten. Zudem legten die Sicher-heitsfeatures den Entwicklern oft so groe Beschrnkungen auf, dass sie die Ntzlichkeitvon Applets erheblich einschrnkten. Der groe Erfolg von Java in der Post-1.1-ra isteher in der Entwicklung von Applikationen als von Applets zu sehen. Mit der Verffent-lichung der WebStart-Technologie whrend des JDK 1.3 wurden dann die Vorteile bei-der Technologien wieder miteinander verbunden.

  • Eigenschaften von Java Kapitel 1

    43

    1.2.3 Grafikprogrammierung

    Die Java-Laufzeitbibliothek bietet umfassende grafische Fhigkeiten. Diese sind im Wesent-lichen plattformunabhngig und knnen dazu verwendet werden, portable Programme mitGUI-Fhigkeiten auszustatten. Seit der Version 1.2 des JDK werden diese Fhigkeiten unterdem Begriff Java Foundation Classes (kurz JFC) zusammengefasst, deren drei wichtigste Kom-ponenten die folgenden sind:

    X Das Abstract Windowing Toolkit (kurz AWT) bietet elementare Grafik- und Fensterfunk-tionen auf der Basis der auf der jeweiligen Zielmaschine verfgbaren Fhigkeiten.

    X Das Swing Toolset stellt darber hinaus eine Reihe zustzlicher Dialogelemente zur Ver-fgung und ermglicht die Konstruktion sehr komplexer grafischer Oberflchen. Mitseinem Pluggable Look-and-Feel bietet es die Mglichkeit, das Look-and-Feel eines Pro-grammes zur Laufzeit umzuschalten und den Bedrfnissen des jeweiligen Benutzers undden Fhigkeiten der Systemumgebung anzupassen.

    X Die dritte wichtige Komponente ist das Java 2D API, das komplexe Grafikoperationenund Bildbearbeitungsroutinen zur Verfgung stellt.

    Das AWT stellt eine Reihe von elementaren Operationen zur Verfgung, um grafischeAusgabeelemente, wie Linien, Polygone, Kreise, Ellipsen, Kreisabschnitte oder Rechtecke,zu erzeugen. Diese Methoden knnen auch in einem Fllmodus verwendet werden, derdafr sorgt, dass die gezeichneten Flchen mit Farbe ausgefllt werden. Wie in den meistenGrafik-Libraries realisiert auch Java die Bildschirmausgabe mithilfe des Konzepts eines Gra-fikkontexts, der eine Abstraktion des tatschlichen Ausgabegertes bildet.

    Neben grafischen Elementen kann natrlich auch Text ausgegeben und an beliebiger Stelleinnerhalb der Fenster platziert werden. Text kann skaliert werden, und es ist mglich, mitunterschiedlichen Fonts zu arbeiten. Das AWT bemht sich, einen portablen Weg zurFont-Auswahl anzubieten, indem eine Reihe von elementaren Schriftarten auch berPlattformgrenzen hinweg angeboten werden. Mithilfe von Font-Metriken knnen num-

    Es ist eine bemerkenswerte Innovation, dass Elemente fr die GUI-Programmierung ineiner Programmiersprache portabel zur Verfgung gestellt werden. Zwar gab es im Prin-zip auch frher schon Programmiersprachen, die grafische Fhigkeiten hatten, aber wereinmal die Aufgabe hatte, eine grafische Benutzeroberflche unter Windows, OS/2,UNIX und auf dem MAC zur Verfgung zu stellen, hatte meistens dennoch erheblichenPortierungsaufwand. Mit Standardmitteln der Sprachen C oder C++ und ihren Lauf-zeitbibliotheken war dies jedenfalls nicht mglich. Mit Java und ihren Klassenbibliothe-ken steht nun erstmals eine einfach zu verwendende Sprache zur Verfgung, die dasErstellen von GUI-Programmen bereits als Kernfunktionalitt bietet.

  • Kapitel 1 Was ist Java?

    44

    merische Eigenschaften der verwendeten Schriftarten bestimmt und bei der Ausgabebercksichtigt werden.

    Das Farbmodell von Java basiert auf dem RGB-Modell, das seine Farben additiv auf derBasis der enthaltenen Rot-, Grn- und Blauanteile bestimmt. Daneben wird auch dasHSB-Modell untersttzt (hue, saturation, brightness), und es gibt Methoden zur Konvertie-rung zwischen beiden. Das Farbsystem untersttzt eine Reihe von vordefinierten Farben,die plattformbergreifend zur Verfgung stehen.

    Neben Grafik kann auch Sound ausgegeben werden. Java untersttzt die Wiedergabe vonau-Dateien (ein von SUN eingefhrtes Format zur Speicherung von digitalen Sound-Samples) und seit der Version 1.2 auch wav- und aiff-Dateien, die entweder ber das Internetoder aus einer lokalen Datei geladen werden knnen. Die Samples knnen einmalig abge-spielt oder in einer Schleife wiederholt werden. Daneben ist es mglich, zwei oder mehrSound-Dateien gleichzeitig abzuspielen. Seit dem JDK 1.2 gibt es ein eigenes Sound-API,das neben Wave-Dateien auch Midi-Dateien wiedergeben und bearbeiten kann.

    Das AWT erlaubt die Anzeige und Manipulation von Bilddaten. Mithilfe von Standardme-thoden knnen Grafiken in elementaren Formaten wie GIF oder JPEG geladen, skaliertund auf dem Bildschirm angezeigt werden. Zustzlich gibt es das Paket java.awt.image, dasfr die Manipulation von Bilddaten entworfen wurde und ausgefeilte Funktionen zur Bild-und Farbmanipulation zur Verfgung stellt.

    Die zweite graphische Oberflche des JDK, das Swing-Toolkit, bietet noch weitreichendereFhigkeiten als das AWT. Dazu wurde eine vollkommen neue Architektur entworfen, und esstehen viele zustzliche Dialogelemente, wie Tabellen, Trees oder Karteikarten, zur Verf-gung. Anstatt wie im AWT auf die Eigenschaften vorgefertigter GUI-Elemente zu ver-trauen, verwendet Swing lediglich einen sehr eingeschrnkten Satz an plattformspezifischenGrafikoperationen. Alle Dialogelemente werden unter Verwendung einfacher und portablerGrafikprimitive selbst dargestellt. Die Anzahl der Unterschiede zwischen den verschiedenenPlattformen wird auf diese Weise drastisch reduziert, und die Swing-Dialogelemente lassensich wesentlich einfacher und konsistenter auf unterschiedliche Grafiksysteme portieren.

    Wie in den meisten grafischen Entwicklungsumgebungen wird auch beim AWT derProgrammfluss durch Nachrichten gesteuert. Sie werden beim Auftreten bestimmterEreignisse an das Programm gesendet und von diesem in geeigneter Weise behandelt.Java stellt Nachrichten zur Bearbeitung von Maus-, Tastatur-, Fenster-, Dialog- und vie-len anderen Ereignissen zur Verfgung. Das Event-Handling seit dem JDK 1.1 erlaubtes, Nachrichten an jedes beliebige Objekt zu senden, das die Schnittstelle eines Nach-richtenempfngers implementiert.

  • Eigenschaften von Java Kapitel 1

    45

    1.2.4 Umfangreiche Klassenbibliothek

    Die Java-Klassenbibliothek bietet mit einer ganzen Reihe ntzlicher Klassen und Interfacesdie Mglichkeit, sehr problemnah zu programmieren. Einige dieser Features sind vonAnfang an ntzlich, andere erschlieen sich erst nach einer gewissen Einarbeitung.

    Neben grafischen Ausgabemglichkeiten stellt Java auch einfache Textausgaben zur Verf-gung, hnlich den entsprechenden Funktionen in C oder C++. Damit ist es mglich, Pro-gramme mit einfachen, zeilenorientierten Ein-/Ausgabemglichkeiten auszustatten, wennkeine aufwendige Benutzerschnittstelle bentigt wird. Einfache Textausgaben werden mitden Methoden der Klasse PrintStream erzeugt. Diese erlauben es, alle gngigen Datentypenin ein Terminalfenster auszugeben. Die Klassenvariable System.out bietet einen vordefinier-ten PrintStream, der vom Laufzeitsystem initialisiert wird. In hnlicher Weise steht mit Sys-tem.in die Mglichkeit zur Verfgung, einfache Texteingaben von der Tastatur einzulesen.

    Eines der wichtigsten Elemente der Klassenbibliothek ist die Klasse String, die Java-Implemen-tierung von Zeichenketten. String bietet eine Vielzahl wichtiger Methoden zur Manipulationund zum Zugriff auf Zeichenketten, wie beispielsweise Operationen fr nummerische Kon-vertierungen, Zeichen- und Teilstringextraktion sowie fr Textsuche und Stringvergleich.

    Interessanterweise kann sich ein String-Objekt nach seiner Initialisierung nicht mehr ver-ndern, sondern behlt stets seinen ursprnglichen Wert. Was zunchst wie eine schwer-wiegende Restriktion aussieht, ist in der Praxis meist bedeutungslos. Denn in Zusammen-arbeit mit der Klasse StringBuffer (die variabel lange Strings reprsentiert) und derFhigkeit des Compilers, selbige automatisch bei der String-Initialisierung, -Zuweisungund -Verkettung zu verwenden, bleibt diese Tatsache fr den Programmierer normaler-weise verborgen. Dank des automatischen Speichermanagements und der effizienten Kon-vertierung von StringBuffer nach String hnelt der Umgang mit Strings aus der Sicht desProgrammierers dem mit variabel langen Zeichenketten in anderen Programmiersprachen.Wegen des automatischen Speichermanagements sind Java-Strings sehr viel sicherer alsnullterminierte Strings in C oder C++.

    Ein Vector in Java ist eine lineare Liste, die jede Art von Objekt aufnehmen kann und aufderen Elemente sowohl sequentiell als auch wahlfrei zugegriffen werden kann. Die Lngeeines Vektors ist vernderlich, und Elemente knnen am Ende oder an einer beliebigenanderen Stelle eingefgt werden. Aufgrund dieser Flexibilitt kann ein Vector oft da ver-wendet werden, wo ansonsten eine lineare Liste durch Verkettung von Objektreferenzenmanuell erstellt werden msste. Wie gewhnlich erfolgt auch das Speichermanagementeines Vektors vollkommen automatisch. Neben Vector gibt es weitere Container-Klassen.So bietet beispielsweise Hashtable die Mglichkeit, Schlssel-Wert-Paare zusammenhn-gend zu speichern und bei gegebenem Schlssel den zugehrigen Wert effizient wiederaufzufinden.

  • Kapitel 1 Was ist Java?

    46

    Ein ntzlicher Mechanismus zum Durchlaufen von Container-Klassen ist das Enumeration-Interface, das die Methoden hasMoreElements und nextElement zur Verfgung stellt. Dieseknnen verwendet werden, um in einer Schleife alle Elemente des Containers sukkzessivezu durchlaufen. Alle vordefinierten Container-Klassen stellen Methoden zur Verfgung,die Enumeration-Objekte zum Durchlaufen der eigenen Elemente zurckgeben.

    Seit dem JDK 1.2 gibt es in Java eine eigene Bibliothek fr Container-Klassen, das Collec-tion-API. Sie stellt eine umfassende Sammlung an Interfaces fr Container-Klassen zur Ver-fgung und bietet unterschiedliche Implementierungen fr verschiedene Anwendungs-flle. Die zuvor erwhnte Klasse Enumeration wird hier durch das Interface Iterator ersetzt,das einfacher zu bedienen ist. Das Collection-API stellt daneben einige Algorithmen zurVerarbeitung von Containern zur Verfgung (z.B. Sortieren), die es in den lteren Contai-ner-Klassen nicht gab.

    Java stellt auch Zufallszahlen zur Verfgung. Das Paket java.util bietet eine Klasse Random,die das Initialisieren von Zufallszahlengeneratoren und den Zugriff auf ganzzahlige oderFliekomma-Zufallszahlen ermglicht. Neben gleichverteilten stellt die Klasse Random auchnormalverteilte Zufallszahlen zur Verfgung.

    Seit dem JDK 1.1 werden darber hinaus mit jedem Release weitere hochspezialisierte(und teilweise sehr aufwendige) Bibliotheken zur Verfgung gestellt. So bietet beispiels-weise JDBC (Java Database Connectivity) den Zugriff auf relationale Datenbanken, JavaBeansstellt eine portable Komponentenarchitektur zur Verfgung, und mit dem Networking-API,RMI (Remote Method Invocation) und der Java-eigenen CORBA-Implementierung javaidlkann unternehmensweit auf Netzwerkressourcen und verteilte Objekte zugegriffen wer-den. Per Serialisierung knnen Objekte persistent gemacht werden, und mit dem Reflection-API kann der Aufbau von Objekten und Klassen zur Laufzeit untersucht und dynamischdarauf zugegriffen werden. Wir werden in diesem Buch die wichtigsten dieser Biblio-theken ausfhrlich erlutern.

    1.3 Bewertung

    1.3.1 Einige weitverbreitete Missverstndnisse ...

    Wie bereits im Vorwort erwhnt, wollen wir uns der Java-Euphorie gerne anschlieen, sieaber nicht vollkommen kritiklos bernehmen. In diesem Abschnitt soll der Versuch unter-nommen werden, eine kurze Bewertung zu geben und einige der hufigsten Miverstnd-nisse auszurumen. Wir wollen dabei zunchst zu einigen Thesen Stellung nehmen, dieimmer wieder artikuliert werden und hufig zu berzogenen oder falschen Annahmenber das Wesen von Java fhren.

  • Bewertung Kapitel 1

    47

    These 1: Java == JavaScript

    JavaScript ist eine von Netscape entwickelte Script-Sprache zur Erweiterung von HTML-Seiten. Sie ist syntaktisch an Java angelehnt, bietet aber bei weitem nicht so viele Features.Sie wird nicht in Bytecode kompiliert, sondern vom Browser interpretiert und erlaubtweder die Konstruktion von Applets noch von eigenstndigen Applikationen. Als Script-Sprache ist sie vorwiegend fr einfache Manipulationen am Layout und der Interaktions-fhigkeit von HTML-Seiten gedacht.

    These 2: Java ist einfach zu erlernen

    Diese gern wiederholte These aus der Sprachbeschreibung ist nur bedingt richtig. Java isteine objektorientierte Programmiersprache mit fortschrittlichen Eigenschaften und musswie eine solche erlernt werden. Sie ist einfacher zu beherrschen als C oder C++, und esgibt weniger Raum fr Anfngerfehler. Auch die Klassenbibliothek ist leichter zu verwen-den, denn sie wurde neu entworfen und kommt ohne die Altlasten nicht-objektorientier-ter Vorgnger daher. Die Kompatibilittsanforderungen von mittlerweile fnf JDK-Folge-versionen (1.1, 1.2, 1.3, 1.4 und 5.0) merkt man ihr aber durchaus an. Vor allem wegen desgroen Umfangs der Klassenbibliotheken erfordert der Umgang mit Java ein nicht zuunterschtzendes Ma an Einarbeitungszeit, bevor man als Entwickler zu produktivenErgebnissen kommt.

    These 3: Java ist portabel

    Die Quellcode-Portabilitt von Java-Programmen ist auf der reinen Sprachebene etwashher als die von C- oder C++-Programmen. Das ist hauptschlich dem Verzicht aufexplizite Pointer sowie maschinennahe Datentypen und Operatoren zu verdanken. Auchdie genaue Spezifikation der elementaren Datentypen trgt zu dieser Tatsache bei.

    Bezieht man dagegen die riesige Klassenbibliothek mit ihren auf allen Plattformen stan-dardmig vorhandenen Funktionen in die Betrachtung ein, fallen C und C++ im Porta-bilittsvergleich weit zurck. Funktionalitten wie Datenbankzugriffe, Netzwerkprogrammie-rung, Multithreading, Serialisierung, Grafikprogrammierung und viele andere mehr sind in Javabereits in der Standardversion enthalten und stehen auf allen Plattformen in praktisch iden-tischer Weise zur Verfgung.

    Ein weiterer Portabilittsvorteil von Java besteht zudem darin, dass die kompilierten Pro-gramme binrkompatibel sind. Ein einmal bersetztes Programm wird auf jeder Plattformlaufen, die eine Java-VM und die erforderliche Laufzeitumgebung zur Verfgung stellt. EinRekompilieren, wie es bei C- oder C++-Programmen erforderlich ist, bentigen Java-Programme daher nicht.

  • Kapitel 1 Was ist Java?

    48

    These 4: Java-Programme sind langsam

    Da Java-Programme in Bytecode bersetzt werden, der nicht direkt vom Prozessor ausge-fhrt werden kann, muss ein Interpreter diese Aufgabe bernehmen. Dadurch knnenCPU-lastige Java-Programme um den Faktor 10 bis 20 langsamer sein als vergleichbare C/C++-Programme.

    Dieses Argument wird auch heute noch gern von der C-/C++-Fraktion angefhrt. In derPraxis relativiert es sich durch mehrere Faktoren. Einerseits sind nur wenige Programmeausgesprochen CPU-intensiv. Die meisten interaktiven Programme verbringen nmlicheinen Groteil ihrer Zeit damit, auf Eingaben des Benutzers oder langsame Datenbank-oder Festplattenzugriffe zu warten. Zudem wurde das Laufzeitverhalten von Java-Program-men durch die Entwicklung von Just-In-Time-Compilern, Native-Code-Compilern oderJava-Prozessoren in den letzten Jahren stetig verbessert und nhert sich zunehmend demvon kompiliertem C/C++-Code an. Die seit dem JDK 1.3 zum Umfang des JDK geh-renden HotSpot-Compiler analysieren zur Laufzeit des Programmes den interpretiertenBytecode und bersetzen besonders rechenintensive Teile in direkt ausfhrbaren Maschi-nencode.

    Das Performance-Problem kann daher als temporres Problem angesehen werden falls esfr den speziellen Typ Anwendung berhaupt noch existiert. Viele Beobachter gehenheute davon aus, dass Java-Programme in den meisten praktisch relevanten Situationen mitderselben Geschwindigkeit laufen wie kompilierte C/C++-Programme, und Benchmarksbesttigen diese Ergebnisse bereits. Auch die anfnglichen Performance-Probleme derSwing-Oberflchen wurden mit dem JDK 1.3 und seinen Nachfolgeversionen weitgehendunschdlich gemacht. Auch der nach wie vor anhaltende Fortschritt bei der Hardware-Entwicklung hat seinen Beitrag geleistet. Whrend die ersten Java-Versuche meist auf PCsder Kategorie Pentium-I mit 75 MHz und 8 MByte RAM abliefen, haben die aktuellenCPUs die 3GHz-Marke berschritten, und 512 MB Hauptspeicher zhlen zum guten Ton.

    Dennoch kann der unachtsame Entwickler in Java leicht zu einer schlechten Gesamtperfor-mance beitragen. Wer die abstrakten Designmglichkeiten von Strings, Readern oderWritern, Collection-Klassen und vielen anderen Bestandteilen der Klassenbibliothekbedenkenlos verwendet, kann das Laufzeitverhalten seines Programmes stark beeintrchti-gen. Schon mit der Kenntnis einiger Details ber den Aufbau wichtiger JDK-Klassen lassensich die vorhandenen Bibliotheken weit effizienter nutzen, und die Performance der Pro-gramme steigt an. In Kapitel 49 auf Seite 1195 gehen wir auf einige dieser Details ein undzeigen, wie man Java-Programme schreibt, deren Performance fr viele Anwendungenadquat ist.

  • Bewertung Kapitel 1

    49

    These 5: Java ist nicht fr ernsthafte Anwendungen geeignetDiese Behauptung resultiert vor allem aus drei Beobachtungen. Zum einen hatten viele derzunchst in Java entwickelten Anwendungen Spielzeug- oder Demo-Charakter. Meist alsApplet realisiert, hatten sie lediglich die Aufgabe, eine Homepage zu verschnern oder dieJava-Kentnisse ihrer Entwickler im zweckfreien Raum zu demonstrieren. Echten Nutz-wert boten dagegen nur wenige. Und grere Applikationen, die komplett in Javageschrieben wurden, waren zunchst kaum auf dem Markt. Dies hat sich mittlerweile voll-stndig gendert. Es gibt hunderte, wahrscheinlich tausende von ausgewachsenen Java-Applikationen aus allen nur erdenklichen Anwendungsgebieten.

    Zweitens war das Look-and-Feel von Java-Programmen nicht ausgereift. Tatschlich bildetdas AWT nur einen geringen Anteil der in den jeweiligen plattformspezifischen Fenstersys-temen verfgbaren Mglichkeiten ab. Die wenigen Dialogelemente stehen allerdings por-tabel zur Verfgung. Mithilfe des Swing-Toolsets kann dieses Problem als gelst angesehenwerden. Swing bietet einen umfassenden Satz komplexer Dialogelemente und stellt ihnplattformbergreifend zur Verfgung. Dabei ist es mglich, das Look-and-Feel der jeweili-gen Anwendung zur Laufzeit umzustellen und so dem Geschmack und den Kenntnissendes jeweiligen Benutzers anzupassen.

    Die dritte Beobachtung besagt, dass Java voller Fehler steckt. Whrend dies weniger fr dieSprache selbst, ihre Werkzeuge oder die elementaren Eigenschaften der Klassenbibliothekgalt, konnten die frhen Grafikbibliotheken ein gewisses Ma an Fehlerhaftigkeit nichtverhehlen. Zwar gibt es nach wie vor Fehler im JDK (alle bekannten Bugs sind in der alsBug Parade bezeichneten Fehlerdatenbank gespeichert), doch sind diese in aller Regel nichtso schwerwiegend, dass nicht ein Workaround gefunden werden knnte. Zudem steckendie Fehler meist in den Klassenbibliotheken. Der Compiler und die virtuelle Maschine, aufder die ausfhrbaren Programme laufen, knnen fr die meisten Anwendungen als hinrei-chend stabil angesehen werden. Auch hier gibt es Ausnahmen, insbesondere bei JDK-Por-tierungen auf weniger gebruchliche Betriebssysteme. Auf den meisten Systemen ist dasJDK in der tglichen Praxis jedoch ein ausgesprochen stabiles, zuverlssiges und mittler-weile auch sehr performantes Entwicklungswerkzeug.

    1.3.2 Ausblick

    Wenn man das Anwenderinteresse zugrunde legt, ist Java die mit Abstand erfolgreichsteProgrammiersprache der letzten Jahre. Wie oben gezeigt, hat die Sprache in den wenigenJahren seit Ausgabe der Version 1.0 eine immense Verbreitung erfahren. Java war Anlass frTausende von Bchern und Zeitschriftenartikeln, und es gibt auch einige Zeitschriften, diesich ausschlielich mit Java beschftigen. Zudem entstanden eine Reihe von stark frequen-tierten Newsgroups, die das Interesse an Java deutlich machen. Alle greren Softwareher-steller untersttzen die Sprache und haben konkrete Produkte realisiert. In den meisteneinschlgigen Stellenanzeigen werden Java-Kenntnisse verlangt.

  • Kapitel 1 Was ist Java?

    50

    Zeitgleich zur Diskussion um die Eignung Javas als Entwicklungswerkzeug