1-1 Einführung Einführung Dieser Abschnitt zeigt drei primitive Beispiele zur Programmierung mit Java und zum Umgang mit den verschiedenen W erkzeugen des Java Development Kit. Themen Was ist Java? Ein erstes Programm — programs/hello Eine erste Applikation — apps/hello Ein erstes Applet — applets/hello Dokumentation Das Java Development Kit 1-2 Was ist Java? Was ist Java? Java ist eine neue Programmiersprache, die bei Sun unter der Leitung von James Gosling entwickelt wurde und in die so weit als möglich Konzepte aus C, Objective C und C++ eingegangen sind. Java wird interpretativ verarbeitet und kann Klassen dynamisch zuladen. CPU-Chips für Java sind angekündigt, ein Prototyp-Rechner wurde auf der CeBIT’96 gezeigt. HotJava ist ein Web-Browser, der sehr modular in Java implementiert wurde. Er kann Protokoll-Module und andere kleine Applikationen (Applets) dynamisch lokal oder vom Netz zuladen und sich damit an neue Aufgaben anpassen. Nach van Hoff, Shaio und Starbuck ist Java ‘einfach, objekt-orientiert, statisch typisiert, compiliert, architektur -neutral, multi-threaded, garbage collected, robust, sicher, erweiterbar und klar verstanden. Vor allem aber macht Java Spaß!’’ einfach Java ist zwar verwandt zu Sprachen wie C oder C++, aber um die Sprache überschaubar und leicht erlernbar zu machen, wurde alles nicht absolut Notwendige eliminiert. Dies führt zu einheitlicheren Programmen und leichterer Pflege. objekt-orientier t Moderne Programme arbeiten verteilt und haben Oberflächen. Beides läßt sich mit Objekt-Orientierung leichter realisieren. Im Gegensatz zu C++ ist Java konsequent und vollständig objekt-orientiert und fördert so den richtigen Programmierstil für diese Problemwelt. statisch typisiert Alle Daten müssen in Java mit Typ vereinbart werden, damit die Verträglichkeit von Daten und Operationen weitgehend zur Übersetzzeit abgesichert werden kann. Ähnlich wie Objective C erlaubt auch Java Typabfragen zur Laufzeit. compiliert Java vermeidet die Ineffizienz wiederholter Quelltext-Analyse, die sich beispielsweise bei TCL durchaus bemerkbar macht. Ein Programm wird in Byte-Codes übersetzt, die die Maschinensprache einer derzeit als Interpreter realisierten Virtuellen Maschine bilden. Klassen und Methoden sind symbolisch gebunden; deshalb können einzelne Klassen wirklich unabhängig voneinander neu übersetzt werden. architektur-neutral Nur die Virtuelle Maschine muß für eine Plattform hergestellt werden, die Byte-CodeDateien sind überall gleich. Java-Programme können deshalb in übersetzter Form vertrieben werden. Außerdem sind Kapazität und Verhalten der primitiven Datentypen 1-3 in Java vollständig spezifiziert, womit ein wesentliches Portierungsproblem für C und C++ eliminiert wird. multi-threaded Oberflächen vermitteln die Illusion paralleler Abläufe. Threads bieten die Möglichkeit, dies auch elegant zu implementieren. Java hat ein auf Klassen beruhendes ThreadSystem und in die Sprache sind einfache Synchronisationsmechanismen (Monitore) integriert. Die Klassenbibliotheken sind thread-safe. garbage collected Dynamische Speicherverwaltung im Stil von C und C++, bei der der Programmierer für den korrekten Ressourcen-Kreislauf selbst sorgt, ist zwar effizient, aber extrem fehleranfällig. Java kennt nur dynamische Objekte und Vektoren, nimmt aber dem Programmierer die Problematik der Speicher-Wiederverwendung vollständig ab. Da garbage collection als paralleler Thread abläuft, sollte sie sich in kritischen Situationen auch nicht als Effizienz-Engpaß erweisen. robust Zur Fehlerbehandlung gehören exceptions von vornherein zum Sprachumfang von Java. Der Programmierer ist daher gezwungen, Fehlermöglichkeiten in Bibliotheksklassen zu berücksichtigen, und der Compiler kann überprüfen, daß Ausnahmen nicht versteckt werden. sicher Ein Interpreter kann natürlich absichern, daß das interpretierte Programm die Plattform nicht außer Gefecht setzt. Im Zusammenhang mit dem W eb hat Java zusätzliche Sicherungsmechanismen, die eingeworbene Programme so zügeln, daß man Viren für unmöglich hält — trotz der Tatsache, daß binäre Java-Programme auf beliebigen Plattformen ablauffähig sind. erweiterbar Java erlaubt die Formulierung von Methoden in anderen Sprachen und macht damit prinzipiell den Zugriff zu beliebigen Bibliotheken möglich, soweit nicht Sicherheitsaspekte Vorrang haben. klar Zwar ist Java eine neue Sprache, aber ihre Konzepte sind wohlbekannt. Die Sprachdefinition ist umfassend und trotzdem kurz. Im Gegensatz zu C++ kann ein Programmierer Java durchaus vollständig verstehen und verwenden. Die Verwandtschaft mit C und seinen Dialekten erleichtert außerdem den Einstieg in Java beträchtlich, wenn man auch manche feinen Unterschiede genau berücksichtigen muß. 1-4 Ein erstes Programm Ein erstes Programm — programs/hello Hello gibt einen Text aus, der im Programm steht. Hello demonstriert vor allem den Umgang mit den W erkzeugen im JDK. /** A class with the first Java program */ class Hello { public static void main (String args []) { System.out.println("Hello, World"); } } // main program // standard output Kommentare sind wie in C und C++ /* ... */ oder // bis Zeilenende. javadoc übernimmt Kommentare, die mit /** beginnen, in die Dokumentation. Funktionen sind grundsätzlich Methoden. Variablen gehören grundsätzlich zu Klassen. static designiert Klassenmethoden und -variablen. Es gibt nur einfache Vererbung. Klassen stammen mindestens von Object ab. Ohne Qualifikation sind Namen in einem Paket (Quelldatei) sichtbar. public macht einen Namen auch außerhalb sichtbar, protected erlaubt nur Zugriff aus Unterklassen, private verkapselt in der aktuellen Klasse. ist eine vordefinierte Klasse für konstante Zeichenketten; das Paket java.lang ist automatisch importiert. java.lang.String erlaubt unter anderem Zugriff auf den java.io.PrintStream out, eine Klassenvariable, mit deren Methode println() ein String als Zeile zur StandardAusgabe ausgegeben werden kann. java.lang.System Syntaktisch sind Methoden Komponenten von Klassen. Beim Aufruf wird die Methode als Komponente des Empfängers angegeben, der eine Variable oder eine Klasse ist. Java verwendet nur den Punkt zur Auswahl von Komponenten. Ausführung Übersetzung und Ausführung können etwa so aussehen: $ javac Hello.java $ java Hello Hello, World # Uebersetzung einer Datei # Ausfuehrung von main() in einer Klasse 1-5 Eine erste Applikation Eine erste Applikation — apps/hello Hello gibt einen Text aus, der im Programm steht. Hello demonstriert, wie man eine minimale Applikation aufbaut. Eine Applikation ist ein selbständiges Java-Programm mit einer grafischen Oberfläche, die mit dem Abstract Window T oolkit (AWT) programmiert wird. import java.awt.*; // find AWT classes /** A class with the first Java application */ class Hello extends Frame { /** main program, creates and displays main window */ public static void main (String args []) { Frame f = new Hello("Hello, World"); f.setTitle(f.getClass().getName() + " Application"); f.pack(); f.show(); } /** constructor, puts text at top center */ Hello (String text) { super(); add("North", new Label(text, Label.CENTER)); } /** event handler, ensures that the application can terminate */ public boolean handleEvent (Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); return super.handleEvent(evt); } } import holt Pakete oder Klassen in den aktuellen Namensraum. Ein Objekt der Klasse Hello ist das Hauptfenster. extends legt fest, daß Hello eine Unterklasse von Frame ist, der Klasse der Hauptfenster. Klassen haben Konstruktoren, Methoden, die neue Objekte initialisieren. Ein Konstruktor heißt so wie seine Klasse und hat kein Resultat. Konstruktoren sind implizit verkettet — entweder ein Konstruktor beginnt mit einem Aufruf zu einem anderen Konstruktor, oder der hier explizit angeführte Aufruf zum Konstruktor der Oberklasse ohne Argumente findet implizit statt. Alle Objekte werden dynamisch erzeugt und sie verschwinden durch garbage collection , wenn sie vom Programm nicht mehr erreicht werden können. Der Konstruktor Hello() erzeugt mit dem Operator new ein neues Label-Objekt, das den gewünschten Text darstellt. Ein Frame ist ein Container und kann daher Component-Objekte enthalten. add() fügt die Label-Component nördlich, also oben, im Hello-Frame ein. Es gibt andere Techniken zum Layout-Management. Im Hauptprogramm wird mit new ein neues Hello-Objekt erzeugt; der resultierende 1-6 Verweis kann auch an eine Variable zugewiesen werden, die auf ein Objekt der Oberklasse Frame verweist. Anschließend werden einige Frame-Methoden aufgerufen, um den Klassennamen im Fenster-Titel unterzubringen. + dient zum Verketten von Strings. pack() ordnet Component-Objekte wie die Label in einem Window-Objekt an, show() zeigt das fertige Fenster. Ohne Event-Handling kann die Applikation nur mit Gewalt terminiert werden. Die Methode handleEvent() wird deshalb überschrieben, um die Applikation mit der Klassenmethode System.exit() zu terminieren, wenn das Fenster geschlossen wird. Andere Events werden mit super.handleEvent() an die Oberklasse weitergeleitet. Ausführung Eine Applikation wird wie ein Programm übersetzt und ausgeführt: $ javac Hello.java $ java Hello # Uebersetzung einer Datei # Ausfuehrung von main() in einer Klasse Unter Windows 95 erscheint hier das folgende Fenster: Die Größe des Fensters kann verändert werden; der Text bleibt dabei oben zentriert. Die Applikation wird beendet, indem man das Fenster schließt. 1-7 Ein erstes Applet Ein erstes Applet — applets/hello Hello gibt einen Text aus, der im Programm steht. Hello ist ein Applet und demonstriert, wie Java im Rahmen von W eb-Dokumenten verwendet wird. Ein Applet ist ein Java-Programm mit einer grafischen Oberfläche, die mit dem A WT so implementiert wird, daß sie dann in geeigneten W eb-Browsern verfügbar gemacht werden kann. Ein Applet wird immer als Unterklasse von Applet implementiert, der Aufbau eines Hauptfensters wie bei einer Applikation entfällt. import java.applet.*; import java.awt.*; // find Applet class // find Graphics class /** A class with the first Java applet */ public class Hello extends Applet { /** hook to initialize the applet */ public void init () { resize(150, 25); } /** redraw the Applet */ public void paint (Graphics g) { g.drawString("Hello, World", 50, 25); } } Eine Klasse kann alspublic bezeichnet werden und ist dann nach Import eines Pakets sichtbar. Sie muß in einer Datei gleichen Namens implementiert sein. Ein Applet-Objekt wird von der Laufzeitumgebung erzeugt, die dann init() an das Applet schickt, wenn es initialisiert wird. Es gibt andere ‘ ‘Meilensteine’ ’ im Leben des Applets. paint() ist die Methode, mit der sich jede Component darstellt. Graphics repräsentiert einen Grafik-Kontext und dient zur Darstellung von Texten etc. Ausführung Ein Applet wird mit einem <applet>-Element aus einer HTML-Datei heraus aufgerufen: <html> <head> <title>Hello, World</title> </head> <body> Here is the output: <applet code="Hello.class" width=150 height=25> </applet> <p> Here is the <a href="Hello.java">source.</a> </body> </html> 1-8 Übersetzung und Ausführung können etwa so aussehen: $ javac Hello.java $ java sun.applet.AppletViewer 0.html # Uebersetzung einer Datei # Ausfuehrung des <applet> appletviewer , hier als Klasse aufgerufen, ist ein trivialer Web-Browser, der nur Applets anzeigt. Unter Windows 95 erscheint hier das folgende Fenster: Über das Menü Applet kann unter anderem die Vorführung beendet werden: Ein Java-fähiger Browser kann die Seite mit dem Applet ebenfalls zeigen. Für einen anderen Browser könnte man im <applet>-Element ersatzweise Text und Bilder eintragen. 1-9 Dokumentation Dokumentation Die verschiedenen Pakete im JDK sind auf HTML-Seiten in einem standardisierten Format dokumentiert, das sehr viele Querverweise auf benutzte Klassen oder überdefinierte Methoden enthält. Diese Dokumentation kann mit javadoc direkt aus den Programmquellen erzeugt werden. Spezielle Kommentare /** ... */ vor Klassen-, Variablen- oder Methodenköpfen werden in die Dokumentation übernommen. Die Kommentare können besondere Elemente enthalten: erzeugt einen Querverweis. beschreibt einen Parameter einer Methode. beschreibt das Resultat einer Methode. beschreibt eine Ausnahmebehandlung. @see Klasse#Methode @param Name Text @return Text @exception Klasse Text Auch ohne spezielle Kommentare ist die Dokumentation nützlich, da sie die Position in der Klassenhierarchie und Überdefinition von Methoden darstellt. Die Querverweise auf vorhandene Klassen müßten wohl nachbearbeitet werden. Ausführung Die Ausführung kann etwa so aussehen: $ cd code/applets/hello; javadoc Hello.java Generating packages.html generating documentation for class Hello Generating index Sorting 3 items . . . done Generating tree Folgende Dateien werden erzeugt: AllNames.html Hello.html packages.html tree.html alphabetische Liste aller Methoden. Beschreibung der Klasse Hello. alphabetische Liste der Pakete. hierarchische Liste der Klassen und Interfaces. 1-10 Das Java Development Kit Das Java Development Kit Das Java Development Kit (JDK) enthält den Interpreter java, den in Java geschriebenen Compiler javac, eine Reihe von Paketen mit Klassen, sowie verschiedene andere Werkzeuge wie den Debugger jdb und den Dokumentationsgenerator javadoc. Das JDK ist derzeit von Sun für verschiedene Plattformen wie Solaris 2, Linux und Windows 95 frei verfügbar . Linux Das Java Development Kit benötigt ein recht aktuelles Linux-System mit X11; ich verwende 1.2.13 (ELF) und XFree 3.1.2. Installation Zur Installation packt man linux.jdk.common.tar.gz und linux.jdk.x86-static-motifbin.tar.gz in /usr/local aus: # # # # cd /usr/local tar xfvz linux.jdk.common.tar.gz tar xfvz linux.jdk.x86-static-motif-bin.tar.gz less java/HOWTO HOWTO erklärt im Abschnitt 4.3, welche V ersionen bestimmte Bibliotheken mindestens haben müssen. Bei XFree 3.1.2 sind die X-Bibliotheken korrekt; jedoch müssen möglicherweise libc-5.2.18.bin.tar.gz und ld.so-1.7.14.tar.gz eingefügt werden — siehe HOWTO. muß dann den Katalog /usr/local/java/bin enthalten, in dem sich die W erkzeuge befinden. Die Shell-Skripte defineren CLASSPATH mit dem aktuellen Katalog und /usr/local/java/classes. Am besten setzt man PATH in ~/.bash_profile: PATH export PATH=$PATH:/usr/local/java/bin Programm Hello.java wird in der Shell mit javac übersetzt und mit java ausgeführt: $ javac Hello.java $ java Hello Hello, World Hello.class, der Name der übersetzten Datei, leitet sich von der Klasse ab. Zur Ausführung werden der Name der Klasse und Argumente für das Programm angegeben. Die Kommandos erklären sich, wenn sie ohne Argumente aufgerufen werden. Applet Hello.java wird in einem X-Fenster mit javac übersetzt. Hello.class wird in einer Datei 0.html erwähnt, die mit dem appletviewer ausgeführt wird: 1-11 $ javac Hello.java $ appletviewer 0.html Hello.class, der Name der übersetzten Datei, leitet sich von der Klasse ab. Zur Ausführung wird der Name der Klasse angegeben. 0.html kann auch mit Web-Browsern wie netscape 2.0 betrachtet werden, die Java unterstützen. netscape kann aus netscape-v20-export.i486-unknown-linux.tar.gz installiert werden. 1-12 Windows 95 Das Java Development Kit verwendet die langen Dateinamen, die unter Windows 95 zur Verfügung stehen; das macht die Übertragung von Programmen schwierig. Installation Zur Installation führt man JDK-1_0-win32-x86.exe in dem Katalog aus, in dem sich dann der Katalog \java, die Wurzel des Java Development Kit, befinden soll. Die Unterlagen gehen davon aus, daß das direkt im Wurzelkatalog c: geschieht. PATH muß dann den Katalog c:\java\bin enthalten, in dem sich die W erkzeuge befinden. dient normalerweise zum Auffinden von Klassen und sollte deshalb den aktuellen Katalog und c:\java\lib enthalten. CLASSPATH Am besten setzt man diese Variablen in autoexec.bat: path %path%;c:\java\bin set classpath=.;c:\java\lib Programm Hello.java wird in einem DOS-Fenster mit javac übersetzt und mit java ausgeführt: > javac Hello.java > java Hello Hello, World Hello.class, der Name der übersetzten Datei, leitet sich von der Klasse ab. Zur Ausführung werden der Name der Klasse und Argumente für das Programm angegeben. Die Kommandos erklären sich, wenn sie ohne Argumente aufgerufen werden. Applet Hello.java wird in einem DOS-Fenster mit javac übersetzt. Hello.class wird in einer Datei 0.html erwähnt, die mit dem appletviewer ausgeführt wird: > javac Hello.java > appletviewer 0.html Hello.class, der Name der übersetzten Datei, leitet sich von der Klasse ab. Zur Ausführung wird der Name der Klasse angegeben. 0.html kann auch mit Web-Browsern wie netscape 2.0 betrachtet werden, die Java unterstützen. netscape kann durch Ausführen von n32e20.exe installiert werden. Debugger — jdb idb ist ein Java-Programm, mit dem ein Java-Programm interpretiert und dabei 1-13 beobachtet werden kann. Ausführung Die Ausführung kann etwa so aussehen: $ cd code/programs/hello; javac -g Hello.java $ jdb Hello Loading jdb ... 0x504b48e8:class(Hello) > help ** command list ** ... > stop in Hello.main Breakpoint set at Hello:5 > run run Hello Breakpoint hit: running ... Hello.main (Hello.java:5) main[1] step Hello, World The current program has exited. Bei der Übersetzung sollte man -g angeben, um Informationen über Variablen zur Verfügung zu stellen. Die Bedienung des Debuggers erfährt man mit dem Debugger -Kommando help. 1-14 Dokumentation — javadoc javadoc ist ein Java-Programm, das eine Quelldatei oder ein Paket analysiert und für jede Klasse und jedes Interface eine HTML-Datei mit Dokumentation erzeugt, die sehr viele Querverweise enthält und einem standardisierten Format genügt. Außerdem werden Index-Dateien produziert, von denen aus die Klassenhierarchie, die Methoden und die Pakete erreichbar sind. Linux Unter Linux fehlt die Implementierung von javadoc. Sie läßt sich herstellen, indem man für javac und javadoc folgendes Shell-Skript in /usr/local/java/bin/i586 hinterlegt: #!/bin/sh `dirname $0`/java -ms8m sun.tools.`basename $0`.Main $* Anscheinend werden die Index-Dateien unter Linux nicht produziert.