18.01 Untersuchen der Programmiersprache Java und entwickeln von DemoApplikationen mit Java Tutorial AUTOR: J.-P. Thomsen BETREUER: H.-J. Wenger KLASSE: B17 Grenchen, den 10.6.96 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial Inhalt 2 Inhalt INHALT............................................................................................... 2 1 EINFÜHRUNG ................................................................................... 7 1.1 Was ist Java? ..........................................................................................................7 1.1.1 WAS SIND JAVA-APPLETS ?..................................................................................... 8 1.1.2 WAS IST HOTJAVA ? ................................................................................................. 8 1.1.3 WAS SIND JAVA-GESTEUERTE SEITEN ? .............................................................. 8 1.2 Die Geschichte der Programmiersprache Java.......................................................9 1.2.1 DIE ANFÄNGE ............................................................................................................ 9 1.2.2 DAS GREEN-PROJEKT............................................................................................. 10 1.2.3 WEBBROWSER UND HOTJAVA.............................................................................. 10 1.2.4 WAS BEDEUTET JAVA ? ......................................................................................... 11 1.3 Die wichtigsten Eigenschaften...............................................................................12 1.3.1 JAVA IST EINFACH UND UNKOMPLIZIERT ......................................................... 12 1.3.2 JAVA IST OBJEKTORIENTIERT.............................................................................. 12 1.3.3 JAVA IST ROBUST ................................................................................................... 14 1.3.4 JAVA IST SICHER..................................................................................................... 14 1.3.5 JAVA IST PARALLELISIERBAR, MULTITHREADED............................................ 14 1.3.6 JAVA-PROGRAMME SIND SCHON KOMPILIERT................................................. 15 1.3.7 JAVA IST PLATTFORMUNABHÄNGIG .................................................................. 15 1.3.8 JAVA IST ERWEITERUNGSFÄHIG ......................................................................... 16 1.3.9 JAVA IST GUT ERFORSCHT.................................................................................... 16 2 JAVA UND DAS INTERNET .............................................................. 17 2.1 Die Java-Applets ...................................................................................................18 2.2 Sicherheitsaspekte.................................................................................................18 2.2.1 DIE VERIFIZIERUNG ............................................................................................... 19 2.2.2 ZUGRIFFSMÖGLICHKEITEN .................................................................................. 19 2.3 Die virtuelle Maschine...........................................................................................20 2.4 Applets und Anwendungen ...................................................................................20 2.4.1 APPLETS ................................................................................................................... 20 2.4.2 ANWENDUNGEN ..................................................................................................... 21 2.5 JavaScript .............................................................................................................21 3 DIE SPRACHE JAVA ....................................................................... 22 3.1 Unterschiede zu C/C++ .........................................................................................22 3.1.1 KEINE HEADER FILES UND PRECOMPILER......................................................... 22 3.1.2 KEINE STRUKTUREN UND UNIONS...................................................................... 23 3.1.3 KEINE FUNKTIONEN............................................................................................... 23 3.1.4 KEINE MEHRFACHVERERBUNG ........................................................................... 23 3.1.5 KEINE GOTO-BEFEHLE........................................................................................... 23 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial Inhalt 3 3.1.6 KEIN ÜBERLADEN VON OPERATOREN ............................................................... 23 3.1.7 KEINE AUTOMATISCHE TYPENUMWANDLUNG................................................ 24 3.1.8 KEINE POINTER UND POINTERARITHMETIK ..................................................... 24 3.1.9 KEINE VAGE DEFINIERTEN DATENTYPEN......................................................... 24 3.1.10 KEINE FREIE ARGUMENTENANZAHL (VARGS) ............................................... 24 3.1.11 KEINE SEMIKOLON ? ............................................................................................ 25 3.2 Überblick über die Syntax ....................................................................................25 3.2.1 KOMMENTARE ........................................................................................................ 25 3.2.2 EINFACHE DATENTYPEN....................................................................................... 25 3.2.3 REFERENZIERENDE DATENTYPEN...................................................................... 26 3.2.4 OBJEKTE ................................................................................................................... 27 3.2.5 MÜLLABFUHR, „GARBAGE COLLECTOR“........................................................... 29 3.2.6 ARRAYS .................................................................................................................... 30 3.2.7 ZEICHENKETTEN (STRINGS) ................................................................................. 31 3.2.8 ARITHMETISCHE UND RELATIONALE OPERATOREN....................................... 31 3.2.9 BEFEHLE................................................................................................................... 33 3.2.10 SCHLÜSSELWORTE ............................................................................................... 36 3.2.11 SYNCHRONISIERUNG ........................................................................................... 36 3.3 Ausnahmen (Exceptions + Exception Handling)...................................................37 3.3.1 AUSNAHME-OBJEKT............................................................................................... 38 3.3.2 BEHANDLUNG VON AUSNAHMEN ....................................................................... 38 3.3.3 DEFINITION UND ANWENDUNG VON AUSNAHMEN......................................... 39 3.4 Threads .................................................................................................................40 3.4.1 FUNKTIONSWEISE VON THREADS....................................................................... 40 3.4.2 SYNCHRONISATIONS-ANWEISUNGEN ................................................................ 41 3.5 Benennungskonventionen......................................................................................42 3.6 Die Java-Packages.................................................................................................43 4 OBJEKTE UND KLASSEN ................................................................ 44 4.1 Einführung in Klassen und Objekte......................................................................44 4.1.1 OBJEKTE ALS INSTANZEN VON KLASSEN ......................................................... 44 4.1.2 ZUGRIFF AUF OBJEKTDATEN ............................................................................... 45 4.1.3 GEBRAUCH VON OBJEKTMETHODEN ................................................................. 45 4.1.4 FUNKTIONSWEISE .................................................................................................. 45 4.2 Erzeugen von Klassen ...........................................................................................46 4.2.1 DEFINITION EINES KONSTRUKTORS ................................................................... 46 4.2.2 MEHRFACHE KONSTRUKTOREN .......................................................................... 47 4.2.3 ÜBERLADEN VON METHODEN ............................................................................. 47 4.3 Klassenvariablen ...................................................................................................48 4.3.1 BEISPIEL EINER KLASSENVARIABLEN ............................................................... 48 4.3.2 ZUGREIFEN AUF KLASSENVARIABLEN .............................................................. 49 4.3.3 GLOBALE VARIABLEN ?......................................................................................... 49 4.3.4 KONSTANTEN.......................................................................................................... 49 4.4 Klassenmethoden ..................................................................................................49 4.4.1 BESONDERE MERKMALE....................................................................................... 50 4.4.2 BEISPIEL EINER KLASSENMETHODE................................................................... 50 4.4.3 STATISCHE INITIALISIERUNG............................................................................... 51 4.5 Löschen von Objekten ..........................................................................................51 4.5.1 GARBAGE COLLECTOR .......................................................................................... 51 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial Inhalt 4 4.5.2 FINILIZATION-METHODE....................................................................................... 51 4.6 Klassenhierarchie und Vererbung ........................................................................52 4.6.1 VERERBEN VON KLASSEN .................................................................................... 52 4.6.2 ENDKLASSEN........................................................................................................... 52 4.6.3 KLASSENHIERARCHIE............................................................................................ 53 4.6.4 UNTERKLASSEN UND KONSTRUKTOREN........................................................... 53 4.6.5 VERKETTUNG VON KONSTRUKTOREN............................................................... 54 4.6.6 DER DEFAULT-KONSTRUKTOR ............................................................................ 55 4.7 Überschreiben von Methoden ...............................................................................55 4.7.1 FINALE METHODEN................................................................................................ 56 4.7.2 DYNAMISCHES NACHSCHLAGEN DER METHODE ............................................ 56 4.7.3 AUFRUFEN EINER ÜBERSCHRIEBENEN METHODE ........................................... 56 4.7.4 VERKETTUNG VON FINALIZER-METHODEN...................................................... 56 4.8 Geheimhaltung und Datenkapselung.....................................................................57 4.8.1 SICHTBARKEIT VON DATEN, METHODEN, KLASSEN....................................... 57 4.8.2 DATENZUGRIFF DER METHODEN ........................................................................ 58 4.9 Abstrakte Klassen und Interfaces .........................................................................59 4.9.1 ABSTRAKTE METHODEN....................................................................................... 59 4.9.2 INTERFACES ............................................................................................................ 59 4.9.3 MEHRFACHE INTERFACES .................................................................................... 60 4.9.4 KONSTANTEN UND INTERFACES......................................................................... 60 4.9.5 VERERBUNG (ERWEITERUNG) VON INTERFACES............................................. 60 5 PROGRAMMIERUNG ...................................................................... 62 5.1 Applets ..................................................................................................................62 5.1.1 EINFÜHRUNG IN APPLETS ..................................................................................... 62 5.1.2 DAS ERSTE APPLET ................................................................................................ 63 5.1.3 ZEICHNEN VON GRAPHIKEN................................................................................. 64 5.1.4 BEHANDLUNG VON EREIGNISSEN....................................................................... 64 5.1.5 DER EVENT-HANDLER ........................................................................................... 65 5.1.6 LESEN VON APPLET-PARAMETERN..................................................................... 66 5.1.7 EINFÜGEN VON SCHALTFLÄCHEN ...................................................................... 66 5.1.8 IMAGEMAP (BILDERKARTE) ................................................................................. 67 5.1.9 ANIMATIONEN ........................................................................................................ 67 5.1.10 SOUND..................................................................................................................... 68 5.2 Graphical User Interface (GUI)............................................................................68 5.2.1 DIE WICHTIGSTEN KLASSEN ................................................................................ 68 5.2.2 DIE KLASSE EVENT ................................................................................................ 69 5.2.3 DIE KLASSE COMPONENT ..................................................................................... 70 5.2.4 DIE KLASSE CONTAINER....................................................................................... 71 5.3 Eingabe und Ausgabe............................................................................................72 5.3.1 LESEN UND ANZEIGEN VON FILES ...................................................................... 72 5.3.2 BESCHAFFUNG VON DATEI-INFORMATION ....................................................... 72 5.3.3 KOPIEREN EINES FILES.......................................................................................... 72 5.3.4 FILTERN VON EINGABEN ...................................................................................... 72 5.3.5 PIPES.......................................................................................................................... 73 5.4 Networking............................................................................................................73 5.4.1 HERUNTERLADEN VON URL-INHALTEN............................................................. 74 5.4.2 BENUTZUNG EINER URL-VERBINDUNG.............................................................. 74 5.4.3 SENDEN UND EMPFANGEN VON DATENPAKETEN........................................... 74 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial Inhalt 5 5.4.4 IMPLEMETIERUNG EINES SERVERS .................................................................... 76 5.4.5 IMPLEMETIERUNG EINES CLIENTS ..................................................................... 76 5.5 Kommunikation zwischen Applets ........................................................................77 5.5.1 APPLETS AUF DER SELBEN SEITE........................................................................ 77 5.5.2 KOMMUNIKATION MIT DEM BROWSER.............................................................. 77 5.5.3 ARBEITEN MIT SERVER-APPLIKATIONEN.......................................................... 78 5.5.4 UMGEHEN DER EINSCHRÄNKUNGEN.................................................................. 78 5.5.5 MÖGLICHKEITEN UND EINSCHRÄNKUNGEN..................................................... 78 A JAVA DEVELOPMENT KIT (JDK) ................................................. 80 A.1 Der Applet Viewer (appletviewer) .......................................................................80 A.2 Der Interpreter (java) ..........................................................................................80 A.3 Der Compiler (javac)............................................................................................81 A.4 Der Dokument-Generator (javadoc) ....................................................................81 A.5 Native Method C File Generator (javah) .............................................................81 A.6 Class Disassembler (javap)...................................................................................81 A.7 Debugger (jdb) .....................................................................................................82 B ENTWICKLUNGS-TOOLS............................................................... 83 B.1 Silicon Graphics: Cosmo Code.............................................................................83 B.2 BulletProof: JAGG...............................................................................................83 B.3 Kinetix: Hyperwire ..............................................................................................84 B.4 Aimtech: Jamba....................................................................................................84 B.5 Rogue Wave Software: JFactory .........................................................................84 B.6 Thought Inc.: Nutmeg ..........................................................................................84 B.7 Spider Technologies: NetDynamics......................................................................85 B.8 Symantec: Symantec Café ....................................................................................85 B.9 PowerProduction Software: WebBurst................................................................85 B.10 Microsoft: Visual J++.........................................................................................85 B.11 SUN Microsystems: Java Workshop .................................................................86 B.12 Innovative Software: OEW................................................................................86 B.13 FishNet: Kawa:...................................................................................................86 B.14 PowerSoft: Optima++ ........................................................................................86 B.15 Natural Intelligence: Roaster .............................................................................87 B.16 melonSoft Berlin: ACupOfCoffee.......................................................................87 B.17 Borland: Latte ....................................................................................................87 C UNTERSCHIEDE C++ / JAVA ........................................................ 88 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial Inhalt 6 D WEITERE INFORMATIONEN.......................................................... 90 D.1 Bücher ..................................................................................................................90 D.2 Internet.................................................................................................................92 E GLOSSAR ...................................................................................... 94 F ABBILDUNGEN, TABELLEN ........................................................... 96 F.1 Abbildungen..........................................................................................................96 F.2 Tabellen ................................................................................................................96 G STICHWORTVERZEICHNIS ............................................................ 97 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 1 Einführung 7 1 Einführung Nach dem Domain Name System und dem World Wide Web (WWW) stehen nun im Internet neue Umwälzungen an. Es könnte sich dabei um die Auswirkungen der von SUN Microsystems entwickelten Programmiersprache Java handeln. direkt ausführbare Programme Durch Java hört das WWW wahrscheinlich auf, „nur“ ein Informationssystem zu sein. Es wird zur zentralen Infrastruktur für den Austausch von Informationen, Daten und direkt ausführbaren Programmen. Denn Java hat die einzigartige Fähigkeit, in Binärform auf allen populären Architekturen im Internet ausführbar zu sein. Ein Mausklick genügt, um durchaus komplexe Anwendungen irgendwoher aus dem Netz auf den eigenen Rechner zu laden und auszuführen. Damit hat Java gute Chancen, sich als InternetProgrammiersprache schlechthin zu etablieren. 1.1 Was ist Java? Java vereint viele Vorteile Java ist eine Programmiersprache, bei welcher versucht wurde, die Vorteile der bekannten Programmiersprachen zu übernehmen und gleichzeitig deren Nachteile auszubügeln. Java ist rein objektorientiert und hat keine strukturellen Überbleibsel, wie das z.B. bei C++ der Fall ist. Java sollte alles enthalten, was das Programmieren angenehm macht und dabei mit einer klar überschaubaren und redundanzfreien Syntax auskommen. SUN beschreibt Java in ihrem „The Java Language: A White Paper“ wie folgt: Java: A simple, object-oriented- distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded and dynamic language.1 „Java in a Nutshell“ [Nutshell], David Flanagan, O’Reilly & Associates Inc., 1996, First Edition, Seite 4 1 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 8 1 Einführung 1.1.1 WAS SIND JAVA-APPLETS ? Applets sind in Web-Seiten eingebettet Java-Applets sind kleine, in Java geschriebene Programme, die in Web-Seiten eingebettet werden, um besondere Effekte zu erzielen. Wenn der Benutzer diese Seite aufruft, werden die Applets in seinen Computer geladen und ausgeführt. Die Aktivität findet also nicht auf der Seite des Servers statt, sondern auf der des Anwenders und zwar in einem Java-kompatiblen Web-Browser. Das bedeutet, dass die Applets keinen Einschränkungen durch die Bandbreite des Netzes oder die Zugangsgeschwindigkeit des Modems unterliegen. Der Benutzer sieht und hört Multimedia-Effekte auf den Web-Seiten also besser und schneller. Da Java eine leistungsfähige Programmiersprache ist, arbeiten die Applets im allgemeinen mit der gleichen Geschwindigkeit wie die anderen Applikationen auf einem PC. 1.1.2 WAS IST HOTJAVA ? HotJava war der erste Java-kompatible Browser HotJava ist ein von SUN Microsystems entwickelter WebBrowser, der es dem Benutzer ermöglicht, Javagesteuerte Web-Seiten aufzurufen. Der Zugriff auf die oben beschriebenen Java-spezifischen Effekte ist nur auf einem Java-kompatiblen Web-Browser möglich. Der erste dieser Web-Browser war HotJava, der vom Java-Team bei SUN Microsystems entwickelt wurde. In der Zwischenzeit sind auch Java-kompatible WebBrowser von Netscape (Netscape Navigator ab Version 2.0), Microsoft (Internet Explorer), Oracle (Power Browser), IBM (WebExplorer) u.a. auf dem Markt. 1.1.3 WAS SIND JAVA-GESTEUERTE SEITEN ? Java-gesteuerte Seiten sind Web-Seiten, in welche JavaApplets eingebettet sind, welche die verschiedensten Spezialeffekte hervorrufen. Solche Web-Seiten bieten zur Zeit die spektakulärsten Effekte, und ihre Anzahl steigt nahezu explosionsartig. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 9 1 Einführung 1.2 Die Geschichte der Programmiersprache Java Aus der Geschichte einer Programmiersprache können wir einiges über die betreffende Sprache lernen. In der Entwicklungsphase ist es äusserst wichtig, die Sprache in „echten“ Projekten zu verwenden. Andernfalls wird sie nicht sehr nützlich sein bzw. der Umgang mit ihr ist zu wenig benutzerfreundlich. ursprünglich für Gerätesteuerung Die Programmiersprache Java wurde in der Entwurfsphase in mehreren Projekten eingesetzt. Ursprünglich war sie für die Programmierung von Gerätesteuerungen gedacht, doch sie erwies sich dann als eine für das Programmieren im World Wide Web hervorragend geeignete Sprache. 1.2.1 DIE ANFÄNGE Die Programmiersprache Java wurde von einem kleinen Team unter der Leitung von James Gosling bei SUN Microsystems entwickelt und implementiert. Das ursprüngliche Java-Team wollte Software für Steuerungselektronik entwickeln. Es musste aber bald feststellen, dass die existierenden Programmiersprachen wie C und C++ dafür nicht geeignet waren, da diese für einen bestimmten Computerchip kompiliert werden müssen. Kommt ein neuer Chip auf den Markt, so können seine Leistungsmerkmale nur dann voll genutzt werden, wenn der grösste Teil der Software neu kompiliert wird. Ein anderes Problem, das die Benutzung traditioneller Programmiersprachen für Steuerungssoftware mit sich bringt, besteht darin, dass die Geräte gewöhnlich eine lange Lebensdauer haben. Für Software hingegen ist eine viel kürzere Lebensdauer charakteristisch. Daraus ergeben sich zum Teil erhebliche Probleme bezüglich der Rückwärtskompatibilität. Zudem muss die in der Steuerungselektronik eingesetzte Software sehr zuverlässig sein, viel zuverlässiger als die meiste Computersoftware. James Gosling begann 1990 1990 begann James Gosling mit der Arbeit an einer Programmiersprache, die für die Steuerungselektronik geeigneter sein und gleichzeitig die mit den traditionellen Sprachen wie C und C++ verbundenen Probleme umgehen soll. Das Ergebnis ist Java, eine zuverlässige Sprache, die mit wenigen Befehlen auskommt und für die verschiedensten Computerchips verwendet werden kann. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 1 Einführung 10 1.2.2 DAS GREEN-PROJEKT Das erste Projekt, bei welchem Java eingesetzt wurde, war das Green-Projekt. Dabei ging es um eine neue Form von Benutzeroberfläche für die Steuerung von Geräten im häuslichen Alltag (Videorecorder, Fernseher, Lampen, Telephon etc.). Die am Green-Projekt beteiligten Mitarbeiter bauten einen experimentellen, tragbaren Computer, der den Codename *7 („star seven“) erhielt. Die Benutzeroberfläche bestand aus einer farbigen, animierten Darstellung der häuslichen Umgebung, bei der verschiedene Geräte durch Berühren des Bildschirmes bedient werden konnten. animierte Figur „Duke“ Zur Bedienung des Gerätes verwendete die Benutzeroberfläche des *7 animierte Figuren auf dem Bildschirm. Im Rahmen dieses Projektes entstand auch die Zeichentrickfigur Duke, das heutige Java-Maskottchen. Dem *7-Projekt folgte ein Video-on -Demand-Demoprogramm. Beide Projekte führten zu experimenteller Software und wurden nicht zu echten Produkten weiterentwickelt. Sie wurden ausschliesslich in Java implementiert und brachten die Entwicklung der Programmiersprache Java wesentlich voran. 1.2.3 WEBBROWSER UND HOTJAVA Ab 1993 entwickelte sich das World Wide Web von einem auf Text basierenden zu einem stärker graphisch ausgerichtetem Interface, das auf immer grösseres Interesse stiess. aus WebRunner wird HotJava Dem Java-Entwicklungsteam wurde rasch klar, dass eine plattformneutrale Sprache wie Java sich für die Programmierung von Web-Anwendungen hervorragend eignet, da Java-Programme auf allen verschiedenen Computertypen laufen, die ans Internet angeschlossen sind. Das Ergebnis dieser Erkenntnis war ein WebRunner genannter Web-Browser, der vollständig in Java geschrieben war. Aus urheberrechtlichen Gründen wurde dieser Browser später in HotJava umgetauft. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 1 Einführung 11 Java gerät ins Rampenlicht HotJava war der erste Web-Browser, der Java-Applets unterstützte und gleichzeitig ein wichtiger Schritt bei der Entwicklung der Programmiersprache Java. Er brachte sie aber nicht nur voran, sondern auch ins Rampenlicht des öffentlichen Interesses. Andere Programmierer sahen, was das Java-Team mit HotJava alles bewerkstelligte und wollten diese Technologie auch in ihrer Software benutzen. Boom mit Netscape 2.0 Im Mai 1995 stellte SUN Microsystems die Java-Technologie in San Francisco offiziell vor. Die Tatsache, dass der populäre Web-Browser Netscape Navigator 2.0, der Ende 1995 auf den Markt kam, Java-Applets unterstützte, heizte das ohnehin schon grosse Interesse an Java noch zusätzlich an. 1.2.4 WAS BEDEUTET JAVA ? Ursprünglich hatte James Gosling der Programmiersprache Java den Namen „Oak“ gegeben, wozu ihn eine grosse Eiche (engl. oak) vor seinem Bürofenster bei SUN Microsystems inspirierte. Später stellte sich jedoch heraus, dass eine früher entwickelte Programmiersprache bereits diesen Namen trug. einfach Kaffee Nach vielen Stunden harter Denkarbeit entschloss sich das Team eines Tages an einem Tisch im Stammcafé für den Namen „Java“. Java hat ausser „Kaffee“ keine Bedeutung; es ist also kein Akronym, obwohl sich die Auffassung verbreitete, Java stehe für „Just Another Vague Acronym“ („Noch so eine nichtssagende Abkürzung“). © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 12 1 Einführung 1.3 Die wichtigsten Eigenschaften höhere Programmiersprache Java ist - wie C, C++, Pascal und Modula 3 - eine sogenannte höhere Programmiersprache. Java ist unkompliziert, objektorientiert, architekturneutral, multithreaded, robust, schnell, sicher und erweiterungsfähig. Java-Programme sind schon kompiliert und Java besitzt seine eigene „Müllabfuhr“ (Garbage Collector) sowie statische Objekttypen; Java kommt mit relativ wenigen Befehlen aus, und seine Technologie ist schon gut erforscht. 1.3.1 JAVA IST EINFACH UND UNKOMPLIZIERT nur unverzichtbares übernommen Java ist C++ sehr ähnlich, aber um einiges einfacher. Alle Merkmale, die nicht wirklich unverzichtbar sind, wurden weggelassen. So gibt es bei Java zum Beispiel weder das Überladen von Operatoren noch Header-Dateien, weder Präprozessor noch Zeigerarithmetik, Strukturen, Unions oder eine implizite Typenumwandlung. Java lässt sich viel einfacher erlernen als C++, da es unkomplizierter im Aufbau ist. Wer schon Kenntnisse in C, C++ oder Pascal besitzt, wird sich relativ schnell in Java einarbeiten können. 1.3.2 JAVA IST OBJEKTORIENTIERT Java ist vollständig objektorientiert; abgesehen von den einfachen Datentypen wie Zahlen und logischen Ausdrücken, sind die meisten Dinge in Java Objekte. Der Java-Code ist nach Klassen organisiert; jede Klasse definiert eine Anzahl von Methoden, die das Verhalten eines Objektes bestimmen. Zudem kann eine Klasse Eigenschaften von einer anderen Klasse erben. Klassenhierarchie mit Einzelvererbung Java unterstützt eine Klassenhierarchie mit Einzelvererbung, deren Wurzel die Klasse „Objekt“ bildet. Das bedeutet, dass die Klassen jeweils nur von einer einzigen anderen Klasse erben können. Andere Sprachen erlauben zum Teil auch mehrfache Vererbung; dies kann jedoch zu Verwirrungen führen und die Sprache unnötig kompliziert werden lassen. Wie bereits erwähnt, ist auch in Java nicht alles Objekte. Um die Programmiersprache so einfach wie möglich zu machen, sind einfache Typen wie Zahlen und logische Ausdrücke nicht als Objekte implementiert, Java stellt jedoch gekapselte Objekte zur Verfügung, sodass auch diese einfachen Typen als Klassen implementiert werden können. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 1 Einführung 13 Zudem unterstützt Java auch Schnittstellen, die eigentlich abstrakte Klassen darstellen. Dies ermöglicht es dem Programmierer, Methoden für Schnittstellen zu definieren, ohne sich gleich Gedanken machen zu müssen, wie diese Methoden schliesslich implementiert werden. mehrere Schnittstellen als Ersatz für Mehrfachvererbung Eine Klasse kann mehrere Schnittstellen implementieren, so dass viele Vorteile der Mehrfachvererbung erhalten bleiben, während ein Grossteil der damit verbundenen Probleme wegfällt. Zusätzlich kann ein Objekt beliebig viele Schnittstellen implementieren. In Java-Programmen muss der Typ der benutzten Daten definiert werden wie es bei vielen traditionellen Programmiersprachen ebenfalls üblich ist. Damit werden mögliche Fehler aufgrund falscher Datentypen bereits zur Kompilationszeit erkannt. Andererseits haben aber alle Objekte in einem Java-System auch einen dynamischen Typen. Es ist jederzeit möglich, auf den dynamische Typen eines Objektes zuzugreifen. Der Programmierer hat also die Möglichkeit, Programme zu schreiben, die für Objekte unterschiedlichen Typs verschieden reagieren können. Da das Überprüfen der Typen grösstenteils bei der Kompilierung erfolgt, muss der Interpreter weniger Arbeit leisten bei der Ausführung eines Programmes. Zur Laufzeit des Programmes sind nur noch wenige Überprüfungen erforderlich wie zum Beispiel die Prüfung von Array-Grenzen. 1.3.3 JAVA IST ROBUST Die mehr oder weniger häufig auftretenden Computerabstürze infolge von Programmfehlern sollen mit Java verunmöglicht werden. Das Java-System überprüft jeden Zugriff auf den Speicher daraufhin, ob er legal ist und keine Probleme verursacht. Zugriffsschutz verbessert In den traditionellen Programmiersprachen hat ein Programm Zugang auf den gesamten Speicherbereich des Computers. Solche Programme können „unbeabsichtigt“ jeden Wert im Speicher ändern, was häufig zu Problemen und Abstürzen führt. Java-Programme hingegen haben nur zu genau definierten Stellen im Speicher Zugang und können somit keine Werte ändern, die sie nicht ändern dürfen. Natürlich können auch bei Java-Programmen Fehler auftreten. Bei unerwarteten Ereignissen stürzt ein Programm aber nicht einfach ab, sondern es arbeitet eine Ausnahmeroutine ab und befasst sich mit diesen Ereignissen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 14 1 Einführung 1.3.4 JAVA IST SICHER Java-Programme verfügen über keine Pointer (Zeiger), was eine vollständigere Verifizierung des Java-Codes vor der Ausführung ermöglicht. Die so verifizierten Java-Programme bieten damit Gewähr, dass die Regeln der Sprache eingehalten werden und die Programme sicher ausgeführt werden können. Die Verifizierung des Bytecodes wird auch von den Web-Browsern benutzt, um sicherzustellen, dass die Applets keine Viren enthalten. keine unerlaubten Zugriffe auf Systemdaten Java wurde für den Einsatz im Internet entwickelt, wo der Anwender seinen Rechner nicht blindlings einem unbekannten Programmierer anvertrauen möchte. Java erlaubt daher keine unkontrollierten Zugriffe auf Systemdateien oder auf Speicherbereiche. Auch die Kommunikation mit fremden Hosts kann beschränkt und überwacht werden. Es sollte daher recht schwierig sein, ein „Trojanisches Pferd“ in Java zu schreiben. 1.3.5 JAVA IST PARALLELISIERBAR, MULTITHREADED Ein modernes Betriebssystem muss heute in der Lage sein, mehrere Aufgaben quasi gleichzeitig durchführen zu können. Java hat diese Multitasking-Fähigkeit in die Sprache integriert. mehrere Threads gleichzeitig Java-Programme haben die Möglichkeit, mehrere Threads ausführen zu können. Ein Java-Programm ist also in der Lage, eine aufwendige Berechnung durchzuführen während ein anderer Thread gleichzeitig in Interaktion mit dem Benutzer tritt. Die Benutzerinteraktion muss also nicht das Ende der Berechnung abwarten. Das Programmieren in einer Multithreading-Umgebung erfordert jedoch erhöhte Aufmerksamkeit, da die Threads in einer unvorhergesehenen Reihenfolge ausgeführte werden können. Um unerwünschte Effekte beim Zugriff auf bestimmte Datenbereiche zu verhindern, bietet Java die dazu nötigen Synchronisationsmechanismen an. 1.3.6 JAVA-PROGRAMME SIND SCHON KOMPILIERT Java-Code wird zu Bytecode Um ein lauffähiges Java-Programm zu erhalten muss zuerst der Java-Code in sogenannten Bytecode kompiliert werden. Dieser Bytecode ähnelt Maschinenbefehlen, welcher jedoch nicht für eine bestimmte Maschine spezifisch ist. Somit können Java-Programme auf den verschiedensten Computern laufen, ohne erneut kompiliert werden zu müssen. Der Java-Sourcecode wird zu Dateien vom Typ „class“ kompiliert, welche das Programm in Bytecode enthalten. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 1 Einführung 15 Die class-Dateien enthalten nun Verweise auf Methoden und Instanzvariablen über einen Namen und werden umgesetzt, sobald der Code erstmals ausgeführt wird. Dies macht den Code allgemeingültiger und weniger anfällig für Änderungen ohne Einbussen an dessen Leistungsfähigkeit. 1.3.7 JAVA IST PLATTFORMUNABHÄNGIG Da Java-Programme bereits in Bytecodes kompiliert sind, können sie auf jeder Plattform laufen, die Java unterstützt; d.h. überall wo der Java-Interpreter läuft, kann der Bytecode ausgeführt werden. Um ein Java-Programm auf einem anderen Computer laufen zu lassen, braucht er also nicht erneut kompiliert zu werden. auf jeder Plattform identisch Die Programmiersprache Java ist auf jeder Plattform identisch. So variieren z.B. die einfachen Datentypen nicht: Integer-Zahlen umfassen stets 32 Bits, Long Integers 64 Bits. Bei den Programmiersprachen C und C++ ist dies nicht der Fall, womit die Übertragung von Programmen auf ein anderes System ziemlich aufwendig sein kann. Das Übertragen von Java-Programmen hingegen ist einfach, und es ist nicht notwendig, diese erneut zu kompilieren. Ausserdem bietet Java eine umfangreiche Bibliothek von Klassen an, die Zugang zu dem zugrundeliegenden Betriebssystem gewährt. Werden diese Bibliotheken benutzt, so funktionieren Java-Programme auf jeder Plattform, die Java unterstützt. 1.3.8 JAVA IST ERWEITERUNGSFÄHIG Java-Programme können mit existierenden, in anderen Sprachen geschriebenen Softwarebibliotheken verbunden werden. Da die Datenstrukturen von Java denen von C sehr ähnlich sind, ist dies relativ einfach. Das grösste Problem liegt darin, dass die meisten existierenden Bibliotheken nicht multithreaded sind. Erweiterung mit nativen Methoden Java-Programme bieten die Möglichkeit, bestimmte Methoden als „native“ zu deklarieren. Diese nativen Methoden werden dann mit Funktionen verknüpft, die mit der virtuellen Umgebung dynamisch verbundenen Softwarebibliotheken definiert sind. Obwohl im Prinzip jede Bibliothek mit nativer Software verbunden sein kann, ist dies nicht immer erlaubt. Aus Sicherheitsgründen wird diese Möglichkeit für Software, die über das Netzwerk geladen werden (wie z.B. Applets), gewöhnlich ausgeschaltet. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 1 Einführung 16 1.3.9 JAVA IST GUT ERFORSCHT Kombination von bestehenden Technologien Die meisten Eigenschaften von Java sind nicht grundsätzlich neu. Sie wurden von anderen Sprachen wie Lisp, Smalltalk, Pascal, Cedar, Objective-C, Self oder Beta übernommen. Damit ist Java eigentlich nichts anderes als eine gute Kombination von bereits existierenden Technologien. Dies bedeutet aber auch, dass die in Java integrierte Technologie relativ gut erforscht ist, obwohl die Sprache neu ist. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 17 2 Java und das Internet 2 Java und das Internet Das Internet ist ein riesiges, weltweites Netzwerk, das Tausende von Computer unterschiedlichster Art miteinander verbindet. Für die Kommunikation in diesem heterogenen Netz ist ein standardisiertes Protokoll wie z.B. TCP/IP nötig. Das heterogene Internet Bytecode wird heruntergeladen Da Java-Programme als Bytecodes übermittelt werden, können sie vom Internet auf jeden Computer heruntergeladen und ausgeführt werden, ohne dass der Benutzer sich Gedanken darüber machen müsste, auf welchem System das Programm entwickelt wurde. Bei traditionellen Programmen wäre dies undenkbar. Bei Sprachen wie C und C++ kann ein Programm nur auf verschiedenen Plattformen laufen, wenn der Source-Code vorhanden ist und neu kompiliert worden ist. Jeder Benutzer müsste also zunächst das Programm kompilieren, bevor er es laufen lassen kann. 2.1 Die Java-Applets Die zur Zeit häufigste Art von Java-Programmen bilden die Java-Applets. Diese meist kleinen Java-Programme sind in Web-Seiten eingebettet, um dort spezielle Effekte zu er- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 2 Java und das Internet 18 zeugen oder ganz einfach das Interesse des Benutzers zu wecken. Die Java-Applets werden auf den Computer heruntergeladen und automatisch ausgeführt, wenn der benutzte Web-Browser Java unterstützt. 2.2 Sicherheitsaspekte Prüfung auf Schutzverletzungen Da die Java-Programme in Bytecode-Anweisungen kompiliert werden und in dieser Form verifiziert werden können, sind die Java-Applets recht sicher. Die Anweisungen in Bytecode sind nicht für einen bestimmten Computertyp spezifisch und können daher auf eventuelle Schutzverletzungen geprüft werden. Dies ist möglich, da die Bytecodes zusätzliche Informationen über Typen enthalten, die zur Überprüfung der Zulässigkeit des Programms dienen. Die meisten Programme für PCs rufen Funktionen über eine Adresse auf. Da die Adresse lediglich aus einer Zahl besteht und diese Zahl so konstruiert werden kann, wie es dem Programmierer gefällt, kann das Programm für die Ausführung einer Funktion jede beliebige Zahl verwenden. Dadurch kann man nicht vorhersehen, welche Funktionen benutzt werden, wenn das Programm aufgerufen wird. Zugriff erfolgt über Namen Java arbeitet auf eine völlig andere Art; der Zugriff auf Methoden und Variablen erfolgt stets über den Namen. So kann man einfach feststellen, welche Methoden und Funktionen tatsächlich benutzt werden. Dieser Prozess wird als Verifizierung bezeichnet. Er ist notwendig, um sicherzustellen, dass nicht unbefugt an den Bytecodes her- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 2 Java und das Internet 19 umgebastelt wurde und dass sie die Regeln von Java befolgen. 2.2.1 DIE VERIFIZIERUNG Nach der Verifizierung werden die Applets in einer beschränkten Umgebung ausgeführt, in welcher sie bestimmte gefährliche Funktionen nur ausführen können, wenn es ihnen ausdrücklich gestattet ist. Aufgrund des Verifizierungsprozesses können sie aus dieser beschränkten Umgebung nicht ausbrechen. Computer mit Quellprogramm Java-Programm Byte-Codes Kompilierung Internet lokaler Computer Verifizierung Byte-Codes Ausfuehrung Der Verifizierungsprozess Wenn die Bytecodes verifiziert worden sind, kann der Interpreter die Funktionsnamen wie traditionelle Programme in Adressen umwandeln; dadurch sind JavaProgramme gleichzeitig leistungsfähig und sicher. 2.2.2 ZUGRIFFSMÖGLICHKEITEN Die Gestaltung der Zugriffsmöglichkeiten für externe Applets lassen sich in den Java-fähigen Web-Browsern einstellen. Dabei kann es folgende Möglichkeiten geben (dies variiert zwischen den Browsern): None: Die Applets haben keinen Zugriff auf das Netzwerk. Dies ist der beste Schutz, jedoch sind in diesem Modus nicht alle Applets lauffähig. Applet Host: Hier haben die Applets nur Zugriff auf den Host, von dem sie stammen. Diese Applets können daher nicht auf die Informationen auf ihren Computern zugreifen. Dies ist auch die Standardeinstellung in der die meisten Applets ablauffähig sind. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 2 Java und das Internet Firewall: 20 Applets außerhalb der Firewall können nur auf Hosts, die ebenfalls außerhalb der Firewall sind, zugreifen. Dieser Modus ist natürlich nur möglich, wenn auch eine Firewall eingerichtet wurde. Unrestricted: Hier können Applets zu allen Hosts im Internet Verbindungen herstellen. Dieser Modus sollte allerdings nur benutzt werden, wenn keine Sicherheitsbedenken bezüglich des Applets vorhanden sind. 2.3 Die virtuelle Maschine Virtuelle Maschine interpretiert Bytecode Die Virtuelle Maschine interpretiert den Java Bytecode. Erst sie löst externe Referenzen auf, indem sie den ClassLoader, der die benötigte Klasse bei Bedarf sucht und in den Hauptspeicher lädt, aufruft und die Klartextnamen durch Adressreferenzen ersetzt. Auf einem Computer bzw. Betriebssystem auf dem diese Virtuelle Maschine realisiert ist können alle Java Programme laufen. Dabei ist keine Neucompilierung des Quelltextes nötig. Vor der Instanziierung einer Klasse werden dabei Laufzeitprüfungen und eine Verifikation vorgenommen, welche die Sicherheit des Programms gewährleisten sollen. 2.4 Applets und Anwendungen Java-Programme können in Zwei Hauptgruppen aufgeteilt werden: Applets und Anwendungen 2.4.1 APPLETS Applets sind Java-Programme, die über das World Wide Web heruntergeladen werden und von einem WebBrowser auf der Maschine des Benutzers ausgeführt werden. Applets können nur von einem Java-fähigen Browser ausgeführt werden bzw. mit dem Applet Viewer aus dem Java Development Kit (JDK). 2.4.2 ANWENDUNGEN Java-Anwendungen sind allgemeinere, in der Sprache Java geschriebene Programme. Zum Ausführen von Java-Anwendungen ist kein Browser nötig. Eine Java-Anwendung enthält eine Klasse, welche eine main()-Methode definiert. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 2 Java und das Internet 21 2.5 JavaScript JavaScript ist ein Gemeinschaftswerk von SUN und Netscape und ist noch kein Standard, sondern befindet sich noch im Entwicklungsstadium. Zwar kann der NetscapeBrowser ab Version 2.0 JavaScript-Programme abarbeiten, der Umfang der Script-Sprache wird jedoch noch ständig erweitert. Der Name JavaScript legt eine Verwandtschaft zwischen der Script-Sprache und der objektorientierten Programmiersprache Java nahe. Trotz einigen Gemeinsamkeiten unterscheiden sich beide in wesentlichen Punkten voneinander: Interpretation erfolgt zur Laufzeit - JavaScript wird durch den Web-Browser auf dem ClientRechner interpretiert. Der Programm-Quelltext wird also nicht kompiliert. - JavaScript ist objektbasiert, erlaubt jedoch keine Klassendefinitionen oder Vererbung. Die Objekte werden durch den Browser verwaltet. - „dynamic binding“: Objektreferenzen werden bei JavaScript erst zur Laufzeit aufgelöst. Wird eine Funktion verwendet, die nicht definiert wurde, meldet der Browser erst dann einen Fehler, wenn diese tatsächlich aufgerufen wird. - Variablen müssen bei JavaScript nicht explizit deklariert werden. - JavaScript ist langsamer als Java, da das Programm erst zur Laufzeit interpretiert wird. - der Quelltext eines JavaScript-Programms ist vollständig in der HTML-Seite enthalten. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 22 3 Die Sprache Java 3 Die Sprache Java ähnlich wie CSyntax Wer bereits über Erfahrung mit der Programmiersprache C verfügt, sollte keine Probleme haben, sich mit Java zurechtzufinden. Java benutzt, wo immer es möglich ist, die C-Syntax, da diese vielen Programmierern vertraut ist. Erfahrungen in objektorientierten Programmiersprachen sind zwar von Vorteil, aber nicht Bedingung, um sich mit Java zurechtzufinden. Das Klassenkonzept von Java ähnelt zwar jenem von C++, ist aber wesentlich einfacher und konsequenter umgesetzt worden. 3.1 Unterschiede zu C/C++ Die Entwickler von Java haben sich Mühe gegeben, die Sprache auf die wichtigsten Befehle und Möglichkeiten zu beschränken. Dies hat zur Folge, dass einige Möglichkeiten von C bzw. C++ weggelassen wurden, was aber durchaus zu einem Vorteil werden kann. (siehe auch Anhang C Unterschiede C++ / Java) 3.1.1 KEINE HEADER FILES UND PRECOMPILER Header-Files unnötig In Java werden die Klassen komplett in einem File codiert; Header Files wie in C werden nicht mehr benötigt. Zu jeder Klasse wird ein eigenes .class-File erzeugt. Dadurch kann es z.B. nicht mehr vorkommen, dass durch Änderungen in einer zentralen Klasse in einem Header File das gesamte Projekt neu übersetzt werden muss. Der Einsatz von Java macht Hilfsmittel wie „make“ und trickreiche Compilerfeatures unnötig, die versuchen dieses Problem zu minimieren. Ebenso werden Precompiler (z.B. # DEFINE) bei Java nicht eingesetzt. Der durchgängig objektorientierte Ansatz soll einen Precompiler unnötig machen. Globale Definitionen von Konstanten können als Klassenvariablen (static) realisiert werden. Dadurch bekommen die Konstanten auch einen eigenen Namensraum, was widersprüchliche Bezeichnernamen ausschliesst. Somit werden auch diverse Tricks und Fehlerquellen ausgeschlossen. 3.1.2 KEINE STRUKTUREN UND UNIONS Die Aufzählungstypen (z.B. enum), Strukturen und Unions können in Java (wie in jeder objektorientierten Program- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 23 3 Die Sprache Java miersprache) durch geeignete Klassen dargestellt werden In C++ ist dieser „Ballast“ nur vorhanden, um die gewünschte Kompatibilität zu C zu gewährleisten. 3.1.3 KEINE FUNKTIONEN alleinstehende Funktionen unnötig Alleinstehende Funktionen, die nicht Methoden einer Klasse sind, werden in Java nicht unterstützt. Dies vermeidet Mehrdeutigkeiten und Widersprüche in der Klassenhierarchie. Java unterstützt Klassenmethoden und Klassenvariablen, wodurch alleinstehende Funktionen unnötig werden. 3.1.4 KEINE MEHRFACHVERERBUNG Die gewaltigen Probleme, die durch den Einsatz von Mehrfachvererbung auftreten können, sind in Java dadurch umgangen worden, dass Java diese Möglichkeit gar nicht zur Verfügung stellt. mehrfache Interfaces Durch den Einsatz von Interfaces, die einen Satz von Schnittstellenmethoden definieren, die in einer Klasse implementiert werden, wird eine weitgehend vergleichbare Funktionalität ohne die bekannten Probleme erreicht. Diese Interfaces wurden den „protocols“ in Objective C nachempfunden. 3.1.5 KEINE GOTO-BEFEHLE „Goto“ gehört zwar auch bei Java zu den reservierten Wörtern, wird aber als Befehl nicht mehr unterstützt. Der goto-Befehl wird sehr häufig missbraucht nur aus der Tatsache, dass der Befehl unterstützt wird. Die meisten goto-Befehle lassen sich ohne Probleme durch mehrstufige break- und continue-Befehle ersetzen. 3.1.6 KEIN ÜBERLADEN VON OPERATOREN kein Operator Overloading Java unterstützt kein Operator Overloading. Zum einen war diese Möglichkeit schon immer umstritten, und zum anderen hat SUN bei der Entwicklung der Sprache der Einfachheit und Klarheit den Vorrang gegeben. Die Möglichkeit des Operator Overloading kann übrigens durch Klassenmethoden einfach ersetzt werden. 3.1.7 KEINE AUTOMATISCHE TYPENUMWANDLUNG Bei Java findet keine automatische Typenumwandlung von einem Datentypen in den anderen statt. Jede zulässige Typenumwandlung muss implizit programmiert werden. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 24 3 Die Sprache Java 3.1.8 KEINE POINTER UND POINTERARITHMETIK keine Pointer Java hat zum Ziel, eine möglichst sichere Laufzeitumgebung zur Verfügung zu stellen. Aufgrund der Möglichkeit, komplexe Strukturen mit Hilfe von Klassenhierarchien darzustellen, ist Java nicht auf Pointerarithmetik angewiesen. In Java gibt es generell keine expliziten Pointer, womit ein weiterer Grossteil der Fehlermöglichkeiten herkömmlicher C- und C++-Programme ausgeschlossen werden. 3.1.9 KEINE VAGE DEFINIERTEN DATENTYPEN vollständig definierte Datentypen In Java sind die primitiven Datentypen, anders als in C vollständig definiert. So ist ein int immer 32 Bit breit und mit Vorzeichen behaftet. Es gibt anders als in C feste Definitionen für die Basis-Datentypen, die übrigens die einzigen Typen sind, die keine Klasse darstellen. Durch Vererbung können ihnen jedoch weitere Methoden zugeordnet werden. Die direkte Implementierung von Basis-Datentypen in die Programmiersprache verbessern das Laufzeitverhalten gegenüber typenlosen Programmiersprachen wie zum Beispiel Smalltalk, enorm. 3.1.10 KEINE FREIE ARGUMENTENANZAHL (VARGS) Java unterstützt keine Funktionen mit variabler Argumentenanzahl wie es z.B. in C bei der Funktion printf verwendet wird. Auch hier stellt der objektorientierte Ansatz geeignetere und weniger fehlerträchtige Möglichkeiten zur Verfügung (wie es schon in C++ mit cout realisiert wird). 3.1.11 KEINE SEMIKOLON ? Beim Design von Java wurde darauf geachtet, daß der Programmierer nicht mit irgendwelchen “; erwartet” Fehlermeldungen zu kämpfen hat. Wo es die Grammatik erlaubt, ist der “;” optional oder kann beliebig oft gesetzt werden. bessere Lokalisierung von Fehlern Bei der Entwicklung der Sprache wurde auch darauf geachtet, dass der Compiler die Möglichkeit hat, Fehler genau zu lokalisieren. Die in C übliche Fehlermeldung mit Verweis auf eine Zeile die auf die eigentlich fehlerhafte Zeile mit fehlendem Semikolon folgt, sollte in Java nicht vorkommen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 25 3 Die Sprache Java 3.2 Überblick über die Syntax Die Syntax von Java ist derjenigen von C sehr ähnlich. Wer bereits mit C oder C++ vertraut ist, kann einfach auf diesen Kenntnissen aufbauen. 3.2.1 KOMMENTARE neuer Dok-Kommentar Java kombiniert die kommentierte Syntax von C und C++. Seine Syntax erlaubt es ausserdem, automatisch formatierte Dokumentationen zu erstellen: /* wie in C: Kommentare bis zu einem definierten Ende */ // Kommentar wie in C++: bis zum Zeilenende /** „doc“-Kommentar: kann zum Erzeugen von Dokumentationen benutzt werden, darf aber nur vor einer Deklaration gesetzt werden */ 3.2.2 EINFACHE DATENTYPEN Ausser den hier vorgestellten Grundtypen, besteht Java praktisch nur aus Objekten. Aber auch die Grundtypen können, falls dies gewünscht wird, als Klassenobjekte implementiert werden. Von wenigen Ausnahmen abgesehen hat Java die Grundtypen von C und C++ übernommen. Es gibt in Java drei Gruppen von einfachen Datentypen: 3.2.2.1 Numerische Datentypen numerische Typen mit Vorzeichen Ganzzahlige Typen: byte short int long 8 Bit 16 Bit 32 Bit 64 Bit Fliesskommazahlen: float double 32 Bit 64 Bit Alle numerischen Datentypen sind in Java vorzeichenbehaftet. 3.2.2.2 Charakter Datentyp 16 Bit-Unicode Der Charakter-Datentyp char definiert einen 16 Bit-Unicode Charakter. In Java ist dieser nicht mit einem Vorzeichen behaftet. 3.2.2.3 Logischer Datentyp (Boolean) echter Boolean In Java besteht ein boolean aus einem „echten“ 1 Bit Wert. Dieser Datentyp kann im Gegensatz zu anderen Programmiersprachen nicht in einen numerischen Datentypen konvertiert werden. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 26 3.2.3 REFERENZIERENDE DATENTYPEN Zuweisung by reference Die referenzierenden Datentypen haben ihren Namen erhalten weil sie auf Objekte oder Arrays „by reference“ verweisen, d.h. die Adressen des Objekts bzw. Arrays in einer Variablen speichern. Im Gegensatz dazu speichern die einfachen Datentypen die aktuellen Werte in einer Variable; diese Zuweisung wird als Referenz „by value“ bezeichnet. Die Zuweisung der einfachen Datentypen erfolgt immer „by value“; bei Arrays und Objekten hingegen erfolgt die Zuweisung immer „by reference“. 3.2.3.1 Zuweisung von Objekten Da referenzierende Typen nicht „by value“ übergeben werden, kopiert die Übertragung von einem Objekt zu einem anderen nicht den Wert des Objekts; es weist diesem lediglich eine Referenzierung zu. Kopieren mit clone() Um die Daten eines Objektes in ein anderes Objekt zu kopieren, benutzt man in Java die clone() Methode: Vektor b = new Vektor; c = b.clone(); Diese Methode wird allerdings nicht von allen Typen unterstützt. Nur Klassen, welche das Cloneable Interface implementieren, können diese Methode benutzen. Arrays sind ebenfalls referenzierende Typen und die Zuweisung eines Arrays kopiert einfach die Referenz auf das Array. Um eine aktuelle Kopie der gespeicherten Werte des Arrays zu erhalten, muss man jeden einzelnen Wert zuweisen oder die System.arraycopy() Methode benutzen. 3.2.3.2 Kontrolle von Objekten identische Objekte ? Mit dem == Operator lässt sich prüfen, ob zwei Variablen dasselbe Objekt referenzieren und nicht, ob die zwei Objekte dieselben Daten enthalten. Um wirklich zu testen, ob zwei separate Objekte identisch sind, gibt es in Java eine spezielle Methode. Einige der Klassen bieten diese Methode equals() an, um diesen Test durchzuführen. 3.2.3.3 Referenzierung und Dereferenzierung automatische Referenzierung Die Referenzierung und Dereferenzierung von Objekten geschieht in Java sozusagen automatisch, denn Java verfügt über keine Pointer und erlaubt keine Manipulation von Speicheradressen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 27 3.2.3.4 null-Werte Der Default-Wert für Variablen aller referenzierenden Typen ist null. Null ist ein reservierter Wert, der die „Absenz einer Referenz“ anzeigt; d.h. dass die Variable kein Objekt oder Array referenziert. null ist ein Schlüsselwort In Java ist null ein reserviertes Schlüsselwort, nicht wie NULL in C, welches bloss eine Konstante mit dem numerischen Wert 0 ist. Null ist eine Ausnahme in den strengen Sprachregeln in Java; es kann irgendeinem referenzierenden Typen zugewiesen werden (z.B. irgendeine Variable, welche über eine Klasse, ein Interface oder Array dieses Typs verfügt). „Null“ kann in Java in keinen einfachen Datentypen umgewandelt werden einschliesslich der Typen int und boolean. 3.2.4 OBJEKTE Nachdem wir gesehen haben, dass Objekte in Java „by reference“ übergeben werden, fehlt nur noch das Wissen, wie man diese Objekte kreiert, auf sie zugreift und wieder beseitigt. 3.2.4.1 Definition von Objekten Definition mit new Die Deklaration einer Variablen, um ein Objekt zu erhalten, kreiert dieses Objekt nicht; die Variable enthält nur die Referenz auf das Objekt. Um wirklich ein Objekt zu definieren, benutzt man das Schlüsselwort new; dieses Schlüsselwort wird gefolgt von einem Klassenobjekt und einer optionalen Argumentenliste in Klammern. Diese Argumente passieren die Konstruktor-Methode für diese Klasse, welche die Initialisierung der internen Datenfelder in die neuen Objekte übernimmt: java.awt.Button b = new java.awt.Button(); ComplexNumber c = new ComplexNumber(1.0,1.414); Es gibt aber auch andere Wege, ein Objekt zu kreieren. Ein String-Objekt z.B. kann einfach kreiert werden, indem eine Zeichenkette (in doppelten Hochkommas) einer Variable zugeordnet wird: String s = „Dies ist ein String“; Ein anderer Weg ist die newInstance() Methode eines Klassenobjektes. Diese Methode ist speziell geeignet, wenn dynamisch geladene Klassen benutzt werden. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 28 3 Die Sprache Java 3.2.4.2 Zugriff auf Objekte Zugriff mit PunktOperator Die Syntax für den Zugriff auf Objekte in Java gleicht derjenigen in C für Strukturen; es wird der Punkt-Operator verwendet: ComplexNumber c = new ComplexCumber(); c.x = 1.0; c.y = 1.414; Da Java auf Objekte immer „by reference“ zugreift und die Dereferenzierung automatisch vorgenommen wird, gleicht der Punkt-Zugriff von Java eher dem -> Operator in C. 3.2.4.3 „löschen“ von Objekten In Java werden die Objekte mit dem Schlüsselwort new kreiert, aber es existiert kein Schlüsselwort wie delete, old oder free. löschen unnötig Ein solches Schlüsselwort ist auch nicht nötig, da Java über eine Technik verfügt, die automatisch erkennt, ob ein Objekt noch referenziert und weiter benötigt wird. Diese Technik nennt sich Garbage Collection (Müllabfuhr). 3.2.5 MÜLLABFUHR, „GARBAGE COLLECTOR“ Als erste Besonderheit, insbesondere für nicht Smalltalk Programmierer ist das Konzept der Speicherverwaltung in Java zu nennen. In Java gibt es keinen Heap auf dem dynamische Daten alloziert werden, also auch kein malloc oder mfree. Vielmehr sorgt die Java-Laufzeitumgebung selbst dafür, dass nicht mehr benötigte Objekte automatisch freigegeben werden. Dazu trägt jedes Objekt einen Zähler mit sich, wie viele Verweise auf das Objekt noch existieren. Aufräumen im Hintergrund Die Arbeit, selbst dafür zu sorgen, dass Objekte rechtzeitig freigegeben werden, die z.B. in C++ bei komplexeren Programmen extreme Ausmaße annimmt, entfällt also völlig. Man spricht von einem Garbage Collector. In Java läuft dieser Garbage Collector in einem eigenen Task mit niederer Priorität, das Aufräumen wird also im Hintergrund erledigt. keine Speicherleichen mehr Speicherleichen, also Objekte die nicht mehr benötigt werden, deren Speicher jedoch nicht freigegeben wurde, gehören automatisch der Vergangenheit an. Es kann auch nicht mehr vorkommen, dass eine Referenz auf ein nicht mehr alloziertes Objekt existiert, was bei C und C++ zu häufigen Fehlern geführt hat (z.B. eine durch eine lokale Funktion deklarierte Variable wird per Pointer dem Aufrufer bekanntgegeben). © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 29 3 Die Sprache Java Dieses Konzept tritt nicht nur auf Objekte sondern auch für Klassen in Kraft, da Klassen in Java nichts anderes sind als von der Klasse Objekt abgeleitete Objekte. Das heißt insbesondere, dass zur Laufzeit eines Programms nur die Klassen im Hauptspeicher gehalten werden, die auch wirklich gebraucht werden. Das hat zur Folge, dass beim Programmstart zunächst nur die Basisklassen geladen werden, was allerdings auf Grund des dynamischen Linkvorgangs, der gleichzeitig einsetzt, merklich Zeit in Anspruch nimmt. 3.2.6 ARRAYS Unterstützung und Syntax für Arrays in Java sind denen in C sehr ähnlich. In Java dürfen Arrays jedoch nicht dem Stack (Stapelspeicher) zugewiesen werden; sie müssen also dynamisch zugewiesen werden. 3.2.6.1 Erzeugen und löschen von Arrays Es existieren zwei Arten der Definition von Arrays: Zum einen kann dies mit dem Schlüsselwort new erfolgen: byte ZeichenBuffer[] = new byte[1024]; Button buttons[] = new Button[10]; Initialisierung mit Default-Werten Die Elemente, der auf diese Art kreierten Arrays werden mit den Default-Werten ihres Typs initialisiert. Elemente des Typs int sind auf den Wert 0 initialisiert und Elemente des Typs object sind auf null initialisiert. Zum anderen kann ein Array ebenso kreiert werden, wie wir es von C auch kennen, durch direkte Initialisierung: int Tabelle[] = {1,2,4,8,16,32,64,128}; Diese Syntax erzeugt dynamisch einen Array und initialisiert diesen mit den spezifizierten Werten. Die spezifizierten Werte können im Gegensatz zu C willkürliche Ausdrücke sein und müssen nicht aus konstanten Ausdrücken bestehen. Arrays brauchen wie die Objekte auch nicht gelöscht zu werden; sie werden automatisch vom Garbage Collector behandelt. 3.2.6.2 Mehrdimensionale Arrays Array von Arrays Wie man es von C kennt, hat auch Java die Möglichkeit von mehrdimensionalen Arrays als Array von Arrays implementiert. Um ein mehrdimensionales Array zu definieren, genügt es , die normale Definition mit der gewünschten Anzahl Felder zu ergänzen: © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 30 3 Die Sprache Java int Matrix[][] = new int[10][10]; Bei der Definition von mehrdimensionalen Arrays ist es nicht erforderlich, bei allen Feldern die entsprechende Anzahl Werte anzugeben . Allerdings muss die Anzahl Felder von mindestens einer Dimension bekannt sein und auf eine nicht spezifizierte Dimension darf keine spezifizierte Dimension folgen: int DreiD_1[][][] = new int[10][][]; int DreiD_2[][][] = new int [10][][5]; // gültig // ungültig Mehrdimensionale Arrays können auch bei der Definition direkt initialisiert werden; zudem ist es nicht nötig, dass sie rechteckig aufgebaut sind: int Dreieck[][] = {{1,2},{3,4,5},{5,6,7,8}}; 3.2.6.3 Zugriff auf Arrays Der Zugriff auf Elemente des Arrays geschieht analog wie in C: gefolgt auf den Namen des Arrays folgt in eckigen Klammern ein Integer-Wert für das entsprechende Element. Kontrolle der Array-Grenzen In Java wird der Index kontrolliert, was einen Zugriff über die Array-Grenzen hinaus verunmöglicht. Falls der Index ausserhalb der Grenzen ist, wird die ArrayIndexOutOfBoundsExceptions Methode durchgeführt. 3.2.7 ZEICHENKETTEN (STRINGS) In Java sind Strings Sprachobjekte und nicht Pseudo-Arrays von Charakterzeichen wie in C. Es existieren zwei Arten von String-Objekten: Für konstante Strings, d.h. Strings die nicht verändert werden können, stellt Java die String-Klasse zur Verfügung. Für Strings, deren Inhalt veränderbar, manipulierbar sein muss, ist die Klasse StringBuffer zu verwenden. 3.2.8 ARITHMETISCHE UND RELATIONALE OPERATOREN Java unterstützt alle Operatoren von Standard C. Diese Operatoren besitzen auch dieselbe Präzedenz wie in C. Operator + * / % < > © J.-P. Thomsen 1996 Bedeutung Addition Subtraktion Multiplikation Division Modulus Kleiner als Grösser als 28.10.96 15:53 Java - Tutorial 31 3 Die Sprache Java <= >= == != && || ! & | ^ << >> >>> ∼ = ++ -+= -= *= /= %= &= |= <<= >>= >>>= Kleiner als oder gleich Grösser als oder gleich Gleich Nicht gleich Logisches AND Logischer OR Logisches NOT AND OR XOR Verschiebung nach links Verschiebung nach rechts Verschiebung nach rechts, Füllnullen Komplement Zuweisung Inkrement Dekrement Addition und Zuweisung Subtraktion und Zuweisung Multiplikation und Zuweisung Division und Zuweisung Modulus und Zuweisung AND und Zuweisung OR und Zuweisung Verschiebung nach links und Zuweisung Verschiebung nach rechts und Zuweisung Verschiebung nach rechts, Füllnullen und Zuweisung Operatoren Da Java keine Pointermanipulation kennt, können natürlich auch die Referenzierungs- und Dereferenzierungsoperatoren *, & und sizeof nicht unterstützt werden. Ausserdem unterstützt Java weder die Operatoren für Array- ([]) noch für Feldzugriffe (.). Java kennt dafür ein paar neue Operatoren: 3.2.8.1 Der +-Operator Verkettung von Text Der +-Operator erlaubt die einfache Konkatenierung von Zeichenketten. Dieser Operator hat dieselbe Präzedenz wie der arithmetische +-Operator. 3.2.8.2 Der instanceof-Operator Der instanceof-Operator gibt „true“ zurück, wenn ein Objekt (links vom Operator) eine Instanz der Klasse oder des Interfaces (rechts vom Operator) ist. Andernfalls liefert instanceof „false“. Der instanceof-Operator hat dieselbe Präzedenz wie die Operatoren <, <=, > und >=. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 32 3.2.8.3 Der >>>-Operator Da die ganzzahligen Datentypen in Java alle vorzeichenbehaftet sind, ist der >>-Operator definiert als ein nach rechts schieben mit Vorzeichenerweiterung. Der >>>-Operator betrachtet den Zahlenwert als „unsigned“ und schiebt die Bits nach rechts mit einer Null-Erweiterung. 3.2.8.4 Die Operatoren & und | &, | wirkt auf boolean wie logisches AND, OR Wenn die Operatoren & und | auf integrale Datentypen angewendet werden, entsprechen sie den bitweisen ORbzw. AND-Anweisungen. Da Java strikte unterscheidet zwischen Integer- und Boolean-Datentypen, wirkt deren Anwendung auf den Boolean-Datentyp wie ein logisches AND bzw. OR. Bei diesen logischen Operatoren werden immer beide Operanden ausgewertet auch wenn das Resultat nach dem ersten Ausdruck bereits feststeht. Diesen Umstand kann man benutzen, wenn die Operanden Ausdrücke mit Nebeneffekten (z.B. Methodenaufrufe) sind und immer beide Operanden ausgewertet werden sollen. 3.2.9 BEFEHLE Java verfügt über den von C und C++ her bekannten Satz von Entscheidungsbefehlen für Programmabläufe. Es gibt ein paar Unterschiede, die im folgenden erläutert werden sollen. 3.2.9.1 if/else, while, do/while Anweisungen Prüfausdruck: logischer Wert Die if, else, do, while Anweisungen sind genau dieselben wie in C und anderen Programmiersprachen. Der einzige Unterschied zu C besteht darin, dass der Prüfausdruck in C einen logischen Wert zurückgeben muss. In Java hingegen darf Null nicht mit der Bedeutung „falsch“ beziehungsweise Nicht-Null nicht mit der Bedeutung „wahr“ benutzt werden. 3.2.9.2 switch Anweisung Auch die switch-Anweisung entspricht derjenigen von C. Man kann die Datentypen byte, char, short, int und long für die case-Anweisung verwenden. Ebenso kann ein default Label verwendet werden: switch (expression) { case Konstante1: /* */ break; case Konstante2: /* */ © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 33 3 Die Sprache Java break; default: /* */ break; } 3.2.9.3 for Anweisung Die for-Schleife ist auch in Java die wahrscheinlich am häufigsten verwendete Kontrollflussanweisung. Es bestehen zwei Unterschiede zur for-Schleife in C: komma-separierte Ausdrücke Zum ersten unterstützt Java den Komma-Operator von C nicht, der es erlaubt, mehrere Ausdrücke zu einem einzigen Ausdruck zu verbinden. Die for-Schleife in Java simuliert diese Möglichkeit durch komma-separierte Ausdrükke im Initialisierungs- und Inkrementierungsbereich, nicht aber im Testbereich: int i; String s; for (i=0, s=„Test“; // Initialisierung (i>10) && (s.length() >=1); // Test i++, s=s.substring(1)) // Inkrementierung { System.out.println(s); // Schleife } Zum zweiten ist es die von C++ übernommene Fähigkeit, lokale Schleifen-Variablen im Initialisierungsbereich zu deklarieren. Auf diese Art deklarierte Variablen sind jedoch nur innerhalb der Schleife gültig. Da diese Art der Variablendeklaration ebenfalls das Komma benutzt, erlaubt Java entweder die Möglichkeit der komma-separierten Initialisierungsausdrücke oder die Deklaration und Initialisierung mehrerer komma-separierter Variablen desselben Typs. Diese zwei Möglichkeiten können nicht gemischt verwendet werden. 3.2.9.4 break,continue Anweisungen In Java gibt es auch die zwei Entscheidungsbefehle break und continue, die ein optionales Label haben können. Ohne das Label haben sie die gleiche Bedeutung wie in C. Wird jedoch das Label gesetzt, so beginnt die weitere Verarbeitung mit demjenigen Befehl, der mit dem Label versehen ist. ausbrechen aus einer Schleife Break-Anweisungen mit einem Label sind vor allem dann nützlich, wenn eine switch-Anweisung in eine for-Schleife eingebaut werden soll. Die break-Anweisung hat nämlich in einer switch-Konstruktion eine besondere Bedeutung: © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 34 3 Die Sprache Java das Hinzufügen eines Labels ermöglicht es, aus einer switch-Anweisung in einer Schleife auszubrechen loopStart: for (int j=0; j<10; j++) { /* break springt hierhin */ switch (j) { case 4: break; default: if (j%2) == 0) break loopStart; break; } } // springt in die Schleife 3.2.9.5 synchronized Anweisung Die synchronized Anweisung dient der Synchronisierung in der Multithreaded-Umgebung von Java. Sie sperrt das Objekt beim Aufruf und entsperrt es beim Verlassen. Wenn das Objekt bereits gesperrt ist, wartet die Methode mit der Ausführung bis die Sperre aufgehoben ist (siehe auch Kapitel 3.4 Threads). 3.2.9.6 package, import Anweisungen Packages bieten die Möglichkeit, verwandte Klassen zusammenzugruppieren. Ausgewählte Klassen aus einem solchen Package können durch den import-Befehl von Klassen ausserhalb des Packages benutzt werden (siehe auch Kapitel 3.6 Die Java-Packages). 3.2.10 SCHLÜSSELWORTE Java kennt bzw. unterstützt die folgenden reservierten Schlüsselworte: abstract case class do final future implements int new package rest super throw var © J.-P. Thomsen 1996 boolean cast const double finally generic import interface null private return switch throws void break catch continue else float goto inner long operator protected short synchronized transient volatile byte char default extends for if instanceof native outer public static this try while 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 35 Schlüsselworte2 Die kursiv geschriebenen Schlüsselworte werden zur Zeit nicht unterstützt. 3.2.11 SYNCHRONISIERUNG parallele Ausführung Java verwendet selbst z.B. zur Realisierung der Speicherverwaltung Threads und es stellt dem Programmierer Klassen und Methoden zur Thread-Bildung zur Verfügung. Threads ermöglichen das parallele Ausführen einzelner Programmteile. Bei GUI-basierenden Systemen ist es z.B. wichtig, dass verschiedene Aufgaben parallel erledigt werden. So will der Anwender in der Menüstruktur blättern während in einem Fenster Berechnungen ausgeführt werden und in einem anderen gerade eine Graphik aufgebaut wird. integrierter Monitor Bei Java muß sich der Programmierer nicht mehr mit den Besonderheiten der Zielplattform auseinandersetzen und er muß auch keine Bedenken haben, ob die StandardLibrary-Funktionen mehrfach gleichzeitig aufgerufen worden sind. Er bekommt durch Java einheitliche Methoden zur Synchronisation von Threads und zur Kommunikation zwischen verschiedenen Threads zur Verfügung gestellt. Durch den Modifizierer synchronized können Methoden eines Objekts gegen mehrfachen parallelen Aufruf geschützt werden. Ein in der Java-Laufzeitumgebung implementierter Monitor überwacht dann, dass diese Methoden des Objekts nicht parallel sondern seriell ausgeführt werden. Generell sollten alle Methoden, die Objektattribute verändern, als synchronized deklariert werden. Die Standardbibliothek ist vollständig “threadfest”, d.h. Methoden können uneingeschränkt mehrfach parallel aufgerufen werden. 3.3 Ausnahmen (Exceptions + Exception Handling) In Sprachen wie C werden Laufzeitfehler auf die verschiedensten Arten behandelt. Häufig geschieht dies mit den verschiedensten Rüchgabewerten bei Funktionen, welche immer abgefangen und interpretiert werden müssen, sodass die Übersichtlichkeit des Programmcodes darunter leidet. Java bietet dagegen eine Alternative: die Ausnahmen (Exceptions). 2 [Nutshell], Seite 181 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java Ausnahmen anstelle von Rückgabe-Codes 36 Mit Ausnahmen können aussergewöhnliche Bedingungen in einem Programm behandelt werden, sodass der normale Code sauberer und übersichtlicher wird. Im Gegensatz zu den Methoden der Fehlerbehandlung, die Fehlercodes zurückgeben wie z.B. in C, kann der Aufrufer der Methode die Ausnahme ignorieren und sie im CallStack hinaufwandern lassen bis sich eine Methode mit ihr befasst. Unter einem Call-Stack versteht man einfach die Sequenz der Methodenaufrufe. 3.3.1 AUSNAHME-OBJEKT Eine Ausnahme in Java ist eigentlich ein Objekt, welches wiederum eine Instanz der Throwable-Klasse (java.lang. Throwable) oder einer Unterklasse davon ist. Da Ausnahmen Objekte sind, können sie auch Daten und Methoden enthalten. Das Throwable-Objekt an der Wurzel der Ausnahme-Hierarchie beinhaltet eine String-Meldung, welche alle Datenfelder an das Ausnahme-Objekt vererbt. Diese Meldung kann nun von der Ausnahme mit der Throwable.getMessage()-Methode gelesen werden. 3.3.2 BEHANDLUNG VON AUSNAHMEN Für die Behandlung von Ausnahmen dienen in Java die Anweisungen try, catch und finally. 3.3.2.1 try Der try-Anweisung folgt ein Codeblock, der normal durchlaufen wird. Falls durch eine Anweisung in diesem Block eine Ausnahme entsteht, werden die Argumentdeklarationen der catch-Anweisung solange geprüft, bis die Ausnahme einem Argument zugewiesen werden kann. 3.3.2.2 catch catch-Klauseln spezifizieren Ausnahmetypen Dem try-Block folgen zwischen keinem und mehreren catch-Klauseln, die den Code für die Behandlung von verschiedenen Ausnahmetypen spezifizieren. Diese catchKlauseln haben eine spezielle Syntax: jede Klausel wird mit einem Argument deklariert wie ein Methodenargument. Dieses Argument muss allerdings vom Typ Throwable bzw. einer Unterklasse davon sein. Jeder dieser catch-Blöcke bearbeitet einen Ausnahmefall. Wenn eine Ausnahme auftritt, so wird die erste catchKlausel aufgerufen, welche ein Argument vom verwendeten Typ hat. Das catch-Argument ist nur innerhalb des catch-Blockes gültig und referenziert das aktuelle Objekt, welches aufgetreten ist. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 37 3.3.2.3 finally finally-Block wird immer ausgeführt Der finally-Block enthält Anweisungen, die auf jeden Fall ausgeführt werden müssen, egal ob ein Fehler aufgetreten ist oder nicht. An dieser Stelle ist es z.B. sinnvoll, bei IOFunktionen den close-Befehl unterzubringen. Auch für den Fall, dass der try-Block mit einer return-, break- oder continue-Anweisung abgebrochen wird, werden vor dem Fortsetzen des Programms die Anweisungen im finally-Block ausgeführt. Falls nach dem Auftreten einer Ausnahme kein entsprechender lokaler catch-Block gefunden wird, wird ebenfalls der finally-Block ausgeführt bevor die Ausnahme an den nächsten nicht-lokalen catch-Block weitergegeben wird. 3.3.3 DEFINITION UND ANWENDUNG VON AUSNAHMEN Zum gezielten Auslösen einer Ausnahme dient die throwAnweisung. Als Parameter wird dabei ein Throwable-Objekt benötigt. Eine Klasse, die eine Ausnahme auslösen kann, hat folgenden Aufbau: public DemoClass trows DemoException{ // etc... if (Fehler_ist_aufgetreten) trow new DemoException; // etc... } Durch die Angabe „throw DemoException“ bei der Klassendefinition weiss der Compiler, dass aufrufende Methoden dieser Klasse Ausnahmen des Typs „DemoException“ abfangen können. catch-Anweisung wird in Hierarchie gesucht Tritt nun zur Laufzeit ein Fehler auf, so wird über alle aufrufenden Methoden (d.h. über den gesamten Call-Stack) hinweg nach einer catch-Anweisung gesucht, die diesen bearbeiten kann. Die erste, die in der Hierarchie gefunden wird, wird benutzt. Auf diese Weise ist es möglich, das Verhalten bei Ausnahmen den eigenen Bedürfnissen anzupassen. Der Compiler prüft beim Übersetzen, ob für jede denkbare Ausnahme ein geeigneter catch-Block verfügbar ist. Nur wenn keiner gefunden wurde, wird das JavaProgramm übersetzt. Dies bedeutet allerdings nicht, dass in Java-Programmen für alle denkbaren Ausnahmezustände, die zur Laufzeit auftreten können, grundsätzlich eine catch-Anweisung definiert werden muss. Für die sogenannte „Runtime-Exception“ übernimmt das System © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 38 die Bearbeitung, wenn nicht extra eine Fehlerbehandlung für diesen Exception-Typ eingerichtet wurde. Tritt eine Runtime-Exception auf, die nicht vom Programm abgefangen wird, terminiert die Java Virtual Machine das Programm. 3.4 Threads Moderne, verteilte Applikationen müssen häufig viele Dinge parallel erledigen. Daher reicht ein einziger Steuerfluß, wie er für sequentielle Applikationen typisch ist, nicht aus. In der Praxis wird dem Problem meist durch die Verwendung (quasi-)paralleler Prozesse begegnet. Bedingt durch verschiedene Nachteile (relativ grosser Overhead, erschwerte Kommunikation und Synchronisation) besteht zunehmend der Bedarf, mehrere Steuerflüsse innerhalb eines Programms, die als Threads bezeichnet werden, zu realisieren. Derartige Programme tragen oft das Attribut multithreaded. Threads sind preemptiv Java-Threads sind generell preemptiv, allerdings nur dann time-sliced, wenn die verwendete Thread-Implementierung des Betriebssystems dies unterstützt. Daher sollte der Programmierer für eine gewisse Fairneß sorgen, um das Verhungern anderer Threads zu verhindern. Auf allen Systemen wird einem Thread die Steuerung entzogen, sobald ein anderer Thread mit höherer Priorität ausgeführt werden kann. Ein von Consumer und Producer gemeinsam genutztes Objekt (der kritische Bereich) wird durch einen Monitor geschützt. Dies geschieht automatisch durch die Verwendung des Schlüsselwortes synchronized. Dadurch ist gesichert, daß die Methoden des Objekts (die kritischen Abschnitte) atomare Operationen darstellen. 3.4.1 FUNKTIONSWEISE VON THREADS Erzeugung eines Threads mit run() Beim Starten eines Java-Programms wird automatisch ein Thread erzeugt. Um einen eigenen Thread zu erzeugen, muss z.B. das Runnable-Interface implementiert werden. Jede Klasse, die dieses Interface implementiert muss über die Methode run() verfügen. Um einen Thread zu starten, wird als erstes ein Objekt der Klasse instanziiert. Im nächsten Schritt muss ein Thread erzeugt werden. Der Konstruktor der Thread-Klasse übernimmt das runnable-Objekt und nimmt alle notwendigen Initialisierungen vor. Zum Starten wird schliesslich die start()-Methode des Threads aufgerufen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 39 3 Die Sprache Java Neben run() gibt es noch die weiteren Methoden init(), start() und stop(), die für den Start bzw. das Beenden des Threads von Bedeutung sind. Die folgende Abbildung zeigt die möglichen Zustände eines Threads in Java: Zustände eines Threads Java bietet zudem die Möglichkeit, Threads in sogenannte Thread-Gruppen zusammenzufassen; aber generell sollte diese Möglichkeit den Applikationen auf Systemebene vorbehalten bleiben. Threads mit Prioritäten Ausserdem können Threads mit Prioritäten versehen werden, sodass Threads mit höherer Priorität gegenüber Threads mit niedriger Priorität Vorrang haben. Das ist nützlich, wenn bestimmte Threads immer ausgeführt werden sollen, wenn sie nicht gerade auf irgend etwas warten. Man sollte sich allerdings nicht auf strikte Prioritäten verlassen, sondern die Prioritäten vielmehr als Hinweise an das System betrachten, die regeln, welche Threads vor anderen Zugriff auf den Prozessor bzw. die Prozessoren haben sollen. 3.4.2 SYNCHRONISATIONS-ANWEISUNGEN Wenn eine kritische Methode aufgerufen wird, welche von keinem anderen Thread unterbrochen werden darf, muss dieser Bereich geschützt werden; diesen kritischen Methoden wird dazu in Java einfach das Schlüsselwort synchronized vorangestellt. Ruft nun ein Thread eine solche Methode auf, wird diese für andere Threads gesperrt. Erst wenn sie vollständig abgearbeitet wurde, gibt Java sie wieder frei. Versucht dennoch bei einem ThreadWechsel ein anderer Thread eine gesperrte Methode aufzurufen, wird er so lange in einer Warteschlange plaziert, bis diese wieder freigegeben wurde. Monitore zur Sperrung und Freigabe Die Aufgabe der Verwaltung der Sperrung bzw. Freigabe der synchronized Methoden übernehmen sogenannte © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 40 Monitore: Die Methoden wait() und ihre zwei Varianten mit einem Timeout veranlassen den aktiven Thread, so lange zu warten, bis eine Bedingung erfüllt ist. Die Methode notify() bzw. notifyAll(), die innerhalb einer synchronized Methode aufgerufen werden muss, weckt den aktiven bzw. alle Threads auf, um die Bedingung erneut zu prüfen, weil sich etwas geändert hat. 3.5 Benennungskonventionen In Java werden Klassen unter ihrem Realnamen abgelegt. Dadurch muß man beachten, daß ein File mit dem Namen test.java nach der Compilierung unter Umständen mehrere Files erzeugt die zum Beispiel klasse1.class, klasse2.class etc. heißen. Zum Auffinden der Klassen wird vom ClassLoader der Klassen eine bestimmte Strategie verfolgt. Klassen werden zu sogenannten Packages zusammengefaßt. Bestes Beispiel sind die Standard Librarys deren Namen alle mit dem Präfix java. beginnen. Um den Anspruch an die Dateisysteme nicht unnötig zu erhöhen wird zum Beispiel für die Klasse java.awt.list der Filenamen list.class Verzeichnis .\java\awt\ verwendet. Inzwischen ist man dazu übergegangen die kompletten Librarys in einem Archiv zu speichern (CLASSES.ZIP). Dieses File darf bei der Installation von Java keinesfalls ausgepackt werden. Zur Benennung von Klassen die (Inter-) Netz weit bekannt sein sollen, gilt die Konvention als Präfix der Klassen den eigenen URL zu verwenden (dadurch wäre es mit einem geeigneten ClassLoader möglich Klassen automatisch in der aktuellsten verfügbaren Version vom durch den URL zu identifizierenden Server zu laden). Die Problematik der unter Umständen recht langen Klassennamen wird derzeit heftig diskutiert und ist auch reichlich umstritten. 3.6 Die Java-Packages verwandte Klassen in Packages In Java ist es möglich, verwandte Klassen in einem sogenannten Package zusammenzufassen. Bnötigt ein Programm die Klassen eines Packages, so importiert es einfach die notwendigen Dateien mit dem import-Befehl. In Java gibt es sechs (sehr umfangreiche) Packages, die standardmäßig zum Java Development Kit (JDK) gehören: © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 3 Die Sprache Java 41 java.lang: Dieses Package beinhaltet wesentliche Java-Klassen. Dieses Package wird implizit in jede Java-Datei importiert. So muß ein “import java.lang.*” nicht in einer Java-Datei deklariert werden. java.io: Dieses Package enthält Klassen, die für die Datenein- bzw. ausgabe benutzt werden können. java.util: Enthält Utility-Klassen wie Hashtables, Vektoren, Zufallszahlen, Datum usw. java.net: Enthält Klassen für die Netzwerkverbindung. Diese Klassen können zusammen mit den Klassen aus dem java.io-Package benutzt werden, um Daten aus dem Netzwerk zu lesen oder in das Netzwerk zu schreiben. java.awt: Mit diesem Package lassen sich plattformunabhängige GUI-Applikationen schreiben. Es sei hier ausdrücklich darauf hingewiesen, dass speziell dieses Package Java für die Programmierung im Internet interessant macht. Mit diesem Package erreicht man einen Interaktivitätsgrad, der mit herkömmlicher CGI-Programmierung undenkbar wäre. java.applet: Enthält Klassen für die Java-Applet-Programmierung. Diese Applets können dann in jedem Java-kompatiblen Web-Browser ablaufen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 42 4 Objekte und Klassen 4 Objekte und Klassen Objekte als Programmabstraktion Java ist eine objektorientierte Sprache; dies bedeutet, dass in Java geschriebene Programme Objekte benutzen. Objekte sind eine Programmierkonstruktion, in welcher Daten einem Code zugeordnet werden, der mit diesen Daten arbeitet. Objekte werden durch ihre Klasse charakterisiert, die man sich als eine Art Vorlage vorstellen kann. Die Konzepte von Java haben grosse Ähnlichkeit mit jenen von C++. Wer bereits Erfahrungen in C++ oder anderen objektorientierten Programmiersprachen hat, dem wird vieles bekannt vorkommen, was Java zu bieten hat. 4.1 Einführung in Klassen und Objekte Daten und Methoden definieren Inhalte Eine Klasse ist eine Sammlung von Daten und Methoden, welche diese Daten verarbeiten. Methoden sind eine Art objektorientierte Bezeichnung für Prozeduren und Funktionen. Diese Daten und Methoden definieren Inhalte und Fähigkeiten, welche als Objekte bezeichnet werden. public class Circle { public double x,y; // Koordinaten des Zentrums public double c; // der Radius // Methoden für die Berechnung von Umfang und Fläche public double circumference() {return 2 * 3.14159 * r;} public double area() {return 3.14159 * r * r;} } 4.1.1 OBJEKTE ALS INSTANZEN VON KLASSEN Mit einer Klasse allein lässt sich nichts anfangen, man benötigt ein Objekt als Instanz einer Klasse. Bei der Definition einer Circle-Klasse wurde ein neuer Datentyp kreiert; nun kann eine Variable dieses Typs deklariert werden: Circle c; Aber diese Variable c ist einfach die Bezeichnung einer Referenz auf das Circle-Objekt und nicht das Objekt selber. In Java müssen die Objekte dynamisch erzeugt werden; dies geschieht z.B. mit dem Schlüsselwort new: Circle c; c = new Circle(); Nun ist eine Instanz auf die Circle-Klasse (ein Circle-Objekt) erzeugt und in einer Variablen vom Typ Circle zugeordnet worden. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 4 Objekte und Klassen 43 4.1.2 ZUGRIFF AUF OBJEKTDATEN Zugriff mit PunktOperator Nachdem ein Objekt erzeugt worden ist, kann man auf dessen Datenfelder zugreifen. Die Syntax ist für C-Programmierer nichts unbekanntes: Circle c = new Circle(); // Initialisierung auf Zentrum (2,2) und Radius 1 c.x = 2.0; c.y = 2.0: c.r = 1.0; 4.1.3 GEBRAUCH VON OBJEKTMETHODEN Um auf die Methoden eines Objektes zuzugreifen, wird dieselbe Syntax verwendet wie beim Zugriff auf die Daten eines Objekts: Circle c = new Circle(); double a; c.r = 2.5; a = c.area(); Der Methode wird also kein Argument übergeben. Das Objekt, mit welchem man arbeitet, ist implizit Bestandteil der Syntax. Dieselbe Feststellung kann man bei der Definition der Methode machen. Es ist Bestandteil der Sprache, dass eine Methode mit den Instanzen einer Klasse operiert, in welcher sie definiert ist. 4.1.4 FUNKTIONSWEISE Wie kann eine Methode ohne Argumente wissen, mit welchen Daten sie arbeiten soll? In Wirklichkeit hat die area()Methode ein Argument. area() ist implementiert mit einem impliziten Argument, welches in der Deklaration der Methode nicht sichtbar ist. Dieses Argument heisst this und referenziert „dieses“ Objekt Circle, durch welches die Methode aufgerufen wurde. implizites this als Argument Das implizite this-Argument ist aus der Methodenbezeichnung nicht ersichtlich, weil es normalerweise gar nicht benötigt wird. Immer wenn eine Methode in Java auf Datenfelder einer Klasse zugreift, werden die Datenfelder des eigenen Objektes referenziert. Man kann das Schlüsselwort this explizit verwenden, um klar zu machen, dass die eigenen Variablen bzw. Methoden verwendet werden. Eine Instanz, bei welcher das Schlüsselwort this nötig ist, ist wenn ein Methodenargument oder eine lokale Variable in einer Methode dieselbe Bezeichnung hat wie eines der Elemente der Klasse. In diesem Fall muss das Schlüssel- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 44 4 Objekte und Klassen wort this verwendet werden, um auf das gewünschte Feld zuzugreifen. 4.2 Erzeugen von Klassen jede Klasse hat mindestens einen Konstruktor Bei der Definition einer Klasse erscheint ein Paar Klammern, welches an einen Funktionsaufruf erinnert. Eigentlich geschieht auch nichts anderes; jede Klasse in Java hat mindestens eine Konstruktor-Methode, welche denselben Namen trägt wie die Klasse. Der Zweck dieses Konstruktors besteht darin, die nötigen Initialisierungen vorzunehmen. Falls für eine bestimmte Klasse kein Konstruktor definiert wird, so nimmt Java einen Default-Konstruktor, welcher keine Argumente übernimmt und keine speziellen Initialisierungen unterstützt. Das Schlüsselwort new erzeugt eine neue dynamische Instanz einer Klasse. Danach wird die Konstruktor-Methode aufgerufen und vom neuen Objekt und den in Klammern spezifizierten Argumenten durchlaufen. 4.2.1 DEFINITION EINES KONSTRUKTORS Spezifizierung von Initialisierungswerten Das folgende Beispiel zeigt die Definition eines Konstruktors für das Circle-Objekt, welcher Initialisierungswerte für das Zentrum und den Radius spezifiziert. Gleichzeitig wird die Verwendung des this-Schlüsselwortes aufgezeigt: public class Circle { public double x,y,r; // Zentrum und Radius // Konstruktor public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; } public double circumference() {return 2 * 3.14159 * r;} public double area() {return 3.14159 * r * r;} } Mit diesem neuen Konstruktor wird die Initialisierung Teil der Erzeugung eines Objektes. Für dir Deklaration eines Konstruktors ist folgendes von Bedeutung: - Der Konstruktor trägt immer denselben Namen wie die dazugehörige Klasse. - Der Rückgabewert ist implizit eine Instanz der Klasse. - Es wird weder ein Rückgabewert spezifiziert noch das Schlüsselwort void verwendet. Das this-Objekt wird impli- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 4 Objekte und Klassen 45 zit zurückgegeben; ein Konstruktor soll keine returnAnweisung enthalten, um einen Wert zurückzugeben. 4.2.2 MEHRFACHE KONSTRUKTOREN verschiedene Arten der Initialisierung Manchmal ist es wünschenswert, ein Objekt auf mehrere verschiedene Arten zu initialisieren. Es kann z.B. sinnvoll sein, den Radius eines Kreises ohne ein Zentrum oder einen Kreis mit demselben Zentrum wie ein bestehender Kreis zu initialisieren. Es kann aber auch erwünscht sein, alle Datenfelder mit Default-Werten zu initialisieren. Eine Klasse kann eine beliebige Anzahl von KonstruktorMethoden aufweisen; allerdings müssen sich diese in bezug auf die Argumentenanzahl bzw. deren Datentypen unterscheiden. 4.2.3 ÜBERLADEN VON METHODEN Überraschend scheint, dass alle Konstruktor-Methoden denselben Namen besitzen. Wie kann also der Compiler diese voneinander unterscheiden? Unterscheidung anhand von Rückgabetyp und Argumente In Java unterscheiden sich die Methoden durch ihren Namen, ihren Rückgabetyp und durch Anzahl, Typ und Position ihrer Argumente. Wenn eine Methode aufgerufen wird, wobei mehrere mit demselben Namen bestehen, so nimmt der Compiler automatisch jene Methode, dessen Datentypen und Argumente passend sind. Diese Art, mehrere Methoden mit demselben Namen und unterschiedlichen Argumenten oder Rückgabetypen zu definieren, nennt man Überladen von Methoden. Dies ist allerdings nicht mit dem Überschreiben von Methoden zu verwechseln (siehe Kapitel 4.7 Überschreiben von Methoden) 4.3 Klassenvariablen globale Variablen wären machmal von Vorteil Im vorigen Beispiel einer Circle Klasse sind die Variablen x, y und r deklariert. Jede Instanz einer Klasse, also jeder Kreis, hat seine eigene Kopie dieser drei Variablen. Manchmal wäre es von Vorteil, nur eine Kopie einer Variablen zu haben, wie eine globale Variable in C. Java erlaubt keine globalen Variablen, da jede Variable innerhalb einer Klasse deklariert werden muss. Java verwendet das Schlüsselwort static, um anzuzeigen, dass ein Feld oder eine Methode einer Klasse allen Instanzen dieser Klasse gemeinsam sein soll. Diese Art von Variablen werden auch „statische Variablen“ genannt. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 46 4 Objekte und Klassen 4.3.1 BEISPIEL EINER KLASSENVARIABLEN Das folgende Beispiel zeigt eine mögliche Verwendung einer solchen Klassenvariablen. Es wird eine Klassenvariable deklariert, welche bei jeder neuen Instanzierung der Klasse inkrementiert wird: public class Circle { static int num_circles = 0; public double x,y,r; // Klassenvariable // Instanzen public Circle(double x, double y, double r){ this.x = x; this.y = y; this.r = r; num_circles++; } public Circle(double r) {this(0.0,0.0,r);} public Circle(Circle c) {this(c.x,c.y,c.r);} public Circle() {this(0.0,0.0,1.0);} public double circumference() {return 2 * 3.14159 * r;} public double area() {return 3.14159 * r * r;} } 4.3.2 ZUGREIFEN AUF KLASSENVARIABLEN Da die Klassenvariable eng mit der Klasse verbunden ist, erfolgt auch der Zugriff meistens über die Klasse: System.out.println(„Anzahl Kreise:“ + Circle.num_circles); Will man von einer fremden Klasse auf diese Methode zugreifen, so ist es nötig, den Klassennamen der Methode voranzustellen (Circle.num_circles). 4.3.3 GLOBALE VARIABLEN ? Klassenvariable entspricht einer globalen Variablen Wie bereits erwähnt kennt Java keine globalen Variablen. Eigentlich ist aber die Klassenvariable Circle.num_circles nichts anderes. Der Unterschied zu einer globalen Variable in C besteht darin, dass es zu keinen Namenskonflikten kommen kann. Jede Klassenvariable ist Teil einer Klasse und innerhalb dieser Klasse einmalig; wird nun der Klassenvariablen der Name der Klasse vorangestellt, sind Konflikte nicht möglich. 4.3.4 KONSTANTEN Eine spezielle Art von Klassenvariablen bilden die Konstanten. Mit dem Schlüsselwort final lässt sich eine Variable definieren, deren Wert sich nicht verändern lässt. public class Circle{ public static final double PI = 3.14159265; public double x,y,r; // etc..... } © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 4 Objekte und Klassen 47 Der Compiler von Java setzt die so deklarierte Variable (static und final) direkt um, ähnlich wie die PräprozessorAnweisungen in C (# define). 4.4 Klassenmethoden Klassenmethoden sind statische Methoden Wie der Name bereits andeutet, sind die Klassenmethoden Methoden der Klassen und nicht der Instanzen. Klassenmethoden werden auch etwa als „statische Methoden“ (static methods) bezeichnet. Sie unterscheiden sich von den Instanzenmethoden wie z.B. area() im Circle-Beispiel wie folgt: - Klassenmethoden werden mit dem Schlüsselwort static deklariert. - Klassenmethoden werden eher durch die Klasse aufgerufen als durch die Instanz. - Klassenmethoden können auch als „globale“ Methoden angesehen werden. Da sie durch ihren Klassennamen referenziert werden müssen, besteht keine Gefahr für Namenskonflikte. 4.4.1 BESONDERE MERKMALE Klassenmethoden ohne this Klassenmethoden unterschieden sich in einem weiteren wesentlichen Punkt von Instanzenmethoden: sie durchlaufen keine implizite this-Referenz. Durch diese Tatsache werden sie zur geschlossensten Methode, die Java zu bieten hat und gleicht einer „normalen“ C-Prozedur. Die Klassen System und Math z.B. bieten beide eine grosse Sammlung von Klassenmethoden an. 4.4.2 BEISPIEL EINER KLASSENMETHODE Das folgende Beispiel der Definition einer Circle-Klasse zeigt sowohl eine Instanz wie auch eine Klassenmethode: public class Circle{ public double x,y,r; // Instanzenmethode public Circle bigger(Circle c){ if (c.r > r) return c; else return this; } // Klassenmethode public static Circle bigger(Circle a, Circle b){ if (a.r > b.r) return a, else return b; } // etc.... } © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 48 4 Objekte und Klassen Der Aufruf der Instanzenmethode sieht folgendermassen aus: Circle a = new Circle(2.0); Circle b = new Circle(3.0); Circle c = a.bigger(b); // oder b.bigger(a) Der Aufruf der Klassenmethode hingegen lautet: Circle a = new Circle(2.0); Circle b = new Circle(3.0); Circle c = Circle.bigger(a,b); Keine dieser Methoden ist die einzig richtige; der Einsatz hängt mehr vom eigenen Programmierstil ab als von syntaktischen Regeln. 4.4.3 STATISCHE INITIALISIERUNG Sowohl Klassen- als auch Instanzenvariablen können in ihrer Deklaration über Initialisierer verfügen. Klassenvariablen werden initialisiert sobald sie erstmals geladen werden; bei Instanzenvariabeln hingegen erfolgt die Initialisierung bei der Erzeugung des Objektes. statische Initialisierer als „Konstruktor“ für Klassenvariablen Manchmal werden komplexe Initialisierungen benötigt. Für Instanzenvariabeln gibt es die Konstruktor-Methode, welche ausgeführt wird, sobald eine neue Instanz der Klasse erzeugt wird. Java erlaubt es ausserdem, eine Initialisierungsmethode für Klassenvariablen zu schreiben. Solche Methoden werden als statische Initialisierer bezeichnet. Die Syntax von statischen Initialisierern ist auf den ersten Blick eher ungewöhnlich. Ein statischer Initialisierer besitzt weder Argumente noch einen Rückgabewert. Es ist nicht einmal erforderlich, einen Namen zu vergeben. 4.5 Löschen von Objekten Wie bereits festgestellt wurde (Kapitel 3.2.5 Müllabfuhr, „Garbage Collector“), braucht sich der Programmierer in Java keine Gedanken zu machen, wie er nicht mehr benötigten Speicherplatz frei macht; dies erledigt der Garbage Collector von Java automatisch. 4.5.1 GARBAGE COLLECTOR Thread mit tiefer Priorität räumt auf Der Garbage Collector läuft als Thread von tiefer Priorität dauernd im Hintergrund einer Java-Umgebung. Dies führt dazu, dass er immer in Aktion tritt, wenn sonst auf dem System „nicht viel los ist“. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 4 Objekte und Klassen 49 4.5.2 FINILIZATION-METHODE Finilization-Methode als Destruktor Ebenso wie es eine Konstruktor-Methode für die Initialisierung eines Objektes gibt, bietet Java eine Finilization-Methode an. In C++ nennt man dies auch etwa Destruktoren. Diese Methode wird für vielerlei „Aufräumarbeiten“ verwendet. Solche Aufräumarbeiten sind z.B. die Freigabe von verschiedenen Ressourcen wie File-Deskriptoren oder Sokkets. Der Garbage-Collector ist nur in der Lage, den Speicher freizugeben; offene Files oder Netzwerkverbindungen müssen von der Finilization-Methode freigegeben bzw. geschlossen werden. 4.6 Klassenhierarchie und Vererbung Die revolutionäre Möglichkeit der objektorientierten Technik ist die Vererbung von Daten und Methoden einer Klasse an eine andere. Vererbung mit Steuerung der Berechtigungen Bei der Verwendung wird eine Beziehung zwischen Oberund Unterklasse hergestellt. Der Vererbungsvorgang kann über die Zugriffsberechtigung so gesteuert werden, dass die abgeleiteten Klassen alle oder nur Teile der Eigenschaften der Basisklasse erben. 4.6.1 VERERBEN VON KLASSEN Um aus der Circle-Klasse, welche die mathematischen Methoden definiert, so zu erweitern, dass die Kreise gezeichnet werden können, muss eine GraphicCircle-Klasse definiert werden. Diese GraphicCircle-Klasse ist eine Erweiterung bzw. Unterklasse der Circle-Klasse. public class GraphicCircle extends Circle Das Schlüsselwort extends sorgt dafür, dass GraphicCircle eine Unterklasse der Circle-Klasse wird und die Variablen und Methoden dieser Klasse erbt. 4.6.2 ENDKLASSEN Wenn eine Klasse mit dem Schlüsselwort final deklariert wird, kann sie nicht erweitert oder weitervererbt werden. Die Klasse java.lang.System ist ein Beispiel einer solchen Endklasse. 4.6.3 KLASSENHIERARCHIE Jede Klasse verfügt über eine Oberklasse wie z.B. Circle für GraphicCircle; die einzige Ausnahme bildet die Klasse Object, welche an der Wurzel der Klassenhierarchie steht. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 50 4 Objekte und Klassen Object Circle GraphicCircle Math System Component Container Panel Button List Klassenhierarchie 4.6.4 UNTERKLASSEN UND KONSTRUKTOREN Auch für jede Unterklasse lässt sich natürlich eine Konstruktor-Methode definieren. Im folgenden Beispiel sehen wir eine mögliche Konstruktor-Methode für die neue GraphicCircle-Klasse: public GraphicCircle(double x, double y, double r, Color outline, Color fill) { this.x = x; this.y = y; this.r = r; this.outline = outline; this.fill = fill; } Dieser Konstruktor erbt alle Variablen und Klassen der Circle-Klasse und initialisiert dessen Variablen. Dies kopiert in Wirklichkeit den Code des Circle-Konstruktors. Das nächste Beispiel zeigt, wie man den Circle-Konstruktor innerhalb des GraphicCircle-Konstruktors aufrufen kann: © J.-P. Thomsen 1996 28.10.96 15:53 Applet Java - Tutorial 51 4 Objekte und Klassen public GraphicCircle(double x, double y, double r, Color outline, Color fill) { super(x,y,r); this.outline = outline; this.fill = fill; } mit super den Konstruktor der Obeklasse aufrufen Das Schlüsselwort super ermöglicht es, den Konstruktor der Oberklasse aufzurufen. Die Verwendung des super Schlüsselwortes erfolgt analog dem Schlüsselwort this, um eine Konstruktor-Methode einer Klasse von einer anderen Klasse aus aufzurufen. Die Benutzung beider Methoden ist gewissen Einschränkungen unterworfen: - super kann auf diese Art nur innerhalb einer KonstruktorMethode verwendet werden. - Der Aufruf des Konstruktors einer Oberklasse muss als erste Anweisung innerhalb einer Konstruktor-Methode erscheinen. Der Aufruf muss vor der Deklaration der Variablen erfolgen. 4.6.5 VERKETTUNG VON KONSTRUKTOREN Wenn eine Klasse definiert wird, garantiert Java, dass der Konstruktor dieser Klasse aufgerufen wird, sobald eine Instanz dieser Klasse bzw. einer Unterklasse erzeugt wird. jeder Konstruktor muss Konstruktor der Oberklasse aufrufen Dafür muss Java sicherstellen, dass jeder Konstruktor den Konstruktor seiner Oberklasse verwendet. Wenn die erste Anweisung in einem Konstruktor nicht explizit mit dem super Schlüsselwort den Konstruktor seiner Oberklasse aufruft, fügt Java implizit einen super()-Aufruf ein, der den Konstruktor der Oberklasse ohne Argumente aufruft. Verfügt diese Oberklasse über keinen Konstruktor ohne Argumente, so führt dies zu einem Compilerfehler. In einem Fall wird von dieser Regel des Aufrufs des Konstruktors in der Oberklasse abgewichen: wenn in der ersten Zeile eines Konstruktors ein anderer Konstruktor derselben Klasse mit dem Schlüsselwort this aufgerufen wird. Diese Art Konstruktoren aufzurufen, von Unterklasse zu Oberklasse bis zur Wurzel der Klassenhierarchie der Klasse Object, nennt man Verkettung von Konstruktoren. 4.6.6 DER DEFAULT-KONSTRUKTOR Falls in Java eine Klasse ohne Konstruktor-Methode deklariert wird, fügt Java implizit einen Konstruktor hinzu. Dieser Default-Konstruktor macht nichts anderes, als den Konstruktor seiner Oberklasse aufzurufen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 52 4 Objekte und Klassen 4.7 Überschreiben von Methoden Methode mit identischem Namen, Rückgabetyp, Argumenten Wenn eine Klasse eine Methode mit identischem Namen, Rückgabetyp und Argumenten definiert wie eine Methode einer Oberklasse, so nennt man dies überschreiben von Methoden. Wird die Methode für ein Objekt der Klasse aufgerufen, so wird die neue Definition der Methode verwendet und nicht die „alte“ in der Oberklasse. Das Überschreiben von Methoden ist nicht zu verwechseln mit dem Überladen von Methoden (siehe Kapitel 4.2.3 Überladen von Methoden). Das Überladen von Methoden definiert mehrere Methoden (in derselben Klasse) mit demselben Namen aber unterschiedlichen Argumentenliste oder Rückgabetyp. 4.7.1 FINALE METHODEN finale Methoden können nicht erweitert werden Ist eine Methode als final deklariert, bedeutet dies, dass sie weder weitervererbt noch überschrieben werden kann. Als static oder private deklarierte Methoden werden implizit als finale Klassen betrachtet. 4.7.2 DYNAMISCHES NACHSCHLAGEN DER METHODE Wenn in einem Array von Circle- und Ellipse-Objekten, (wobei die Ellipse-Klasse eine Unterklasse der Circle-Klasse ist und deren area()-Methode überschreibt) die Fläche berechnet werden soll, woher weiss der Compiler, welche area()-Methode er aufrufen soll? Der Compiler weiss es nicht und kann es auch gar nicht wissen. Es ist der Java-Interpreter, der zur Laufzeit feststellt, welches Objekt im Array zur Klasse Circle und welches zur Klasse Ellipse gehört. So ist es möglich, die richtige area()Methode für jedes Objekt aufzurufen. Dieselbe Technik wird übrigens in C++ für „virtual functions“ verwendet. 4.7.3 AUFRUFEN EINER ÜBERSCHRIEBENEN METHODE mit super lassen sich überschriebene Methoden aufrufen Durch Überschreiben einer Methode wird die ursprüngliche Methode verborgen; trotzdem bleibt diese weiterhin verfügbar. Um die Originalmethode innerhalb einer Klassendefinition aufzurufen, benutzt man das Schlüsselwort super; damit gibt man den Methodenaufruf in der Hierarchie nach oben weiter. 4.7.4 VERKETTUNG VON FINALIZER-METHODEN keine automatische Verkettung von Finalizer-Methoden Im Gegensatz zu den Konstruktoren werden die Finalizer (Destruktoren) in Java nicht automatisch verkettet. Wenn in einer Klasse eine finalize()-Methode definiert wird, kann eine finalize()-Methode einer Oberklasse überschrieben werden. Wenn nun die Unterklasse die finalize()-Methode © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 53 4 Objekte und Klassen der Oberklasse nie aufruft, kann es vorkommen, dass dessen Ressourcen nicht wie gewünscht freigegeben werden. Um dies zu verhindern, sollte sichergestellt werden, dass die finalize()-Methode der Oberklasse aufgerufen wird. Deshalb sollte als letzte Anweisung einer finalize()-Methode immer die finalize()-Methode der Oberklasse aufgerufen werde: super.finalize(); 4.8 Geheimhaltung und Datenkapselung Klassen verbergen Daten gegen aussen Wie wir bereits festgestellt haben, ist eine Klasse eine Sammlung von Daten und Methoden. Ein wichtiger Punkt der objektorientierten Technik ist das Verbergen der Daten gegen aussen, sodass sie nur durch die Methoden sichtbar werden. Diese Technik wird Datenkapselung genannt. Ein wichtiger Grund dafür, besteht darin, dass die Daten so vor unkontrolliertem Zugriff und Manipulationen geschützt werden können. 4.8.1 SICHTBARKEIT VON DATEN, METHODEN, KLASSEN Modifier regeln Sichtbarkeit und Zugriffe Mit einem sogenannten Modifier lässt sich spezifizieren, welche Klassen, Methoden und Variablen für andere sichtbar sind: public: Die Klasse ist von überall sichtbar. Die Methode und Variablen sind überall sichtbar, wo auch die Klasse sichtbar ist. protected: Die Methoden und Variablen sind durch das ganze Package einer Klasse hindurch sichtbar. Eine Klasse kann nicht protected sein. Eine Unterklasse eines anderen Packages als die Oberklasse kann auf die Felder zugreifen nicht aber auf die Felder der Oberklasse. default: Wenn kein Modifier spezifiziert wird, sind die Klassen, Interfaces, Methoden und Variabeln nur innerhalb des Packages überall sichtbar. private protected: Die Methoden und Variablen sind nur innerhalb der eigenen Klasse und in ih- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 54 4 Objekte und Klassen ren Unterklassen sichtbar. Klassen können nicht private protected sein. Eine Unterklasse kann auf die Felder durch die Instanz zugreifen aber nicht auf die Instanzen einer Oberklasse. privat: Methoden und Variablen sind nur innerhalb der eigenen Klasse sichtbar. Klassen können nicht private sein. 4.8.2 DATENZUGRIFF DER METHODEN Die folgende Tabelle zeigt, in welchen Fällen auf die Felder zugegriffen werden kann bzw. weitervererbt werden können. Situation Zugriff auf fremde Klassen desselben Packages Zugriff auf Unterklassen desselben Packages Zugriff auf fremde Klassen fremder Packages Zugriff auf Unterklassen desselben Packages Vererbte Unterklassen desselben Packages Vererbte Unterklassen fremder Packages public default protected private ja private protected nein ja ja ja ja ja nein nein ja nein nein nein nein ja nein nein nein nein ja ja ja ja nein ja nein ja ja nein nein Sichtbarkeit von Objekten3 4.9 Abstrakte Klassen und Interfaces abstrakte Klassen dienen als Basisklassen In Klassenhierarchien ist es möglich, dass die Erzeugung von Instanzen einer Basisklasse ausgeschlossen werden soll, da mit ihr nur ein Konzept festgelegt wird, dessen verschiedene Ausprägungen in der abgeleiteten Klassen spezifiziert werden müssen. Diesen Effekt erzielt man, indem die Basisklasse als abstrakt definiert wird. Eine abstrakte Klasse kann nur als Basisklasse einer anderen Klasse verwendet werden. Die abstrakte Klasse kann nicht zur Instanzierung von Objekten herangezogen werden. 4.9.1 ABSTRAKTE METHODEN abstrakte Methoden enthalten keinen Code Java ermöglicht die Definition von Methoden ohne Implementierungscode, indem die Methode als abstract 3 [Nutshell], Seite 179 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 55 4 Objekte und Klassen definiert wird. In C++ kennt man diese Methode als „pure virtual function“. Abstrakte Klassen weisen ein paar besondere Eigenschaften auf: - Eine Klasse mit einer abstrakten Methode gilt automatisch selber als abstrakt. - Eine abstrakte Klasse kann nicht instanziert werden. - Eine Unterklasse einer abstrakten Klasse kann instanziert werden, wenn sie jede abstrakte Methode seiner Oberklasse überschreibt und selber für deren Implementierung sorgt. - Wenn die Unterklasse einer abstrakten Klasse nicht alle geerbten abstrakten Methoden implementiert, ist die Unterklasse selber abstrakt. 4.9.2 INTERFACES Ein Interface sieht aus wie eine abstrakte Klasse, abgesehen davon, dass das Schlüsselwort interface anstelle der Schlüsselworte abstract und class erscheint. public interface Drawable { public void setColor(Color c); public void setPosition(double x, double y); public void draw(DrawWindow dw); } in einem Interface sind alle Methoden abstrakt Während eine abstrakte Klasse einige abstrakte Methoden und auch nicht-abstrakte Methoden haben kann, sind bei einem Interface alle Methoden implizit als abstrakt zu betrachten. Ausserdem müssen alle in einem Interface deklarierten Variablen static und final sein; dies bedeutet sie müssen konstant sein. 4.9.3 MEHRFACHE INTERFACES Ersatz für Mehrfachvererbung Da Java die Mehrfachvererbung nicht erlaubt, bietet die Möglichkeit von mehrfachen Interfaces eine willkommene Gelegenheit, einige Vorteile davon zu verwenden. Die Implementation mehrerer Interfaces erfolgt einfach durch komma-separierte Aufzählung der Interfaces in der Deklaration der Klasse. 4.9.4 KONSTANTEN UND INTERFACES Wie bereits erwähnt müssen sämtliche Variablen in einem Interface Konstanten sein. Wenn nun eine Klasse dieses Interface implementiert, so erbt es auch dessen Konstanten und kann diese direkt ansprechen ohne den Klassennamen zu nennen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 4 Objekte und Klassen 56 Falls durch mehrere Klassen innerhalb eines Packages viele Konstanten benötigt werden, kann man diese Tatsache nutzen. Es lässt sich z.B. ein Interface mit allen Konstanten definieren und dieses Interface in den entsprechenden Klassen einführen. Damit liessen sich alle Konstanten ohne Nennung des Klassennamens direkt ansprechen. 4.9.5 VERERBUNG (ERWEITERUNG) VON INTERFACES „Mehrfachvererbung“ bei Interfaces Interfaces können Unter-Interfaces haben wie das Klassen auch können. Ein Unter-Interface erbt alle abstrakten Methoden und Konstanten seines Ober-Interfaces und kann neue abstrakte Methoden und Konstanten definieren. Ein Interface unterscheidet sich in einem wichtigen Punkt von den Klassen: ein Interface kann mehr als ein Interface gleichzeitig erweitern. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 57 5 Programmierung 5 Programmierung Dieses Kapitel soll anhand von Beispielen die Programmierung mit Java etwas genauer durchleuchten, um die Theorie vielleicht etwas verständlicher zu machen. 5.1 Applets Dieses Kapitel führt vom trivialen „Hello World“-Applet zu komplexeren Applets und zeigt den Einsatz von Graphik, den Umgang mit Benutzereingaben, das Lesen und Verarbeiten von Applet-Parametern, den Umgang mit Buttons, das Erzeugen von Threads sowie das Abspielen von Audio-Clips. 5.1.1 EINFÜHRUNG IN APPLETS Applet durchläuft vier Zyklen Ein Applet durchläuft vom Zeitpunkt, an dem es geladen wird, bis zu dem, an welchem kein Zugriff mehr möglich ist und vom System zurückgegeben wird, verschiedene Zyklen. Start Applet wird geladen Initialisierung Besuch der Seite Verlassen einer Seite Zerstörung Ablegen der Seite Stop Der Applet-Zyklus init(): wird einmal aufgerufen, wenn ein Applet in das System geladen wird. Die beste Stelle, um eventuell notwendige Initialisierungen vorzunehmen. start(): wird aufgerufen, um das Applet darüber zu informieren, dass es nun loslaufen soll. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 5 Programmierung 58 Applets, die Threads für Animationen benutzen, würden jetzt also die Threads starten. Diese Methode wird nach init() und bei jedem neuen Besuch des Applets in einer Web-Seite aufgerufen. stop(): wird aufgerufen, damit das Applet weiss, dass es mit seiner Durchführung aufhören soll. Bei Applets, die Threads benutzen, sollten die Thread mit dieser Methode gestoppt werden. Sie wird vor allem dann aufgerufen, wenn die Web-Seite, die das Applet enthält, durch eine andere Seite ersetzt wird. destroy(): wird aufgerufen, damit das Applet weiss, dass es vom System zurückgegeben wird und alle Ressourcen freigeben bzw. zerstören soll, die es zugewiesen hat. Applets, die Threads benutzen, zerstören die Threads in dieser Methode. Vor destroy() wird stets stop() aufgerufen. 5.1.2 DAS ERSTE APPLET Das folgende Beispiel zeigt das wohl einfachste Applet in Java. Dieses Beispiel benutzt die paint()-Methode und erzeugt als graphische Ausgabe einen Text („Hello World“). import java.applet.*;4 import java.awt.*; public class FirstApplet extends Applet { public void paint(Graphics g) { g.drawString("Hello World", 25, 50); } } Das Applet kann nach der Kompilierung (javac FirstApplet.java) mit einem Web-Browser oder dem Applet Viewer betrachtet werden. 5.1.3 ZEICHNEN VON GRAPHIKEN Wenn man das vorherige Beispiel mit Objekten des Typs Font und Color ergänzt, wird die Darstellung etwas auffälliger. Zudem wird die init()-Methode eingeführt, welche eine einmalige Initialisierung vornimmt (beim erstmaligen Erzeugen des Applets). 4 [Nutshell], Seite 87 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 59 5 Programmierung import java.applet.*; import java.awt.*; public class SecondApplet extends Applet { static final String message = "Hello World"; private Font font; // einmalige Initialisierung public void init() { font = new Font("Helvetica", Font.BOLD, 48); } public void paint(Graphics g) { // Die graphischen Elemente g.setColor(Color.pink); g.fillOval(10, 10, 330, 100); g.setColor(Color.red); g.drawOval(10,10, 330, 100); g.drawOval(9, 9, 332, 102); g.drawOval(8, 8, 334, 104); g.drawOval(7, 7, 336, 106); // Der Text g.setColor(Color.black); g.setFont(font); g.drawString(message, 40, 75); } } 5.1.4 BEHANDLUNG VON EREIGNISSEN Benutzer-Interaktionen erzeugen Ereignisse Die meisten Programme kommen kaum ohne BenutzerInteraktionen aus; d.h. es müssen Eingaben empfangen und verarbeitet werden. Im folgenden Beispiel werden die Methoden mouseDown() und mouseDrag() verwendet, um ein einfaches Zeichnen von Linien mit der Maus zu ermöglichen. import java.applet.*;5 import java.awt.*; public class Scribble extends Applet { private int last_x = 0; private int last_y = 0; // wird aufgerufen bei Mausklick public boolean mouseDown(Event e, int x, int y) { last_x = x; last_y = y; return true; } // wird aufgerufen bei fahren mit gedrückter Maustaste public boolean mouseDrag(Event e, int x, int y) { Graphics g = getGraphics(); g.drawLine(last_x, last_y, x, y); last_x = x; 5 [Nutshell], Seite 89 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 60 5 Programmierung last_y = y; return true; } } 5.1.5 DER EVENT-HANDLER globale Methode handleEvent() verarbeitet alle Ereignisse Die Standardmethoden zur Handhabung von Ereignissen werden eigentlich von einer globalen Methode namens handleEvent() aufgerufen. Dies handleEvent()-Methode spiegelt die Art wider, in der das Abstract Window Toolkit (AWT) im allgemeinen mit Ereignissen umgeht, die zwischen Anwendungskomponenten und Ereignissen aufgrund von Benutzereingaben stattfinden. In der Standardmethode handleEvent() werden Ereignisse verarbeitet und die entsprechenden Methoden aufgerufen. Um die Standardereignisse zu ändern oder eigene Ereignisse zu definieren und weiterzugeben, müssen die handleEvent überschrieben werden. Um spezifische Ereignisse zu testen, muss die ID-Instanzvariable geprüft werden. Die Ereignis-ID ist eine Ganzzahl. Die Event-Klasse definiert eine ganze Reihe von EreignisIDs als Klassenvariablen, die im Körper von handleEvent getestet werden können. Da diese Klassenvariablen ganzzahlige Konstanten sind, eignet sich die switch-Anweisung dafür besonders gut. Wenn die handleEvent()-Methode überschrieben worden ist, werden keine der Standardmethoden mehr automatisch aufgerufen. Sie müssen explizit im Körper von handleEvent aufgerufen werden. Es besteht natürlich auch die Möglichkeit, mit super.handleEvent() die Methode der Oberklasse aufzurufen, damit diese das Ereignis behandeln kann. 5.1.6 LESEN VON APPLET-PARAMETERN Parameter machen Applets konfigurierbar Um Applets konfigurierbar zu machen, werden die Applet-Parameter benötigt, welche auf der Web-Seite als HTML-Fragment (gleich nach dem Aufruf des Applets) spezifiziert werden. <APPLET code="ColorScribble.class" width=300 height=300> <PARAM name="foreground" value="0000FF"> <PARAM name="background" value="FFCCCC"> </APPLET> Diese Parameter werden von der init()-Methode gelesen und verarbeitet; ausserdem sollte in der init()-Methode kontrolliert werden, ob solche Parameter definiert wurden und gegebenenfalls eigene Default-Werte verwenden. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 61 5 Programmierung 5.1.7 EINFÜGEN VON SCHALTFLÄCHEN Im folgenden Beispiel wird eine Schaltfläche zum Löschen des gezeichneten Bildes eingefügt. In der init()-Methode wird ein neuer Button erzeugt, dessen Vorder- und Hintergrundfarben definiert (unterschiedlich zum Hintergrund der Zeichenfläche) und mit der add()-Methode dem Applet beigefügt. import java.applet.*;6 import java.awt.*; public class ClearableScribble extends ColorScribble { private Button clear_button; public void init() { // Initialisierung von ColorScribble super.init(); // erzeugt einen Button. clear_button = new Button("Clear"); clear_button.setForeground(Color.black); clear_button.setBackground(Color.lightGray); this.add(clear_button); } public boolean action(Event event, Object arg) { // Click auf Button ? // Falls nein: => Oberklasse if (event.target == clear_button) { Graphics g = this.getGraphics(); Rectangle r = this.bounds(); g.setColor(this.getBackground()); g.fillRect(r.x, r.y, r.width, r.height); g.setColor(this.getForeground()); return true; } else return super.action(event, arg); } } Bei einem Mausklick wird immer zuerst geprüft, ob dieser dem entsprechenden Schaltknopf gilt; ist dies der Fall, so wird die action()-Methode der Klasse aufgerufen. Andernfalls wird das Ereignis an die Oberklasse weitergegeben und dort (falls vorhanden) die action()-Methode aufgerufen. 5.1.8 IMAGEMAP (BILDERKARTE) Bildkarte mit aktiven Bereichen Als Imagemap bezeichnet man ein Bild mit spezifizierten Regionen, die auf Mausklicks in diese Regionen reagieren kann. 6 [Nutshell], Seite 94f © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 62 5 Programmierung In der init()-Methode werden sowohl die Bilddatei wie auch die gewünschten rechteckigen Regionen eingelesen bzw. spezifiziert. Die mouseDown()-Methode stellt fest, wenn die Maustaste gedrückt wird. Falls dies innerhalb eines definierten Rechteckes geschieht, wird dieses Rechteck optisch hervorgehoben. Die mouseUp()-Methode erkennt anschliessend das Loslassen der Maustaste. Geschieht dies innerhalb desselben Rechteckes, so wird dies als korrekter Mausklick interpretiert und entsprechend weiterverarbeitet. 5.1.9 ANIMATIONEN rasche Abfolge von Standbildern Die Grundidee hinter der Animation besteht darin, Standbilder, die sehr ähnlich aussehen, sich aber doch geringfügig voneinander unterscheiden, in rascher Folge anzuzeigen, sodass eine Illusion von Bewegung entsteht. Die Geschwindigkeit, mit der die Bilder präsentiert werden, bezeichnet man als Frame-Rate (Bildwiederholgeschwindigkeit). Der Pseudo-Code für eine Animation sieht folgendermassen aus: while (moreFramesToPaint) { paintCurrentFrame(); sleep for some time; // bestimmt die Frame-Rate advanceToNextFrame(); } Die start()-Methode erzeugt einen Thread für diese Animation und startet anschliessend diesen Thread. 5.1.10 SOUND Java unterstützt das Abspielen von Sound eigenständig oder in Verbindung mit laufenden Animationen. Die Unterstützung von Sound ist wie die von Bildern in den Applet- und awt-Klassen integriert, sodass die Verwendung ebenso einfach ist wie das Laden und Anzeigen von Bildern. In der derzeitigen Version unterstützt Java für Sound nur das AU-Format von SUN. Die einfachste Art, Sound abzurufen und abzuspielen bietet die play()-Methode der Applet-Klasse. Die play()-Methode ist vergleichbar mit getImage. 5.2 Graphical User Interface (GUI) AWT definiert allgemeine Merkmale eines GUI Das Abstract Window Toolkit (AWT) ist ein GUI-Toolkit, das plattformübergreifend arbeitet. Es beinhaltet nicht alle Merkmale einer bestimmten Plattform, sondern hat eine allgemeine Reihe von Merkmalen, die von den meisten © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 63 5 Programmierung Plattformen unterstützt werden. Das AWT ist erweiterungsfähig, kann also mit zusätzlichen Merkmalen ausgestattet werden. Man kann also seine eigenen GUI-Controls in Java erstellen und sicher sein, dass sie auf allen Plattformen laufen werden. Folgende Abbildung zeigt die Hierarchie der wichtigsten AWT-Klassen. Die wichtigsten AWT-Klassen 5.2.1 DIE WICHTIGSTEN KLASSEN Die wichtigsten Klassen des Abstract Window Toolkit (AWT) sind: Component: Abstrakte globale Klasse aller Elemente der Benutzeroberfläche Container: Abstrakte Eigenschaften für ein Element, das andere Elemente oder Container enthält. Basisklasse aller Komponenten. Window: Fenster auf der obersten Ebene der Benutzeroberfläche und Superklasse der Klassen Frame und Dialog. Frame: Fenster mit Titel auf der obersten Ebene der Benutzeroberfläche. Dialog: Dialogfeld für die Benutzeroberfläche. FileDialog: Dialogfeld für Dateioperationen der Benutzeroberfläche. Panel: Anzeigbarer Container. Button: Schaltfläche für die Benutzeroberfläche. Canvas: Zeichenbereich für die Benutzeroberfläche. Checkbox: Kontrollfeld Label: Beschriftung für Elemente der Benutzeroberfläche. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 64 5 Programmierung List: Listenfeld für die Benutzeroberfläche. Scrollbar: Bildlaufleisten-Objekt für die Benutzeroberfläche. TextArea: Mehrzeiliger editierbarer Textbereich, der gescrollt werden kann. Textfield: Editierbares Textfeld mit fester Grösse. 5.2.2 DIE KLASSE EVENT die Event-Klasse beschreibt das Ereignis Sobald eine Komponente ein Ereignis verarbeiten muss, wird es vom AWT an die Komponente geliefert. Die Klasse Event besitzt Informationen, die das Ereignis beschreiben. Falls die betreffende Komponente das Ereignis nicht bearbeitet, wird es an den Container weitergegeben, der die Komponente enthält. Das ermöglicht es den Containern, alle Ereignisse zu bearbeiten, die die von ihnen abgeleiteten Klassen nicht bearbeiten wollen. 5.2.3 DIE KLASSE COMPONENT Die Component-Klasse stellt die wohl wichtigste Klasse des AWT dar und stellt einige wichtige Methoden zur Verfügung: Dimension size() Gibt Breite und Höhe der Komponente als Objekt der Klasse Dimension zurück. Rectangle bounds() Gibt Koordinaten der Komponente zurück. void enable() Macht die Komponente für Benutzereingaben empfänglich. void disable() Macht die Komponente für Benutzereingaben unempfänglich. void show() Zeigt die Komponente. void paint(Graphics g) Wird vom AWT aufgerufen, wenn die Komponente neu gezeichnet werden muss. void repaint() Aufforderung an AWT, die Komponente neu zu zeichnen. void update(Graphics g) Wird vom AWT aufgerufen, wenn es die repaint()-Methode aufgerufen hat. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 65 5 Programmierung boolean mouseEnter (Event e, int x, int y) Wird aufgerufen, wenn die Maus sich in den Bereich der Komponente bewegt. boolean mouseExit (Event e, int x, int y) Wird aufgerufen, wenn die Maus den Bereich der Komponente verlässt. boolean mouseMove (Event e, int x, int y) Wird aufgerufen, wenn die Maus sich innerhalb der Komponente bewegt. boolean mouseDrag (Event e, int x, int y) Wird aufgerufen, wenn die Maus sich mit gedrückter Maustaste bewegt. boolean keyDown (Event e, int key) Wird aufgerufen, wenn die Maustaste innerhalb der Komponente gedrückt wird. boolean handleEvent (Event e) Fängt alle Ereignisse der Komponente ab. Dimension preferredSize() Gibt die Dimension zurück, die diese Komponente gern hätte. Dimension minimumSize() Gibt die Mindestgrösse zurück, die diese Komponente haben kann. 5.2.4 DIE KLASSE CONTAINER Innerhalb der Component-Klasse ist es vor allem die Container-Klasse, welche sehr interessante Methoden zur Verfügung stellt: void add(Component c): Fügt dem Container eine Komponente hinzu void add(String name, Component c): Fügt die Komponente hinzu und verbindet den gegebenen Namen mit ihr. Manche Layout-Manager benutzen diesen Namen, um Layout-Entscheidungen zu treffen. void setLayout(LayoutManager I): Layout-Manager beschreibt Anordnung der Komponenten Setzt den Layout-Manager für die betreffende Komponente. Er ist ein Objekt, das für die Anordnung der Komponenten im Container verantwortlich ist. Der Vorteil dieser Lösung gegenüber einer expliziten Positionierung der Komponenten liegt darin, dass sie in einer, dass sie in einer Multiplattform-Umgebung funktioniert und dass der Lay- © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 66 5 Programmierung out-manager auch dann weiss, was zu tun ist, wenn die Grösse des Containers geändert wird. 5.3 Eingabe und Ausgabe Ein- und Ausgabe als Datenströme In diesem Kapitel geht es um Ein- und Ausgabeströme, wie diese erstellt und benutzt werden sowie ihr Ende erkannt werden kann. Alle in diesem Kapitel diskutierten Klassen und Methoden sind Bestandteil des java.ioPackages. 5.3.1 LESEN UND ANZEIGEN VON FILES Um einen Eingabestrom von einer Datei zu lesen, stellt Java die FileInputStream-Klasse zur Verfügung. Die allgemeinste Methode dieser Klasse zum Lesen von Eingabeströmen ist die read()-Methode. Für die Anzeige des Files bietet Javas Abstract Window Toolkit (AWT) mehrere Möglichkeiten; z.B. die TextAreaKlasse erlaubt es, Text auf dem Bildschirm anzuzeigen. 5.3.2 BESCHAFFUNG VON DATEI-INFORMATION Mit Hilfe des FilenameFilter-Interfaces, welches vom FileDialog-Objekt und der File.list()-Methode benutzt wird, lassen sich Files und Directories anzeigen. Die java.io.FileKlasse stellt zudem verschiedene Methoden wie canWrite(), canRead(), isFile(), isDirectory(), length(), lastModified() etc. zur Verfügung, um nähere Informationen über die Files zu erhalten. 5.3.3 KOPIEREN EINES FILES Kopieren bedeutet Lesen und Schreiben von Quell- zu Zieldatei Die beiden Klassen FileInputStream und FileOutputStream ermöglichen das Lesen von einer Quelldatei und das Schreiben in eine Zieldatei. Vor dem eigentlichen Kopieren sollte aber mit Hilfe der File-Klasse kontrolliert werden, ob die Zieldatei bereits existiert. 5.3.4 FILTERN VON EINGABEN Mit Hilfe der FilterInputStream-Klasse sowie der DataInputStream-Klasse lässt sich auf einfache Art und Weise ein Filter definieren. Damit lässt sich dank der readLine()-Methode ein Eingabestrom zeilenweise einlesen und diejenigen Zeilen rausfiltern, die z.B. einen entsprechenden Suchstring enthalten. import java.io.*;7 // Diese Klasse ist ein Filter, der alle Linien herausfiltert, welche 7 [Nutshell], Seite 133f © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 67 5 Programmierung // den spezifizierten Suchstring (substring) nicht enthalten.. public class GrepInputStream extends FilterInputStream { String substring; DataInputStream in; public GrepInputStream(DataInputStream in, String substring) { super(in); this.in = in; this.substring = substring; } // Dies ist der Filter: er liest vom DataInputStream, // aber er gibt nur Zeilen zurück, welche den Suchstring enthalten. public final String readLine() throws IOException { String line; do { line = in.readLine(); } while ((line != null) && line.indexOf(substring) == -1); return line; } } 5.3.5 PIPES Pipe entspricht zwei separaten Threads mit Datenströmen Auch Pipes lassen sich durch zwei separate Threads, welche die Klasse PipedOutputStream bzw. PipedInputStream benutzen, relativ einfach realisieren. Diese Pipes lassen sich natürlich auch mit verschiedenen Filtern kombinieren und ausbauen. 5.4 Networking In diesem Kapitel soll besprochen werden wie URL-Klassen benutzt werden, um URL-Verbindungen herzustellen. Im weiteren soll gezeigt werden, wie Server mit Client via Netz kommunizieren und Datenpakete senden bzw. empfangen können. 5.4.1 HERUNTERLADEN VON URL-INHALTEN einfache Schnittstelle zum Netzwerk Die URL-Klasse repräsentiert eine Internet Universe Resource Locator, d.h. eine Adressenstruktur, welche den Standort eines Objektes im Netz genau definiert. Sie sorgt für eine einfache Schnittstelle zum Netzwerk, um durch ihre URL referenzierte Objekte herunterzuladen bzw. Datenströme zu öffnen und von diesen zu lesen oder in diese zu schreiben. Die einfachste Art, Daten einer URL von einer spezifizierten WWW-Adresse herunterzuladen, bietet die getContent()Methode. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 68 5 Programmierung 5.4.2 BENUTZUNG EINER URL-VERBINDUNG Dank der URLConnection-Klasse kann eine wesentlich grössere Kontrolle über das Herunterladen von URL-Inhalten erreicht werden. Die Methoden dieser Klasse ermöglichen es zudem, Informationen über die Grösse, den Typ, das Datum der letzten Änderung usw. von URL-Verbindungen zu erhalten. Ausserdem können mit Hilfe der DataInputStream-Klasse Textinhalte dieser Verbindung zeilenweise gelesen werden. 5.4.3 SENDEN UND EMPFANGEN VON DATENPAKETEN Versand und Empfang von Datenpaketen ohne Kontrollmechanismen Das folgende Beispiel zeigt die Implementierung einer einfachen Netzwerk-Kommunikation mit Datenpaketen. Da bei dieser Art der Kommunikation keine Kontrollmechanismen integriert sind, eignet sich sich nur für unkritische Daten. Um Daten senden und empfangen zu können, werden die Klassen DatagramPacket und DatagramSocket benötigt. Die Objekte werden auf unterschiedliche Art erzeugt und initialisiert, je nachdem ob sie Daten empfangen oder senden sollen: 5.4.3.1 Senden von Datenpaketen Um ein Datenpaket zu senden, muss zuerst ein DatagramPacket-Objekt erzeugt werden, welches die zu sendenden Daten, die Länge der Daten sowie den Port des Hosts, der die Daten empfangen soll, spezifiziert. Anschliessend kann die send()-Methode der DatagramSocketKlasse benutzt werden, um das Datenpaket zu senden. import java.io.*;8 import java.net.*; // Diese Klasse sendet den spezifizierten Text als Datenpaket zum Port // 6010 des spezifizierten Hosts. public class UDPSend { static final int port = 6010; public static void main(String args[]) throws Exception { if (args.length != 2) { System.out.println("Usage: java UDPSend <hostname> <message>"); System.exit(0); } // gibt die Internet-Addresse des spezifizierten Hosts InetAddress address = InetAddress.getByName(args[0]); 8 [Nutshell], Seite 144 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 5 Programmierung 69 // konvertiert die Meldung zu einem Array von Bytes int msglen = args[1].length(); byte[] message = new byte[msglen]; args[1].getBytes(0, msglen, message, 0); // initialisiert das Datenpaket mit Daten und Adresse DatagramPacket packet = new DatagramPacket(message, msglen, address, port); // erzeugt ein Socket und sendet das Datenpaket. DatagramSocket socket = new DatagramSocket(); socket.send(packet); } } 5.4.3.2 Empfangen von Datenpaketen Um Daten empfangen zu können, muss als erstes ein DatagramSocket-Objekt erzeugt werden, welches auf einem einzelnen Port des lokalen Hosts hört. Dieses Objekt kann nur jene Daten empfangen, die an diesen einzelnen Port gesandt werden. Als zweites muss ein DatagramPacket-Objekt erzeugt werden, welches einen Buffer für den Empfang der Daten definiert. Schliesslich braucht es noch die receive()-Methode, welche die Daten blockiert bis sie empfangen und im Buffer gespeichert werden können. Die InternetAdresse und Port-Nummer des Senders werden ebenfalls im Datenpaket gespeichert. 5.4.4 IMPLEMETIERUNG EINES SERVERS zuverlässige Kommunikation via Sockets Die Socket-Klasse, welche eine „feste“ Verbindung für Datenströme über das Netzwerk erlaubt, ist eine viel zuverlässigere Kommunikation als jene mit Datenpaketen. Ein gemeinsames Modell der Kommunikation ermöglicht es, von einem einzigen Server-Programm Daten an einen oder mehrere Clients zu schicken. Das Server-Programm benutzt die ServerSocket-Klasse, um Verbindungen von Clients zu akzeptieren. Wenn ein Client eine Verbindung zu einem Port herstellt, auf welchen das ServerSocket-Objekt hört, wird ein neues ServerSocket- alloziert für die Kommunikation mit dem Client. Danach kann der Server weiter auf den Ports hören, um zusätzliche Client-Verbindungen aufzubauen. Dieses Server-Programm muss multithreaded sein, um effektiv arbeiten zu können. Während das Server-Objekt ein eigener Thread ist, welcher in einer Schleife auf die Ports für Verbindungen von Clients hört, wird für jede ClientVerbindung von der ServerSocket-Klasse ein neuer Thread erzeugt. Das neue Objekt übernimmt die gesamte Kommunikation mit dem Client und seine Konstruktor-Methode © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 5 Programmierung 70 übernimmt die Initialisierung der Datenströme durch das Socket-Objekt und startet den Thread. 5.4.5 IMPLEMETIERUNG EINES CLIENTS Client kennt nur einen Server Der Client erzeugt ein Socket-Objekt, um die Verbindung zum Server herzustellen. Danach wird ein DataInputStream-Objekt erzeugt, welches das zeilenweise Lesen des Textes vom InputStream-Socket und Schreiben auf den OutputStream-Socket ermöglicht. Schliesslich werden Zeilen vom Standard-Input gelesen und zum Server geschrieben sowie die Antwort vom Server gelesen und auf den Standard-Output geschrieben. Der Client existiert bis er auf dem Eingabestrom des Sockets oder auf dem Standard-Input ein „end-of-file“ erhält. 5.5 Kommunikation zwischen Applets drei Arten der Kommunikation Ein Applet kann mit anderen Programmen auf drei Arten kommunizieren: - durch aufrufen von public-Methoden anderer Applets auf der selben Seite. - durch benutzen des java.applet-Packages, welches eine beschränkte Kommunikation mit dem Browser oder Applet Viewer ermöglicht, der das Applet enthält. - durch benutzen des java.net-Packages, um über das Netzwerk mit anderen Programmen zu kommunizieren. Das andere Programm muss aber auf dem selben Host laufen, von welchem das Applet heruntergeladen wurde. 5.5.1 APPLETS AUF DER SELBEN SEITE Mitteilungen von Applet zu Applet Applets können andere Applets finden und ihnen Mitteilungen senden. Dies unterliegt allerdings den folgenden Einschränkungen: - die Applets müssen auf der selben Web-Seite und im selben Browser-Fenster laufen. - einige Applet Viewer erfordern, dass die Applets vom selben Server stammen. Ein Applet kann ein anderes Applet entweder durch seinen Namen (getApplet()-Methode) oder durch finden aller Applets dieser Seite (getApplets()-Methode) aufspüren. Um eine einfache Kommunikation zu ermöglichen, werden die zwei Objekte Sender und Empfänger benötigt, © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 71 5 Programmierung damit Mitteilungen gesendet bzw. empfangen werden können. 5.5.2 KOMMUNIKATION MIT DEM BROWSER Informationen vom Browser Einige der java.applet.Applet- und java.applet. AppletContext-Methoden rufen verschiedene Arten der Kommunikation mit dem Browser oder Applet Viewer auf. Die Methoden getDocumentBase() und getCodeBase() geben Informationen vom Browser (oder Applet Viewer) über die Herkunft des Applets und seine HTML-Seite zurück. Andere Methoden ermöglichen das Abrufen von Informationen über die Applet-Parameter, den Applet-Status und anderes. 5.5.3 ARBEITEN MIT SERVER-APPLIKATIONEN Kommunikation mit Server Java-Applets benutzen das java.net-Package zur Kommunikation über das Netzwerk. Die einzige Einschränkung aus Sicherheitsgründen besteht darin, dass der einzige Host, mit welchem ein Applet kommunizieren kann derjenige ist, von welchem das Applet heruntergeladen wurde. Es lässt sich einfach herausfinden, von welchem Host ein Applet herkommt: String host = getCodeBase().getHost(); Für die Implementierung eines Servers siehe Kapitel 5.4.4 Implemetierung eines Servers. 5.5.4 UMGEHEN DER EINSCHRÄNKUNGEN Server-Applikation umgeht Einschränkungen Wie in Kapitel „5.5.5 Möglichkeiten und Einschränkungen“ erläutert wird, sind die Applets aus Sicherheitsgründen einigen Einschränkungen unterworfen. Ein Weg, diese Einschränkungen zu umgehen, besteht darin, eine Server-Applikation zu benutzen, welche auf dem Host des Applets ausgeführt wird. Der Server kann zwar nicht alle Einschränkungen umgehen, aber er schafft einige zusätzliche Möglichkeiten: z.B. kann der Server zwar keine Daten auf dem Host speichern, auf welchem das Applet läuft, aber er kann auf dem Host, von welchem das Applet herkommt, Dateien speichern. Dies erlaubt es, dass zwei Applets, die sich auf verschiedenen Seiten befinden und auf verschiedenen Rechnern ausgeführt werden, durch den Server miteinander kommunizieren können. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 72 5 Programmierung 5.5.5 MÖGLICHKEITEN UND EINSCHRÄNKUNGEN Einschränkungen Eines der Hauptziele bei der Entwicklung von Java war eine grösstmögliche Sicherheit beim Ausführen von Applets zu gewährleisten. Um dies zu erreichen, waren einige Einschränkungen erforderlich: - ein Applet kann keine Bibliotheken mit nativen Methoden laden oder definieren - ein Applet kann normalerweise auf dem Host, auf welchem es läuft, keine Dateien lesen oder schreiben - ein Applet kann keine Netzwerkverbindungen herstellen ausser zu dem Host, wo es herkommt - ein Applet kann auf dem Host, auf welchem es läuft, kein Programm starten - ein Applet kann keine System-Eigenschaften lesen Möglichkeiten Andererseits bieten Applets aber auch Möglichkeiten, die Java-Anwendungen nicht haben: - Applets können Sound abspielen (siehe Kapitel 5.1.10 Sound) - Applets, die in einem Web-Browser ablaufen, können auf einfache Art HTML-Dokumente anzeigen (siehe Kapitel 5.5.2 Kommunikation mit dem Browser) - Applets können auf public-Methoden anderer Applets auf der selben Seite aufrufen (siehe Kapitel 5.5.1 Applets auf der selben Seite) Besonderheiten Es gibt noch zwei weitere Besonderheiten für Applets, welche bis jetzt unerwähnt blieben: - ein vom lokalen Filesystem geladenes Applet hat nicht die üblichen Einschränkungen wie ein über das Netzwerk geladenes Applet - obwohl die meisten Applets ihre Ausführung beim Verlassen einer Seite stoppen, ist dies nicht unbedingt erforderlich © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 73 A Java Development Kit (JDK) A Java Development Kit (JDK) Das Java Development Kit (JDK) ist eine Sammlung von Tools, die für die Erstellung von Java-Programmen benötigt werden. Das von SUN Microsystems entwickelte JDK ist zur Zeit für folgende Plattformen verfügbar: SPARC Solaris, x86 Sorais, Windows 95, Windows NT, MacOS. Im folgenden sollen die Tools in knapper Form beschrieben werden. Für ausführliche Informationen mit Syntax und Beschreibung der Optionen empfehle ich die WebSeite von SUN (http://java.sun.com/products/JDK/). A.1 Der Applet Viewer (appletviewer) Der Applet Viewer ermöglicht es, Applets ausserhalb eines Web-Browsers laufen zu lassen. Mit dem Applet Viewer lassen sich auch Verbindungen via URL zu Dokumenten und Ressourcen herstellen, damit deren Applets angezeigt werden. A.2 Der Interpreter (java) Damit lassen sich Bytecodes ausführen, die vom JavaCompiler (javac) erzeugt worden sind. Der Interpreter erwartet, dass sich die Bytecodes für die Klasse in einer Datei mit dem Namen Klassenname.class befinden, die durch die Kompilierung der entsprechenden Quelldatei mit javac erzeugt worden ist. A.3 Der Compiler (javac) Der javac-Befehl kompiliert Java-Quelldateien zu JavaBytecodes. Die Bytecodes werden dann mit dem JavaInterpreter (java) interpretiert. Der Name von Dateien, die Java-Quellcode enthalten, muss mit der Extension .java enden. Der Compiler speichert für jede in den an javac weitergegebenen Quelldateien definierte Klasse die resultierenden Bytecodes in einer Datei mit dem Name Klassenname.class. A.4 Der Dokument-Generator (javadoc) Mit diesem Tool lassen sich automatische Dokumentationen im HTML-Format erstellen. Die Informationen werden © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 74 A Java Development Kit (JDK) direkt aus dem Java-Quellcode geholt, vom speziellen Kommentar (/** etc. */). Javadoc kann als Argument der Name eines Packages oder einer oder mehreren Dateien mitgegeben werden. A.5 Native Method C File Generator (javah) Dieses Tool generiert aus einer java-Klasse Header- und Sourcefiles von C (*.h und *.c). Diese C-Files sorgen für die notwendigen Informationen für die Implementierung von sogenannten nativen Methoden der spezifizierten Klassen in C. Diese Header-Files deklarieren eine C-struct, welche Felder enthält, die mit den Instanz-Feldern der Java-Klassen korrespondieren. Das Header-File deklariert auch eine Prozedur, welche für jede der nativen Methoden, die Java-Klassen enthalten, implementiert werden muss. A.6 Class Disassembler (javap) Mit dem javap-Tool lassen sich Klassen-Dateien (*.class) wieder in lesbarer Form darstellen. Es werden alle Deklarationen von nicht-private und nicht-protected Objekten, Methoden, Konstruktoren und statischen Initialisierern in jeder der spezifizierten Klassen ausgegeben, die als Argument mitgegeben werden. A.7 Debugger (jdb) Der Java-Debugger ist Text-basiert, Kommandozeilen-orientiert und besitzt eine ähnliche Syntax wie die UNIX-Debugger (dbx und gdb). Wenn jdb mit dem Namen einer Java-Klasse aufgerufen wird, startet er eine Kopie vom Java-Interpreter (java). der jdb ist eigentlich selber ein Java-Programm, welches in seiner eigenen Kopie des Java-Interpreters läuft. Dieser neue Interpreter lädt die spezifizierte Klassendatei und stoppt für das Debugging bevor der erste Java-Bytecode ausgeführt wird. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial B Entwicklungs-Tools 75 B Entwicklungs-Tools neue Entwicklungswerkzeuge mit visueller Oberfläche Das von SUN Microsystems entwickelte JDK erlaubt mit seinen Kommandozeilen-Befehlen kein angenehmes und zeitgemässes Arbeiten. Dies haben einige Softwarehersteller natürlich erkannt und haben damit begonnen, neue Entwicklungsumgebungen für Java zu schaffen bzw. bereits bestehende C++-Entwicklungsumgebungen auf Java anzupassen. Dies führt einerseits zu einer wahren Flut von neuen Tools und zu Neuankündigungen bzw. -Erscheinungen im Wochentakt. Im folgenden sollen einige davon kurz vorgestellt werden. Diese Zusammenstellung erhebt natürlich keinerlei Anspruch auf Vollständigkeit, da dies auch gar nicht möglich ist. Eine aktuellere Übersicht lässt sich auf der WebSeite von Netscape einsehen (http://www.netscape.com/ comprod/products/navigator/version_2.0/java_applets/ java_development_tools.html). B.1 Silicon Graphics: Cosmo Code „Cosmo Code“ stellt ein ganzes Set von visuellen Tools für Java zur Verfügung um plattformunabhängige interaktive Applets, Anwendungen und Klassen zu entwickeln. Nähere Infos: http://www.sgi.com/ B.2 BulletProof: JAGG Jagg ist das erste Java-ODBC-Werkzeug auf dem Markt. Mit Jagg lassen sich einfach SQL-Befehle von einem Applet für einen Windows NT-Web-Server generieren, auf welchem eine ODBC-Datenbank läuft. Nähere Infos: http://www.bulletproof.com/ © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial B Entwicklungs-Tools 76 B.3 Kinetix: Hyperwire Hyperwire bietet einen schnellen und einfachen Weg, um interaktive 2-D und 3-D Applets in Java zu erstellen. Hyperwire erfordert keine Programmierung und bietet eine visuelle Umgebung zur Erzeugung von Applets. Nähere Infos: http://www.ktx.com/ B.4 Aimtech: Jamba Jamba ist ein visuelles Entwicklungswerkzeug, das es dem Entwickler erlaubt, Java-Applets und Anwendungen ohne grosse Programmierung zu entwickeln. Nähere Infos: http://www.aimtech.com/ B.5 Rogue Wave Software: JFactory Rogue Wave Software bietet eine komplette, visuelle Java-Entwicklungsumgebung für Win32 und Solaris an. “JFactory” besteht aus einem Applikationsdesigner, einem Codegenerator und dem Compiler. Nähere Infos: http://www.roguewave.com B.6 Thought Inc.: Nutmeg Nutmeg implementiert eine Smalltalk-ähnliche Klassenbibliothek für Java-Programme. Nähere Infos: http://www.thoughtinc.com/ B.7 Spider Technologies: NetDynamics NetDynamics ist eine Datenbank-Applikation mit visueller Entwicklungsumgebung, einem Applikations-Server und © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 77 B Entwicklungs-Tools einem skalierbaren Datenbank-Zugriff in einer robusten Architektur für rasche Zugriffszeiten. Nähere Infos: http://www.netdynamics.com/ B.8 Symantec: Symantec Café Symantec Café ist die erste visuelle Entwicklungsumgebung für Applets und Anwendungen in Java. Symantec Café integriert das JDK von SUN in seine Entwicklungsumgebung. Nähere Infos: http://www.symantec.com B.9 PowerProduction Software: WebBurst WebBurst ist ein interaktives Java-Applet für Designer von Web-Seiten ohne Programmiermöglichkeit. Nähere Infos: http://www.powerproduction.com/ B.10 Microsoft: Visual J++ Microsoft hat seine bekannte Entwicklungsumgebung Visual C++ auf Java angepasst. Nähere Infos: http://microsoft.com/visualj/ B.11 SUN Microsystems: Java Workshop Sun Microsystems stellte auf der Cebit `96 eine erste Version ihrer Java-Entwicklungsumgebung “Java Workshop” vor, die selbst in Java geschrieben wurde. Nähere Infos: http://www.sun.com/sunsoft/Developerproducts/java/index.html © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 78 B Entwicklungs-Tools B.12 Innovative Software: OEW Innovative Software bietet ihr auf Java getrimmtes OEW als ein Reverse/Forward-Engineering- und Designwerkzeug an. Nähere Infos: http://www.isg.de/OEW/JAVA/ B.13 FishNet: Kawa: Kawa stellt eine einfache visuelle Entwicklungsumgebung für Java-Programme zur Verfügung. Nähere Infos: http://www.fni.net/kawa/ B.14 PowerSoft: Optima++ PowerSoft will mit Optima++ auf den Markt. Optima++ setzt zwar weiterhin als primäre Programmiersprache C++ ein, soll aber lernen, Java-Applets zu erzeugen. B.15 Natural Intelligence: Roaster Natural Intelligence bietet für den Mac die integrierte Java-Entwicklungsumgebung Roaster an. B.16 melonSoft Berlin: ACupOfCoffee melonSoft Berlin bietet mit ACupOfCoffee den ersten kompletten GUI-Builder für das Java-Abstract-WindowToolkit (AWT) an. ACupOfCoffee ist eine Palette für den NextStep InterfaceBuilder. B.17 Borland: Latte Borland will in naher Zukunft ebenfalls eine integrierte Java-Entwicklungsumgebung anbieten. Diese soll ebenfalls © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial B Entwicklungs-Tools 79 plattformübergreifend sein (durch Entwicklung mit Java) und hofiert unter dem Codename “Latte”. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 80 C Unterschiede C++ / Java C Unterschiede C++ / Java Feature Zeiger Unicode Basis-Datentypen Boolsche Werte Felder (arrays) Zeichenketten Java C++ - char a ='ü'; a wird als 16bit Unicode gespeichert char, short, int, long, float, double nur vorzeichenbehaftete Datentypen boolean ist ein BasisDatentyp Felder sind Objekte. Zur Laufzeit wird eine Überprüfung auf korrekten Zugriff innerhalb der Dimension des Feldes durchgeführt (Bounds-checking). Zeichenketten bestehen aus 16bit Unicode-Charaktern String-Objekte für konstante Zeichenketten Stringbuf-Objekte zum Kopieren von Zeichenketten - int *a,b; a = &b; 'ö' ist 8bit Unterstützung auch von nicht vorzeichenbehafteten Datentypen Felder werden statisch alloziert und verhindern keine Zugriff außerhalb der definierten Grenzen des Feldes. int a[5]; a[10] = 10; Feld von 8bit-Charactern: char zeichenkette [10]; Aufzählungstyp enum { ... }; typedef typedef ... ; Zusammengesetzte struct a { ... Datentypen und Varianunion b { ... ten Preprozessor #define, #ifdef werden ja nicht unterstützt #include 'import ;' stellt Schnittstelja len aus anderen Objektmodulen zur Verfügung NULL null ist Schlüsselwort #define NULL '0' NULL wird durch Prepozessor im Code ersetzt // und /*...*/ Kommentare //... und /*...*/ /**... */ wird zur automatischen Dokumentation von Schnittstellen verwendet Vererbung aus mehreren class a extends b imple- class a : public b, public Klassen (multiple inheri- ments c {...} c {...} tance) Templates template Überladen von Operaclass complex { toren friend complex © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial C Unterschiede C++ / Java Linker >>> Thread-Support Heap-Verwaltung Scoping Parameterübergabe main() 81 operator+(const complex&, const complex&) ... nicht benötigt, da interessentiell vorhanden pretiert nicht vorzeichenbehaftenicht vorhanden ter bitweiser Shift nach rechts synchronized { ... } klammert kritischen Abschnitt Garbage Collection Freigabe von Speicherdurch Thread im Hinter- blöcken durch Programgrund mieren (delete) bclass::instance an main (String args[]) - main(int argc,char argv Arrays haben als Instanz- []) variable length auch die Anzahl der Elemente gespeichert Unterschiede C++ / Java © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial D Weitere Informationen 82 D Weitere Informationen D.1 Bücher Addison-Wesley ist Herausgeber der offiziellen, von Sun Microsystems autorisierten Originaldokumentationen zu Java. Die Autoren der Java-Series sind Mitglieder des JavaTeams bei Sun Microssystems, die diese Sprache entwikkelt haben. Unter ihnen sind berühmte Wissenschaftler und Experten wie James Gosling, Bill Joy und Guy Steele. Java-Serie von SUN in englisch James Gosling, Bill Joy, and Guy Steele, „The Java(tm) Language Specification“, Addison-Wesley, 1996, 720 Seiten Tim Lindholm and Frank Yellin, „The Java Virtual Machine Specification“, Addison-Wesley, 1996, 448 Seiten James Gosling, Frank Yellin, and The Java Team, „The Java Application Programming Interface - Volume 1: Core Packages“, Addison-Wesley, 1996, 544 Seiten James Gosling, Frank Yellin, and The Java Team, „The Java Application Programming Interface - Volume 2: Window Toolkit and Applets“, Addison-Wesley, 1996, 448 Seiten Ken Arnold and James Gosling, „Java Programming Language“, Addison-Wesley, 1996, 352 Seiten Java-Serie von SUN in deutsch Ken Arnold, James Gosling, „Die Programmiersprache Java“, Addison-Wesley, 1996, ca. 500 Seiten James Gosling, Bill Joy, Guy Steele, „Java - Die Sprachspezifikation“, Addison-Wesley, 1996, ca. 300 Seiten James Gosling und das Java-Team, „Java - Die Anwendungsprogrammierschnittstelle“, Addison-Wesley, 1996, ca. 700 Seiten Tim Lindholm, Frank Yellin, Bill Joy, Kathy Walrath, „Java Die Spezifikation der Virtuellen Maschine“, AddisonWesley, 1996, ca. 300 Seiten Mary Campione, Kathy Walrath, „Das Java-Tutorial: Objektorientierte Programmierung für das Internet“, AddisonWesley, 1996, ca. 800 Seiten © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial D Weitere Informationen 83 ein Muss für JavaProgrammierer David Flanagan, „Java in a Nutshell, A Desktop Quick Reference for Java Programmers“, O'Reilly, 1996, 438 Seiten weitere lesenswerte Bücher Ralf Kühnel, „Die Java-Fibel, Programmierung interaktiver Homepages für das World Wide Web“, Addison-Wesley, 1996. 224 Seiten Laura Lemay, Charles Perkins, „Teach Yourself JAVA in 21 days“, sams.net, 1996, 527 Seiten Arthur van Hoff, Sami Shaio, Orca Starbuck, „Hooked on JAVA, Creating Hot Web Sites with Java Applets“, Addison-Wesley, 1996, 181 Seiten © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 84 D Weitere Informationen John December, „JAVA, Einführung und Überblick. Verlag“, Markt & Technik, 1996, 290 Seiten aktuelle Buchliste Für eine aktuelle und ziemlich komplette Liste empfehle ich folgende Homepage: Java(tm) Books: http://lightyear.ncsa.uiuc.edu/~srp/java/javabooks.html D.2 Internet Java Reference http://java.sun.com/products/ Gamelan: Earthweb's Java Directory http://www.gamelan.com Java(tm) Books http://lightyear.ncsa.uiuc.edu/~srp/java/javabooks.html Einführung in Java http://acc.de/java/ Die Javaseite bei Addison-Wesley http://www.addison-wesley.de/News/Java.html Java Resources http://www.heise.de/ix/raven/Web/Java/ © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 85 D Weitere Informationen Cup O' Joe Java Shop http://www.cupojoe.com/ JARS http://www.jars.com/JARS TeamJava JAVA Links http://www.teamjava.com Java Language Reference Information http://www.javasoft.com/hooked/language-ref.html The Java Oasis http://www.oasis.leo.org/java/ We're New! - JavaMan http://www.JavaMan.com/ Yahoo - Computers and Internet:Languages:Java http://www.yahoo.com/Computers_and_Internet/Langua ges/Java/ The Java(tm) Developers Kit 1.0.2 http://java.sun.com/java.sun.com/products/JDK/1.0.2/in dex.html JavaWorld - IDG's magazine for the Java community http://www.javaworld.com/ Javology http://www.magnastar.com/javology/ © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial E Glossar 86 E Glossar Bandbreite: Bezeichnet die Kapazität einer Netzverbindung. Je höher die Bandbreite, desto mehr Bits lassen sich pro Sekunde übertragen. Bit: Kleinste digitale Einheit, die entweder aus der Ziffer 0 oder 1 besteht. Ein Bit hat kaum Aussagewert. Deshalb werden Bits in Gruppen dargestellt. 8 Bits stellen ein Byte dar. Alle Arten von Daten wie Texte, Bilder, Videos und Töne können in Bits und Bytes dargestellt werden. Browser: Software, um auf dem Web zu surfen. Marktführer in dieser Sparte ist Netscapes Navigator, weitere Anbieter sind unter anderen Microsoft mit dem Explorer und NCSA mit Mosaic. Firewall: Als 'Feuerwand' werden Sicherheitssysteme (ein Rechner) bezeichnet, welche ein lokales Netz z. B. einer Firma vor nicht autorisierten Benutzern aus dem Internet abschirmen. FTP: Abkürzung für File Transfer Protocol. Bezeichnet einen InternetDienst, der vor allem für das Herunterladen von Software und anderen Dateien von Hosts und Servern geeignet ist. Homepage: Die Eintrittsseite einer Organisation, einer Firma oder eines privaten Informationsanbieters auf dem Web. Host: Zu deutsch heisst Host 'Gastgeber' und bezeichnet Grossrechner im Netz, welche man ansteuern kann. HTML: (Hyper Text Markup Language). Eine Seitenbeschreibungssprache für das World Wide Web, welche u. a. HypertextVerknüpfungen und auch die Darstellung von multimedialen Daten erlaubt. HTML-Dokumente können von allen Rechnern mit gängigen Betriebssystemen gelesen werden. Hypertext: Eine logische Verknüpfung im World Wide Web, welche auf eine andere Seite verweist. Hypertext-Links sind farblich markiert und unterstrichen und führen per Mausklick automatisch zu einem verknüpften Dokument, das auf einem beliebigen Internet-Rechner rund um den Globus abgelegt sein kann. Intranet: Firmeninternes Netzwerk, das mit Software und Protokollen des Internets arbeitet, aber nur autorisierten Benutzern offensteht. Firewalls schützen das Intranet vor Eindringlingen. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial E Glossar 87 Provider: Zu deutsch auch Internet-Anbieter genannt. Provider sind jene Firmen, welche Kunden gegen eine monatliche Gebühr den Zugang zum Internet verschaffen. Provider managen die technische Ausrüstung (Server, Mietleitung, Modems) und leisten Support. Server: Ein Rechner im Datennetz mit besonderen Aufgaben (zu deutsch etwa 'Diener'), der von einzelnen PCs (Clients) beansprucht werden kann. Server verwalten Netze, bieten Programme an oder managen spezielle Dienste wie FTP oder elektronische Post. TCP/IP: (Transfer Control Protocol/Internet Protocol). Das Kommunikationsprotokoll, auf dem das Internet basiert. Erlaubt verschiedensten Rechnertypen wie Unix, Windows, Macintosh und OS/2 miteinander zu kommunizieren. URL: (Universe Resource Locator). Adressenstruktur, welche den Standort eines Objektes im Netz genau definiert. Der Aufbau der Adresse gibt auch einen Hinweis über die Art des Dienstes. So beginnt zum Beispiel eine Adresse im WWW typischerweise mit dem Auftakt 'http://www', ein FTPServer erkennt man am Adressenauftakt ftp... World Wide Web: (oder kurz Web oder 3W). Internet-Informationsdienst mit einer grafischen Oberfläche, der HypertextDokumente, Bilder, 3D-Dokumente, animierte Sequenzen oder auch Sounddaten enthalten kann. Das Web ist neben E-Mail der meistgenutzte Internet-Dienst. © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial F Abbildungen, Tabellen 88 F Abbildungen, Tabellen F.1 Abbildungen Das heterogene Internet..................................................... 17 Der Verifizierungsprozess ..................................................... 19 Zustände eines Threads ....................................................... 41 Klassenhierarchie ................................................................. 53 Der Applet-Zyklus ................................................................. 62 Die wichtigsten AWT-Klassen............................................... 68 F.2 Tabellen Operatoren .......................................................................... 32 Schlüsselworte...................................................................... 36 Sichtbarkeit von Objekten................................................... 59 Unterschiede C++ / Java .................................................... 89 © J.-P. Thomsen 1996 28.10.96 15:53 Java - Tutorial 89 G Stichwortverzeichnis G Stichwortverzeichnis A abstract 34; 54; 55 Abstract Window Toolkit 60; 62; 63; 66 abstrakte Klasse 12; 54; 55 abstrakte Methode 55; 56 ACupOfCoffee 78 add(Component c): 65 add(String name, Component c) 65 Animation 62 Anweisung 32; 33; 34; 36; 37; 44; 51; 53; 60 Anwendungen 7; 10; 20; 72; 75; 76; 77 Applet 19; 20; 57; 58; 59; 60; 61; 62; 70; 71; 72; 73; 75; 77 Applet Host 19 Applet Viewer 20; 58; 70; 73 Array 13; 26; 27; 29; 30; 31; 52; 68 Aufzählungstypen 22 Ausdrücke 12; 29; 32 Ausgabe 58; 65 Ausnahmen 25; 35; 36; 37 AWT 60; 62; 63; 64; 66 B Bibliothek 15 boolean 25; 31; 34; 59; 61; 64; 65; 79 bounds() 61; 64 break 23; 32; 33; 34; 36 Button 27; 29; 61; 63 byte 25; 29; 32; 34; 68 Bytecode 14; 17; 18; 20 Bytecodes 14; 15; 17; 18; 19; 73 C C 7; 9; 11; 12; 15; 17; 22; 23; 24; 25; 27; 28; 29; 30; 32; 33; 35; 42; 43; 45; 46; 47; 48; 52; 54; 74; 75; 77; 78; 79 C++ 7; 9; 11; 12; 15; 17; 22; 23; 24; 25; 28; 32; 33; 42; 48; 52; 54; 75; 77; 78; 79 Canvas 63 case 32; 33; 34 cast 34 catch 34; 36; 37 char 25; 32; 34; 79; 80 © J.-P. Thomsen 1996 Checkbox 63 class 14; 22; 34; 39; 42; 44; 46; 47; 49; 55; 58; 59; 60; 61; 66; 68; 73; 74; 79 Class Disassembler 74 Client 21; 67; 69 Compiler 24; 37; 45; 46; 52; 73; 76 const 34; 79; 80 Container 63; 64; 65 continue 23; 33; 34; 36 Cosmo Code 75 D DataInputStream 66 Datenkapselung 53 Datenpaket 68; 69 Datentyp 25; 32; 42; 79 Datentypen 12; 13; 15; 23; 24; 25; 26; 27; 31; 32; 45; 79 Datenzugriff 54 Debugger 74 default 32; 33; 34; 53; 54 Dereferenzierung 26; 27 destroy() 58 Dialog 63; 66 disable() 64 do 32; 34; 67 Dokumentation 79 double 25; 34; 42; 43; 44; 46; 47; 50; 51; 55; 79 E Eingabe 65; 66 Einschränkung 71 Einschränkungen 8; 70; 71; 72 else 32; 34; 47; 61 empfangen 59; 68; 69; 70 enable() 64 Endklasse 49 Entwicklungsumgebung 76; 77; 78 Entwicklungswerkzeug 76 Ereignis 60; 61; 64 Exception 35; 37; 68 extends 34; 49; 58; 59; 61; 66; 79 28.10.96 15:53 Tutorial 90 G Stichwortverzeichnis F J FileDialog 63 Filter 66 FilterInputStream 66 final 34; 46; 49; 52; 55; 59; 66; 68 Finalizer 52 finally 34; 36 Firewall 19; 85 float 25; 34; 79 for 32; 33; 34; 62; 82; 84 Frame 62; 63 future 34 Jagg 75 Jamba 76 Java Development Kit 20; 40; 73 Java Workshop 77 java.applet 41; 58; 59; 61; 70 java.awt 27; 40; 58; 59; 61 java.io 40; 65; 66; 68 java.lang 35; 40; 49 java.net 40; 68; 70; 71 java.util 40 javac 58; 73 javadoc 73 javah 74 javap 74 JavaScript 20; 21 jdb 74 JDK 20; 40; 73; 75; 77; 84 JFactory 76 G Garbage Collection 28; 80 Garbage Collector 12; 28; 29; 48 Geheimhaltung 53 generic 34 goto 23; 34 Graphical User Interface 62 Graphik 35; 57 GUI 34; 40; 62; 78 H handleEvent (Event e) 65 handleEvent() 60 Header 12; 22; 74 Host 19; 70; 71; 85 HotJava 8; 10; 11 Hyperwire 75 K Kawa 78 keyDown (Event e, int key) 65 Klasse 12; 13; 20; 22; 23; 24; 27; 28; 30; 31; 35; 37; 38; 40; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 73; 74 Klassenhierarchie 12; 49; 50; 51 Klassenmethode 47; 48 Klassenvariable 46 Kommentar 25; 74 Konstante 27 Konstruktor 27; 44; 45; 48; 50; 51; 69 Kopie 26; 45; 66; 74 I if 32; 33; 34; 37; 47; 61; 68 Imagemap 61 implements 34; 79 import 34; 40; 58; 59; 61; 66; 68; 79 init() 38; 57; 58; 59; 60; 61 Initialisierung 27; 29; 33; 43; 44; 48; 59; 61; 69 inner 34 instanceof 31; 34 Instanzenmethode 47 int 24; 25; 27; 29; 30; 32; 33; 34; 46; 59; 64; 65; 68; 79; 80 Interface 10; 26; 27; 38; 55; 56; 62; 81 Internet 7; 8; 10; 14; 17; 40; 67; 68; 69; 81; 83; 84; 85; 86 Interpreter 13; 15; 52; 73; 74 © J.-P. Thomsen 1996 L Label 32; 33; 63 Latte 78 List 63 long 25; 32; 34; 79 M mehrfach 35 Mehrfachvererbung 13; 23; 55 Methode 26; 27; 30; 34; 35; 36; 38; 39; 43; 44; 45; 46; 48; 49; 50; 51; 52; 53; 54; 55; 56; 58; 60; 61; 62; 66; 67; 68; 69; 70 minimumSize() 65 Modifier 53 Monitor 35; 38 mouseDrag (Event e, int x, int y) 65 mouseExit (Event e, int x, int y) 64 28.10.96 15:53 Tutorial G Stichwortverzeichnis mouseMove (Event e, int x, int y) 64 Müllabfuhr 12; 28; 48 Multithreading 14 N native 15; 34 Native Method C File Generator 74 NetDynamics 76 new 26; 27; 28; 29; 34; 37; 42; 43; 44; 47; 48; 59; 61; 68 None 19 notify() 39 notifyAll() 39 null 26; 27; 29; 34; 67; 79 Nutmeg 76 O Oberklasse 49; 51; 52; 53; 54; 60; 61 Objektmethoden 43 OEW 78 Operator 23; 26; 27; 28; 30; 31; 32; 34; 43; 79 Operator Overloading 23 Optima++ 78 outer 34 P package 34; 40; 53; 71 paint(Graphics g) 58; 59; 64 Panel 63 Pipe 67 Pointer 13; 23; 24; 26; 28 Port 68; 69 Präprozessor 12; 46 preferredSize() 65 Priorität 38; 39; 48 private 34; 52; 53; 54; 59; 61; 74 private protected 53 protected 34; 53; 54; 74 public 34; 37; 42; 44; 46; 47; 49; 50; 51; 53; 54; 55; 58; 59; 61; 66; 68; 70; 72; 79 91 S Schlüsselwort 27; 28; 29; 39; 42; 43; 44; 45; 46; 47; 49; 51; 52; 55; 79 Schnittstelle 67 Scrollbar 63 senden 67; 68; 70 Server 67; 69; 70; 71; 75; 76; 86 setLayout(LayoutManager I) 65 short 25; 32; 34; 79 show() 64 Sicherheit 20; 71 Sichtbarkeit 53; 54 size() 64 Socket 68; 69 Sockets 69; 70 Sound 62; 72 star seven 10 start() 38; 57; 62 static 22; 34; 45; 46; 47; 52; 55; 59; 68 stop() 38; 58 super 34; 51; 52; 53; 60; 61 switch 32; 33; 34; 60 Symantec Café 77 synchronized 34; 35; 38; 39; 80 T TextArea 63; 66 Textfield 63 this 34; 43; 44; 46; 47; 50; 51; 61; 66 Thread 14; 34; 38; 39; 48; 58; 62; 69; 80 throw 34; 37 throws 34; 66; 68 transient 34 try 34; 36 Typenumwandlung 12; 23 U Unrestricted 20 Unterklasse 35; 36; 49; 50; 51; 52; 54; 55 Unterklassen 50; 54 update(Graphics g) 64 URL 40; 67; 73; 86 R V Referenz 26; 27; 28; 42; 47 Referenzierung 26 repaint() 64 rest 34 return 34; 36; 42; 44; 46; 47; 59; 61; 67 Roaster 78 Rückgabewert 44; 48 var 34 Variable 26; 27; 28; 42; 43; 45; 46 Variablen 18; 21; 25; 26; 27; 33; 42; 43; 45; 46; 49; 50; 53; 54; 55 Vererbung 12; 21; 24; 49; 56 Verifizierung 13; 18; 19 Verifizierungsprozess 19 Verkettung 31; 51; 52 © J.-P. Thomsen 1996 28.10.96 15:53 Tutorial 92 G Stichwortverzeichnis virtuelle Maschine 20 Visual J++ 77 void 34; 44; 55; 58; 59; 61; 64; 65; 68 volatile 34 World Wide Web 7; 9; 10; 20; 82; 85; 86 WWW 7; 67; 86 Z W wait() 39 WebRunner 10 while 32; 34; 62; 67 © J.-P. Thomsen 1996 Zeichenkette 27 zeichnen 64 Zeigerarithmetik 12 Zustände eines Threads 38 28.10.96 15:53 Tutorial G Stichwortverzeichnis © J.-P. Thomsen 1996 93 28.10.96 15:53