2. Die Programmiersprache Java

Im folgenden Kapitel geht es um Besonderheiten der Sprache, wie Schlüsselwörter, Operatoren und die Klassenbibliothek.


[ 2.1 ], [ 2.2 ], [ 2.3 ], [ 2.4 ], [ 2.5 ], [ 2.6 ], [ 2.7 ], [ 2.8 ], [ 2.9 ], [ © ]

2.1. Die Java-Tools

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.

Allgemeines:

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

RMI Tools

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

Internationalization Tools

native2ascii - konvertiert Text ins Unicode-Format

JAR Tool

jar - Packer, der es erlaubt, mehrere Klassen und Ressourcen in einer Datei zu speichern

Digital Signing Tool

javakey - erzeugt digitale Unterschriften für Archive und verwaltet Schlüssel


2.2. Unterschiede zu C und C++

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.


2.3. Schlüsselwörter, Datentypen und Operatoren

Java ist eine Fusion von vier Arten der Programmierung.
Object orientedlike Smalltalk
Numericlike FORTRAN
Systemslike C
Distributedlike 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 Castingnew (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 + Yaddieren oder verketten
X - Ysubstrahieren
X * Ymultiplizieren
X / Ydividieren
X % Ymodulus
X ^ Yexklusiv or
X & Ybit and
X | Ybit or
X && Ylogisches and
X || Ylogisches or
X << YLinksverschiebung
X >> YRechtsverschiebung
X >>> Yvorzeichenlose Rechtsverschiebung
X = YZuweisung
X += YSumme zuweisen
X -= YDifferenz zuweisen
X *= YProdukt zuweisen
X /= YQuotient zuweisen
X %= YModulus zuweisen
X ^= Yxor zuweisen
X &= Ybit and zuweisen
X |= Ybit or zuweisen
X <<= YLinksverschiebung zuweisen
X >>= YRechtsverschiebung zuweisen
X >>>= Yvorzeichenl Rechtsversch. zuweisen
X < Ykleiner als
X > Ygrößer als
X <= Ykleiner gleich
X >= Ygrößer gleich
X == Ygleich
X!= Y ungleich
X.Yz.B.: java.lang.String
X, YVerkettung
X instanceof Y Subklasse?
X ? Y: Z if then else
X++inkrementieren postfix
X --dekrementieren postfix
++ Xinkrementieren präfix
-- Xdekrementieren präfix
! Xnicht
(X)Vorrang
(Typ)XCasting
new Xneue Instanz

einfache Datentypen
TypInhaltInit bitWertebereich
booleantrue oder falsefalse 1keine Angaben
charUnicode-Zeichen\\u0000 16\\u0000 bis \\uFFFF
byteInteger mit Vorzeichen0 8-128 bis 127
shortInteger mit Vorzeichen0 16-32768 bis 32767
int Integer mit Vorzeichen0 32-2147483648 bis 2147483647
long Integer mit Vorzeichen0 64-9223372036854775808 bis 9223372036854775807
floatIEEE 754 Fließkomma0.0 321.40239846E-45 bis 3.40282347E+38
doubleIEEE 754 Fließkomma0.0 644.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:
DarstellungBedeutung
\nnew line
\rcariage return
\bbackspace
\ttabulator
\fform feed
\'Hochkomma
\"Anführungszeichen
\\backslash
\uXXXXUnicode-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ängselBeispielZahlensystem
kein1234dezimal
00123oktal
0x0x4Fhexadezimal


2.4. Ablaufstrukturtypen

Kurzzusammenfassung Flußkontrolle
ArtSchlüsselwort
Entscheidungif-else, switch-case
Schleifefor, while, do-while
Ausnahmetry-catch-finally, throw
anderesbreak, continue, label:, return

Java bietet hier in etwa die gleichen Möglichkeiten wie C++.

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.


2.5. Das Klassen-API

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
FarbeBedeutung
violettInstanzvariablen
blaustatic-Variablen
gelbKonstruktoren
rotInstanzmethoden
grünstatic-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


2.6. Klassen und Methoden

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.:

String dummy=new String();
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.:
String dummy=new String("Test");
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:
public String(String name)
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.:
dummy.toLowerCase();
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:
protected void finalize () throws throwable
Der Destruktor wird unmittelbar vor dem Zerstören des Objektes aufgerufen.


2.7. Modifier

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.

threadsafe
Durch dieses Schlüsselwort weiß der Compiler, daß die Variable nicht von mehreren Threads gleichzeitig manipuliert wird und wird versuchen, sie in einem Register statt einem Speicherplatz unterzubringen.

native
Eine solche Methode wird nicht in Java-Code, sondern in Assembler oder C implementiert (nicht portabel). Siehe dazu die javah-Dokumentation.


2.8. Sprachgrammatik

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}


2.9. Applets und Applications

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.


«« [ Inhalt ] »»

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