Im folgenden Kapitel geht es um Besonderheiten der Sprache, wie Schlüsselwörter, Operatoren und die Klassenbibliothek.
Sie erhalten immer eine Hilfe zu den
Programmen, wenn Sie sie ohne Parameter aufrufen. Desweiteren
befindet sich eine genaue Beschreibung aller Optionen und Programmfunktionen
in der HTML-Online-Dokumentation. Die folgenden Informationen
stellen nur eine kleine Übersicht dar.
Ein Programm mit der Endung "_g"
ist immer die ohne Optimierung compilierte (debugbare) Version.
javac- der Java-Compiler übersetzt die Java-Quelltexte in den Bytecode
Beispiel: javac -classpath src;src\old -d classes -O -deprecation test.java
kompiliert die Quelldatei test.java
in src oder src\old, gibt Fehlermeldungen zu veralteten Aufrufen
aus, führt eine Optimierung durch und speichert die Klassendatei
im Pfad classes.
java - der Java-Interpreter führt Programme im Bytecode aus.
Beispiel: java -cs ls cpp
führt das Programm "ls.class"
mit dem Parameter "cpp" aus und übergibt an den
java-Interpreter die Option -cs.
javadoc - Generiert aus im Quellcode enthaltenen DocComments eine API-Dokumentation
Beispiel: javadoc -version -author -noindex -notree test.java
erzeugt eine Dokumentation zur Klasse
test, @version- und @author-Tags werden hierbei berücksichtigt
und index.html und tree.html nicht erzeugt.
Neben normalem text können DocComments auch besondere Tags enthalten.
@see Klasse#Methode Hyperlink
@param Name Text beschreibt Parameter einer Methode
@return Text beschreibt Rückgabewert einer Methode
@exception Klasse Text beschreibt Ausnahmebehandlung einer Methode
@author Text Autor der Klasse
@deprecated Klasse oder Methode als veraltet deklarieren
@version Text Version bzw. Datum der Klasse
appletviewer - einfacher Applet-Anzeiger für Leute ohne 1.1-kompatiblen Webbrowser
Beispiel: appletviewer test.java
lädt die HTML-Datei test.java und
führt das darin mittels <APPLET>-Tag eingebettete Applet
aus.
jdb - mit dem Java-Debugger "entwurmt" man Programme
javah - Headerfile- und C-Stub-File-Generator für das Einbinden von C-Code
javap - der Java-Profiler disassembliert Klassendateien und zeigt den Bytecode an
rmic - generiert Stub- und Skelettklassen für Javaobjekte, die verteilte Programmierung benutzen
rmiregistry - wird für verteilte Programmierung benutzt
serialver - liefert die Seriennummer einer Klasse
native2ascii - konvertiert Text ins Unicode-Format
jar - Packer, der es erlaubt, mehrere Klassen und Ressourcen in einer Datei zu speichern
javakey - erzeugt digitale Unterschriften für Archive und verwaltet Schlüssel
Im Unterschied zu C unterstützt
die Sprache JAVA nicht alle Standard-C-Operatoren.
Es gleichen sich jedoch die Vorrangs-
und Assoziativitätsregeln. Java unterstützt jedoch beispielsweise
nicht den Operator sizeof. Da es auch keine Pointer gibt (statt
dessen Referenzen), existieren auch der Adress- und Pointeroperator
nicht.
Neu ist beispielsweise, der "+"-Operator
zum Verketten von Strings. Der instanceof-Operator liefert true
oder false je nachdem, ob ein Object eine Instanz einer angegebenen
Klasse ist oder nicht.
Zum normalen >> (shift right)
Operator kommt der >>>-Operator, der eine Zahl grundsätzlich
als nicht vorzeichenbehaftet behandelt.
Werden & und | (bitweises AND und
OR) auf boolean-Typen angewandt, wirken Sie automatisch wie logisches
AND und OR, mit dem Unterschied, daß bei && und
|| der auf der rechten Seite stehende Operand nicht mehr ausgeführt
wird, sobald das Ergebnis der Auswertung des linken Operanden
schon feststeht. Boolean ist ein eigenständiger Typ, daher
kann nicht jeder Typ als boolean-Typ verwendet werden, sondern
andere Typen müssen mittels Vergleichsoperationen umgewandelt
werden.
In Java werden Zugriffe auf Felder über
deren Grenzen hinaus nicht wie in C zugelassen, sondern erzeugen
Ausnahmen. Typen sind in Java streng definiert, im Gegensatz zu
C, wo man nie weiß, ob beispielsweise char auf dem aktuellen
Compiler signed oder unsigned ist. Der Ausweg war oft, eigene
Typen zu definieren, und dann immer den eigenen Typ, z.B. byte
als unsigned char zu benutzen, was für Außenstehende
zu schwer lesbaren Programmen führte.
Java-Code ist generell sehr gut lesbar,
denn durch klar definierte Typen (ein großes Manko von C++),
Unterbindung von Operator-Überladung, Pointerarithmetik und
anderes (z.B. kann es nicht mehr passieren, daß man bei
if(a==0) ein Gleichheitszeichen vergißt), ist alles eindeutig
interpretierbar.
Einige Eigenschaften von C++ wurden bei Java weggelassen.
Java bietet auch viel Neues.
Java ist eine Fusion von vier Arten der Programmierung.
Object oriented | like Smalltalk |
Numeric | like FORTRAN |
Systems | like C |
Distributed | like nothing else |
Java kennt folgende reservierte Wörter, von denen noch nicht alle
unterstützt werden:
abstract boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient true try var void volatile while
Noch nicht unterstützt: byvalue, cast, const, future, generic, goto, inner, operator, outer, rest, var
An dieser Stelle sollen nicht alle erklärt
werden, manche werden im 3. Kapitel in Beispielprogrammen auftauchen,
wo näher auf sie eingegangen wird.
In Java sind sowohl C als auch C++-Kommentare
gültig. Ein hinter // angegebener Text wird vom Compiler
bis zum Zeilenende ignoriert, Kommentare zwischen /* und */ können
sich auch über mehr oder weniger als eine Zeile erstrecken.
Verschachtelung und Kommentare innerhalb von Zeichenketten sind
nicht erlaubt. Ein besonderes Feature sind die
DocComments zwischen
/** und */, mit denen man leicht eine Dokumentation seiner Klassen
erstellen kann. Mehr dazu im Kapitel zu den Java-Tools.
Kurzzusammenfassung Operatoren
Postfix Operatoren | [] . (params) expr++ expr-- |
unäre Operatoren | ++expr -expr +expr -expr ~ ! |
Erstellen und Casting | new (type)expr |
Rechnen | + - * / % |
shift | << >> >>> |
relational | < > <= >= instanceof |
Gleichheit | == != |
AND | & && |
OR | ^ | || |
Bedingung | ? : |
Zuweisung | = += -= *= /= %= ^= &= |= <<= >>= >>>= |
Zuweisung bedeutet, man kann z.B. "X=X+Y" abkürzen durch "X+=Y", wie auch in C üblich.
Operatoren in Java
X + Y | addieren oder verketten |
X - Y | substrahieren |
X * Y | multiplizieren |
X / Y | dividieren |
X % Y | modulus |
X ^ Y | exklusiv or |
X & Y | bit and |
X | Y | bit or |
X && Y | logisches and |
X || Y | logisches or |
X << Y | Linksverschiebung |
X >> Y | Rechtsverschiebung |
X >>> Y | vorzeichenlose Rechtsverschiebung |
X = Y | Zuweisung |
X += Y | Summe zuweisen |
X -= Y | Differenz zuweisen |
X *= Y | Produkt zuweisen |
X /= Y | Quotient zuweisen |
X %= Y | Modulus zuweisen |
X ^= Y | xor zuweisen |
X &= Y | bit and zuweisen |
X |= Y | bit or zuweisen |
X <<= Y | Linksverschiebung zuweisen |
X >>= Y | Rechtsverschiebung zuweisen |
X >>>= Y | vorzeichenl Rechtsversch. zuweisen |
X < Y | kleiner als |
X > Y | größer als |
X <= Y | kleiner gleich |
X >= Y | größer gleich |
X == Y | gleich |
X!= Y | ungleich |
X.Y | z.B.: java.lang.String |
X, Y | Verkettung |
X instanceof Y | Subklasse? |
X ? Y: Z | if then else |
X++ | inkrementieren postfix |
X -- | dekrementieren postfix |
++ X | inkrementieren präfix |
-- X | dekrementieren präfix |
! X | nicht |
(X) | Vorrang |
(Typ)X | Casting |
new X | neue Instanz |
einfache Datentypen
Typ | Inhalt | Init | bit | Wertebereich |
boolean | true oder false | false | 1 | keine Angaben |
char | Unicode-Zeichen | \\u0000 | 16 | \\u0000 bis \\uFFFF |
byte | Integer mit Vorzeichen | 0 | 8 | -128 bis 127 |
short | Integer mit Vorzeichen | 0 | 16 | -32768 bis 32767 |
int | Integer mit Vorzeichen | 0 | 32 | -2147483648 bis 2147483647 |
long | Integer mit Vorzeichen | 0 | 64 | -9223372036854775808 bis 9223372036854775807 |
float | IEEE 754 Fließkomma | 0.0 | 32 | 1.40239846E-45 bis 3.40282347E+38 |
double | IEEE 754 Fließkomma | 0.0 | 64 | 4.94065645841246544E-324 bis 1.79769313486231570E+308 |
Beachten Sie, daß Strings keine char-Felder, sondern vollwertige Objekte sind (siehe java.lang.String und java.lang.StringBuffer). Spezielle oder nationale Codes können auch mit der Escape-Sequenz "\uxxxx" im UniCode-Format eingebunden werden, wobei "xxxx" für eine 16bit-Hexadezimalzahl steht.
Escape-Sequenzen in Zeichenketten:
Darstellung | Bedeutung |
\n | new line |
\r | cariage return |
\b | backspace |
\t | tabulator |
\f | form feed |
\' | Hochkomma |
\" | Anführungszeichen |
\\ | backslash |
\uXXXX | Unicode-Zeichen |
Alle Zahlenformate sind vorzeichenbehaftet und werden mit 0 initialisiert. Eigene Typen oder Modifier wie unsigned in C sind nicht erlaubt. Noch größere Zahlen werden durch spezielle Klassen unterstützt. Für alle Zahlen gibt es spezielle Klassen (Subklassen von Number), z.B. Integer für int, die z.B. Methoden zur Umwandlung in Zeichenketten enthalten.
Konstanten werden abhängig von der Schreibweise als Ganz- oder Gleitkommazahl interpretiert. Man kann jedoch durch folgende Anhängsel explizit einen Typ erzwingen:
'l' oder 'L' | long |
'f' oder 'F' | float |
'd' oder 'D' | double |
Zahlen bis 32bit Länge erhalten automatisch den Typ int. Es gibt auch Präfixe, die es ermöglichen, andere Zahlensysteme zu verwenden.
Anhängsel | Beispiel | Zahlensystem |
kein | 1234 | dezimal |
0 | 0123 | oktal |
0x | 0x4F | hexadezimal |
Kurzzusammenfassung Flußkontrolle
Art | Schlüsselwort |
Entscheidung | if-else, switch-case |
Schleife | for, while, do-while |
Ausnahme | try-catch-finally, throw |
anderes | break, continue, label:, return |
Java bietet hier in etwa die gleichen Möglichkeiten wie C++.
if (Ausdruck) Befehl1; else Befehl2;
switch(Variable) { case Konstante :Befehl; break; default :Befehl; break; }
for (Initialisierung; Abbruchkriterium; Inkrement) Befehl;
do { Befehl; } while (Ausdruck);
while (Ausdruck) Befehl;
try { Befehl; } catch (Exception e) { Behandlung; } finally { Befehl; }
Java unterstützt kein goto aber man kann in der Form "label: Befehl" eine Sprungmarke setzen, zu der man mittels "break label" springen kann. In einer Schleife kann man mit "continue" bzw. "continue label" den nächsten Durchlauf einleiten, "break" bricht die Schleife ab. Der return-Befehl beendet die aktuelle Methode und kann auch einen Wert zurückliefern.
Java enthält eine umfangreiche
Klassenbliothek.
Das Application Programming Interface
(API) enthält vordefinierte Klassen und Methoden, die ein
Programm auf dem ausführenden Client voraussetzen kann, d.h.,
sie müssen nicht mit übertragen werden und gehören
zum Sprachstandard.
Da es unumgänglich ist, beim Programmieren
die HTML-Version der Java-Dokumentation zur Hand zu haben, wird
im Gegensatz zu vielen Büchern, die dies als Füllstoff
benutzen, auf eine ausführliche Beschreibung des APIs verzichtet.
Besonderheiten werden im dritten Kapitel anhand von Beispielprogrammen
erläutert.
Farbcodes in der API-Dokumentation
Farbe | Bedeutung |
violett | Instanzvariablen |
blau | static-Variablen |
gelb | Konstruktoren |
rot | Instanzmethoden |
grün | static-Methoden |
Das Suchen nach geeigneten Klassen und Methoden im API macht einen erheblichen Teil der Programmierung aus. Außerdem sind solche allgemeingültigen Funktionen meist um einiges stabiler als eigene "quick hacks".
Java API Packages
Die begrifflichen Grundlagen hierzu
wurden bereits im ersten Kapitel gelegt. Wenn man z.B. in der
prozeduralen Programmierung eine Zeichenkette in Kleinbuchstaben
umwandeln will, so würde man einfach einer Bibliotheksfunktion
den String als Argument liefern und den konvertierten String zurückerhalten.
In Java legt man ein neues String-Objekt an, in dem man mit dem
new-Operator eine Instanz einer Klasse anlegt, z.B.:
Im Speicher wird nun eine neue Kopie
der Klasse angelegt, und dann wird der sogenannte Konstruktor
aufgerufen. Er ist eine besondere Art der Methode, die nichts
zurückliefert, auch nicht void. Wenn kein eigener Konstruktor
definiert ist, ist standardmäßig ein Konstruktor gültig,
dem nichts übergeben wird und der nichts tut. Es ist aber
möglich einen eigenen Konstruktor zu schreiben, der auch
Argumente erhalten kann, z.B.:
Hier wird nun ein String angelegt, der
mit dem Wert "Test" initialisiert wird. Ein Konstruktor
ist eigentlich dafür da, alles zu erledigen, was getan werden
muß, bevor man regulär mit der Instanz arbeiten kann,
z.B. könnte er Felder anlegen und ihnen Speicher zuweisen.
Der Konstruktor hat immer denselben Namen wie seine Klasse, z.B.
hat der im letzten Beispiel verwandte Konstruktor der Klasse String
den Prototyp:
Dabei ist "name" der methodeninterne
Bezeichner der übergebenen Variable. Es können auch
mehrere, durch Kommata getrennte Parameter übergeben werden.
Ist nun die Instanz angelegt, kann man
ihr z.B. sagen, sie soll ihren Inhalt in Kleinbuchstaben umwandeln.
Die entsprechende Methode heißt hier "toLowerCase()".
Sie erfordert keine Parameter. Der Aufruf besteht aus dem Namen
der Instanz und dem Methodennamen, welche durch einen Punkt getrennt
werden, also z.B.:
Die Methode liefert einen String zurück,
den man dann z.B. auf den Bildschirm ausgeben oder einer Stringvariablen
zuweisen kann. Können innerhalb einer Methode Ausnahmen (Exceptions)
auftreten, z.B. ein Lesefehler während einem Ladevorgang
oder ein Feldzugriff über die definierten Grenzen hinaus,
so muß diese entweder behandelt oder mittels throws-Audruck
an die aufrufende Funktion weitergegeben werden.
Java kennt nur einen Call-by-value,
ein Call-by-Reference ist nur über den Umweg mit Objekten
möglich, da ein direkter Zugriff über Pointer nicht
möglich ist. Eine Variable ohne Wert, z.B. ein ungültiger
String der zurückgeliefert werden soll, hat den Wert "null".
Man kann in nicht-statischen Methoden
auch Funktionen der übergeordneten oder der aktuellen Klasse
mit super.methode() bzw. this.methode() aufrufen.
Wird der Block verlassen, in dem die
Instanz definiert wurde, wird sie automatisch freigegeben, ein
explizites freigeben wie in C++ sind nicht nötig. Trotzdem
kann ein Destruktor in folgender Form programmiert werden:
Der Destruktor wird unmittelbar vor
dem Zerstören des Objektes aufgerufen.
Modifier beschreiben spezielle Eigenschaften von Klassen,
Variablen, Methoden...
Die meisten von Ihnen existieren aus
Sicherheitsgründen, aber viele haben auch einen starken Einfluß
auf Codegröße und Performance. Standardmäßig
ist eine Variable im aktuellen Package zugänglich.
synchronized
Methoden, die Engpaßstellen darstellen
werden nur exklusiv ausgeführt. So wird verhindert, daß
z.B. ein nur halb aktualisierter Eintrag in einer Datenbank gelesen
wird.
final
Finale (endgültige) Variablen sind
Konstanten. Finale Methoden können durch keine neue Implementation
in Subklassen mehr überschrieben werden und von finalen Klassen
dürfen keine Subklassen mehr gebildet werden. Da man z.B.
finale Methoden in Subklassen nicht überschreiben kann, sollten
Passwortabfragen final deklariert werden, außerdem kann
der Compiler finalen Code besser optimieren.
abstract
Abstrakte Klassen dürfen abstrakte
(unvollständig implementierte) Methoden besitzen. Diese müssen
dann Subklassen implementieren. Abstrakte Klassen können
nicht instantiiert werden.
static
static- Variablen (Klassenvariablen)
und Methoden (implizit final!) gibt es im Gegensatz zu Instanzvariablen
nur je einmal pro Klasse und nicht je einmal pro Instanz. Static-Methoden
können auch nur mit static-Variablen und Methoden arbeiten.
public
Öffentliche Klassen, Methoden und
Variablen sind überall zugänglich, also sowohl importiert
als auch in Subklassen.
private
Diese Variable oder Methode ist nur
innerhalb der aktuellen Klasse verfügbar und wird auch nicht
mitvererbt.
protected
Diese Variable oder Methode ist nur
innerhalb der aktuellen Klasse und deren Subklassen verfügbar.
transient
Dieser Modifier wird derzeit noch nicht
benutzt und in ist späteren Versionen für Low-Level-Funktionen
und Datenbankzugriffe gedacht.
volatile
Dieser Modifier kennzeichnet, daß
eine Variable asynchron aktualisiert wird und überwacht Operationen
damit besonders.
native
Eine solche Methode wird nicht in Java-Code,
sondern in Assembler oder C implementiert (nicht portabel). Siehe
dazu die javah-Dokumentation.
Hier finden Sie die kontextfreie Grammatik in der Backus-Naur-Form.
CompilationUnit ::= PackageStatement CompilationBody | CompilationBody
PackageStatement ::= 'package' PackageName ';'
CompilationBody ::= ImportStatementList TypeDeclarationList | TypeDeclarationList | ImportStatementList
ImportStatementList ::= ImportStatementList ImportStatement | ImportStatement
ImportStatement ::= 'import' PackageName '.''*'';' | 'import' ClassName ';' | 'import' InterfaceName ';'
TypeDeclarationList ::= TypeDeclarationList TypeDeclaration | TypeDeclaration
TypeDeclaration ::= ClassDeclaration | InterfaceDeclaration | ';'
ClassDeclaration ::= OptionalModifierList 'class' Identifier SuperClassReference ImplementationReference '{' FieldDeclarationList '}'
SuperClassReference ::= 'extends' ClassName | ;
ImplementationReference ::= 'implements' InterfaceList |
InterfaceList ::= InterfaceList ',' InterfaceName | InterfaceName
FieldDeclarationList ::= FieldDeclarationList FieldDeclaration | FieldDeclaration
FieldDeclaration ::= OptionalDocComment MethodDeclaration | OptionalDocComment ConstructorDeclaration | OptionalDocComment VariableDeclaration | StaticInitializer | ';'
OptionalDocComment ::= DocComment |
MethodDeclaration ::= OptionalModifierlist Type Identifier '(' OptionalParameterList ')' OptionalArrayDeclaratorList OptionalThrowsClause '{' Statement '}' | OptionalModifierlist Type Identifier '(' OptionalParameterList ')' OptionalArrayDeclaratorList OptionalThrowsClause ';'
OptionalArrayDeclaratorList ::= ArrayDeclaratorList |
ArrayDeclaratorList ::= ArrayDeclaratorList '['']' | '['']'
OptionalThrowsClause ::= 'throws' ThrowableList |
ThrowableList ::= Identifier | Identifier , ThrowableList
ConstructorDeclaration ::= OptionalModifierList Type Identifier '(' OptionalParameterList ')' '{' OptionalStatement '}'
VariableDeclaration ::= OptionalModifierList Type VariableDeclaratorList ';'
VariableDeclaratorList ::= VariableDeclaratorList ','VariableDeclarator | VariableDeclarator
VariableDeclarator ::= Identifier ArrayDeclaratorList | Identifier ArrayDeclaratorList '=' VariableInitializer
VariableInitializer ::= Expression | '{' '}' | '{'VariableInitializerList '}' | '{'VariableInitializerList ',''}'
VariableInitializerList ::= VariableInitializerList ',' VariableInitializer | VariableInitializer
StaticInitializer ::= 'static' '{' Statement '}'
OptionalParameterList ::= ParameterList |
ParameterList ::= ParameterList ','Parameter | Parameter
Parameter ::= TypeSpecifier Identifier ArrayDeclaratorList | TypeSpecifier Identifier
StatementList ::= StatementList Statement | Statement
Statement ::= VariableDeclaration | Expression ';' | '{' StatementList '}' | '{' '}' | 'if' '(' Expression ')'Statement | 'if' '(' Expression ')' 'else'Statement | 'while' '(' Expression ')'Statement | 'do' Statement 'while' '(' Expression ')' | 'try' Statement CatchStatementList | 'try' Statement CatchStatementList 'finally' Statement | 'switch' '(' Expression ')' '{' StatementList '}' | 'synchronized' '(' Expression ')' Statement | 'return' Expression ';' | 'return' ';' | 'throw' Expression ';' | 'case' Expression ':' | 'default' ':' | Identifier ':' Statement | 'break' ';' | 'break' Identifier ';' XXX | 'continue' ';' | 'continue'Identifier ';' XXX | ';'
CatchStatementList ::= CatchStatementList 'catch''(' Parameter ')'Statement | 'catch''(' Parameter ')'Statement
Expression ::= Expression '+'Expression | Expression '-' Expression | Expression '*' Expression | Expression '/' Expression | Expression '%' Expression | Expression '^' Expression | Expression '&' Expression | Expression '|' Expression | Expression '&&' Expression | Expression '||' Expression | Expression '<<' Expression | Expression '>>' Expression | Expression '>>>' Expression | Expression '=' Expression | Expression '+=' Expression | Expression '-=' Expression | Expression '*=' Expression | Expression '/=' Expression | Expression '%=' Expression | Expression '^=' Expression | Expression '|=' Expression | Expression '>>=' Expression | Expression '<<=' Expression | Expression ''>>>=' Expression | Expression '<' Expression | Expression '>' Expression | Expression '<=' Expression | Expression '>=' Expression | Expression '==' Expression | Expression '!=' Expression | Expression '.' Expression | Expression ',' Expression | Expression 'instanceof' ( ClassName | InterfaceName ) | Expression '?' Expression ':' Expression | Expression '[' Expression ']' | '++' Expression | '--' Expression | Expression '++' | Expression '--' | '-' Expression | '!' Expression | '~' Expression | '(' Expression ')' | '(' Type ')' Expression | Expression '(' ArgumentList ')' | Expression '(' ')' | 'new' ClassName '(' ')' | 'new' ClassName '(' ArgumentList ')' | 'new' TypeSpecifier ArrayExpressionList | 'new' TypeSpecifier ArrayExpressionList ArrayDeclaratorList | 'new' '(' Expression ')' | 'true' | 'false' | 'null' | 'super' | 'this' | Identifier | Number | String | Character
ArrayExpressionList ::= '[' Expression ']'ArrayExpressionList | '[' Expression ']'
ArgumentList ::= Expression ','ArgumentList | Expression
Type ::= TypeSpecifier | TypeSpecifier ArrayDeclaratorList
TypeSpecifier ::= 'boolean' | 'byte' | 'char' | 'short' | 'int' | 'float' | 'long' | 'double' | ClassName | InterfaceName
OptionalModifierList ::= ModifierList |
ModifierList ::= ModifierList Modifier | ModifierList
Modifier ::= 'public' | 'private' | 'protected' | 'static' | 'final' | 'native' | 'synchronized' | 'abstract' | 'threadsafe' | 'transient'
PackageName ::= Identifier | PackageName '.'Identifier
ClassName ::= Identifier | PackageName '.'Identifier
InterfaceName ::= Identifier | PackageName '.'Identifier
Character ::= 'a' | 'b' | ... | 'A' | 'B' | ...
Digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
Number ::= {Digit}
Special ::= '$' | '_' | '%' | ...
Identifier ::= Character | Special {Character | Special | Digit}
Java unterscheidet zwei Arten von
ausführbaren Programmen.
Diese Besonderheit wurde eingeführt,
um auf der einen Seite eine vollwertige Programmiersprache zu
schaffen, die alle Aufgaben von C übernehmen kann und auf
der anderen Seite trotzdem Sicherheitsmechanismen für Internetanwendungen
enthält.
Applications sind vollwertige Programme,
wie man sie von C her gewohnt ist.
Es gibt eine main()-Funktion, mit der
das Programm gestartet wird. Applications können ganz normal
auf lokale Dateien zugreifen und man kann praktisch jede Anwendung
umsetzen. Sie müssen nicht wie Applets Subklassen von anderen
Klassen darstellen oder auf bestimmte Botschaften reagieren und
besitzen keinen festgelegten Kontext. Für das Erlernen der
Programmiersprache und erste ernsthafte Anwendungen sind Applications
ideal, weshalb ihnen das gesamte nächste Kapitel gewidmet
ist.
Applets sind Internet-Programme,
die keine main()-Funktion besitzen.
Sie werden über den Applet-Tag
in HTML-Seiten eingebettet. Zum Starten der Programme ist daher
ein W3-Browser nötig, der das Gerüst für das Applet
bildet. Es wird eine Benutzeroberfläche aufgebaut und dann
auf Ereignisse (Events) wie z.B. Mausklicks gewartet. Vor dem
Ausführen werden die Programme gründlich auf Sicherheitsrisiken
untersucht und wenn nötig abgebrochen. Applets dürfen
nicht auf lokale Dateien zugreifen und auch nur mit dem Server
kommunizieren, von dem Sie geladen wurden. Durch das streng Reglement
kann kein Applet die ganze Maschine zum Absturz bringen oder vertrauliche
Daten an fremde Rechner schicken. Beispiele für Applets,
die sich mit Grafik, Menüs, Klangausgabe und anderem befassen,
finden sich im Demos-Verzeichnis des JDKs, eine genaue Betrachtung
dessen würde den Rahmen dieses Skripts sprengen.
Appletcations sind eine Mischform
aus beidem.
Der Begriff taucht nur sehr selten auf.
Im wesentlichen handelt es sich um Programme, die man sowohl als
Applet als auch als Application starten kann, danach richten sich
dann die Einschränkungen. Ein Beispiel dafür findet
sich auch im dritten Kapitel.
Copyright für Texte, Programme und Design 1997 by Dirk Schönfuß
WWW: http://rcswww.urz.tu-dresden.de/~schoenfu
e-mail: schoenfu@rcs.urz.tu-dresden.de