Was ist Java?

Werbung
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.
Herunterladen