|
|
.JAVA GLOSSAR S
S
Sandbox
|
Das Sandbox-Konzept |
Traditionell wurde
in Java zwischen lokalem Code und solchem, der aus dem Netz
geladen wird, bezüglich seiner Sicherheitsanforderungen
rigoros unterschieden. Während lokalem Code (also Applikationen
und von der Festplatte geladenen Applets)
der Zugriff auf alle verfügbaren Ressourcen gestattet
ist, dürfen Applets, die
aus dem Netz geladen wurden, nur einen kleinen Teil davon
verwenden. Sie halten sich gewissermaßen in einem Sandkasten
auf, in dem sie nur ungefährliche Spielzeuge verwenden
und keinen ernsthaften Schaden anrichten können (daher
der Name »Sandbox«).
Zu den "gefährlichen Spielzeugen",
die nicht verwendet werden dürfen, zählen:
· der lesende und schreibende Zugriff
auf Dateien des lokalen Computers,
· das Öffnen von TCP/IP-Verbindungen
zu einem anderen als dem Host, von dem das Applet
geladen wurde,
· das Akzeptieren von TCP/IP-Verbindungen
auf privilegierten Portnummern,
· das Lesen benutzerbezogener System-Properties
wie "user.name", "user.home", "user.dir"
oder "java.home",
· das Erzeugen eines Top-Level-Fensters
ohne Warnhinweis,
· das Ausführen externer Programme,
· das Laden von System-Libraries,
· das Beenden der virtuellen Maschine.
Benötigte ein Applet
Zugriff auf diese Ressourcen, gab es im JDK 1.0 die Möglichkeit,
die zugehörigen Dateien auf der lokalen Festplatte abzulegen.
Denn wenn das Applet zur Ausführung nicht aus dem Netz,
sondern aus den lokalen Dateien gestartet wurde, galt es automatisch
als vertrauenswürdig und hatte Zugriff auf alle ansonsten
verbotenen Ressourcen.
[Serialisierung]
[Persistenz]
|
|
Unter Serialisierung
wollen wir die Fähigkeit verstehen, ein Objekt, das im
Hauptspeicher der Anwendung existiert, in ein Format zu konvertieren,
das es erlaubt, das Objekt in eine Datei zu schreiben oder
über eine Netzwerkverbindung zu transportieren. Dabei
wollen wir natürlich auch den umgekehrten Weg einschließen,
also das Rekonstruieren eines in serialisierter Form vorliegenden
Objekts in das interne Format der laufenden Java-Maschine.
[ Persistenz] |
|
Zeitgleich zur Diskussion
um die Eignung Javas als Entwicklungswerkzeug für grafische
Oberflächen hat sich bereits ein Wandel auf der Serverseite
angedeutet. Mit dem Servlet-API und den Java Server Pages
haben sich beispielsweise im Bereich der Generierung dynamischer
Web-Seiten Techniken etabliert, die dem traditionellen CGI-Scripting
starke Konkurrenz machen. Daneben setzen große Softwarehersteller
auf mehrschichtige Client-Server-Architekturen mit Java-Unterstützung
(Oracle Financials, Star Office) oder statten ihre Datenbank-
oder Web-Server mit Java-Fähigkeiten aus (Oracle 8, Lotus
Domino, SUN Java Web Server, Apache jserv). In vielen Unternehmen
gibt es bereits verteilte Anwendungen auf der Basis von CORBA,
die auf die plattformübergreifenden Fähigkeiten
und die Binärkompatibilität von Java-Anwendungen
setzen. |
|
Innerhalb einer Methode
kann ein Name in verschiedenen Bedeutungen verwendet werden.
Erstens kann der Name die Methode selbst sein. Zweitens kann
eine lokale Variable definiert
werden, um drittens den Rückgabewert der parameterlosen
Version der Methode aufzunehmen. Der Compiler kann die Namen
in allen drei Fällen unterscheiden, denn er arbeitet
mit der Signatur der Methode. Unter der Signatur einer Methode
versteht man ihren internen Namen. Dieser setzt sich aus dem
nach außen sichtbaren Namen plus codierter Information
über die Reihenfolge und Typen der formalen Parameter
zusammen. Die Signaturen zweier gleichnamiger Methoden
sind also immer dann unterscheidbar, wenn sie sich wenigstens
in einem Parameter voneinander unterscheiden. |
|
Elemente, die ohne
einen der drei bekannten Modifier deklariert wurden, werden
als package scoped oder Elemente
mit Standard-Sichtbarkeit bezeichnet. Sie sind nur innerhalb
des Pakets sichtbar, zu dem diese
Klasse gehört. In anderen Paketen
sind sie dagegen unsichtbar. |
|
Variablen
und Methoden mit dem Attribut
static sind nicht an die Existenz eines konkreten Objekts
gebunden, sondern existieren vom Laden der Klasse bis zum
Beenden des Programms. Das static-Attribut beeinflusst bei
Membervariablen ihre Lebensdauer
und erlaubt bei Methoden den
Aufruf, ohne dass der Aufrufer ein Objekt der Klasse besitzt,
in der die Methode definiert wurde. Wird das Attribut static
nicht verwendet, so sind Variablen
innerhalb einer Klasse immer an eine konkrete Instanz gebunden.
Ihre Lebensdauer beginnt mit dem Anlegen des Objekts und dem
Aufruf eines Konstruktors und
endet mit der Freigabe des Objekts durch den Garbage Collector.
[ Klassenmethoden, Klassenvariablen] |
|
Statische Konstruktoren
|
static
|
Nicht nur statischen
Variablen kann während der Deklaration ein Wert zugewiesen
werden. Falls komplexere Initialisierungen
benötigt werden, können zur Initialisierung
von statischen Variablen statische Konstruktoren
definiert werden. Sie ähneln gewöhnlichen Konstruktoren
und dienen wie diese dazu, Variablen
mit einem definierten Startwert zu belegen. Im Gegensatz zu
einem gewöhnlichen Konstruktor
erfolgt der Aufruf eines statischen Konstruktors aber nicht
mit jedem neu angelegten Objekt, sondern nur einmal, wenn
die Klasse geladen wird.
Es ist erlaubt, mehrere statische Konstruktoren innerhalb
einer Klasse zu definieren. Sie
werden dann nacheinander in der textuellen Reihenfolge ihrer
Deklaration ausgeführt. Wechseln sich initialisierte
statische Variablen und statische
Konstruktoren im Quelltext ab, werden beide gleichwertig behandelt,
d.h. die Ausführung erfolgt unabhängig vom Typ in
textueller Reihenfolge. Eine Ausnahme bilden lediglich die
statischen Variablen, denen Konstanten zugewiesen werden,
deren Wert bereits zur Compile-Zeit feststeht. Ihre Initialisierung
erfolgt - unabhängig von ihrer Position im Quellcode
- unmittelbar nach dem Laden der Klasse. |
|
Neben Klassenvariablen
gibt es in Java auch Klassenmethoden, d.h. Methoden,
die unabhängig von einer bestimmten Instanz existieren.
Sie werden auch als statische Methoden bezeichnet. Klassenmethoden
werden ebenfalls mit Hilfe des static-Attributs
deklariert und - analog zu Klassenvariablen
- durch Voranstellen des Klassennamens aufgerufen. |
|
Java ist eine konsequent
objektorientierte Sprache, in der es weder globale
Funktionen noch globale Variablen gibt. Da es aber mitunter
sinnvoll ist, Eigenschaften zu verwenden, die nicht an Instanzen
einer Klasse gebunden sind, haben die Sprachdesigner das Attribut
static für Methoden
und Variablen eingeführt.
Eine Variable, die innerhalb einer Klasse mit dem Attribut
static versehen wurde, nennt man
Klassenvariable (oder auch Statische
Variable). Im Gegensatz zu Instanzvariablen,
die immer an ein konkretes Objekt gebunden sind, existieren
Klassenvariablen unabhängig
von einem Objekt. |
|
Eines der wichtigsten
Elemente der Klassenbibliothek ist die Klasse String, die
Java-Implementierung von Zeichenketten. String bietet eine
Vielzahl wichtiger Methoden zur
Manipulation und zum Zugriff auf Zeichenketten, wie beispielsweise
Operationen für numerische Konvertierungen, Zeichen-
und Teilstringextraktion sowie für Textsuche und Stringvergleich.
Die Klasse String ist zwar wie eine gewöhnliche
Klasse in der Laufzeitbibliothek von Java vorhanden. Der Compiler
hat aber Kenntnisse über den inneren Aufbau von Strings
und generiert bei Stringoperationen Code, der auf Methoden
der Klassen String und StringBuffer
zugreift.
Wie in allen anderen Programmiersprachen
gibt es auch in Java Zeichenketten. Ähnlich wie in C
und C++ kennt der Compiler nur einige ihrer elementaren Eigenschaften
und überlässt der Laufzeitbibliothek einen Großteil
der Implementierung.
In Java werden Zeichenketten durch die Klasse
String repräsentiert. Sie bietet Methoden
zum Erzeugen von Zeichenketten, zur Extraktion von Teilstrings,
zum Vergleich mit anderen Strings und zur Erzeugung von Strings
aus primitiven Typen. Der Compiler erkennt und interpretiert
String-Literale und ist in der
Lage, String-Objekte zu erzeugen und zu verketten.
Eine Zeichenkette hat in Java prinzipiell
dieselbe Bedeutung wie in anderen Sprachen. Als Reihung von
Elementen des Typs char ist sie die wichtigste Datenstruktur
für alle Aufgaben, die etwas mit der Ein- und Ausgabe
oder der Verarbeitung von Zeichen zu tun haben. Da der char-Typ
in Java durch ein Unicode-Zeichen repräsentiert wird,
besteht auch ein String aus einer Kette von Unicode-Zeichen.
Abgesehen davon, dass er dadurch doppelt soviel Speicher belegt
wie ein ASCII-String, braucht man sich darüber aber nicht
allzu viele Gedanken zu machen. Wegen der Kompatibilität
zwischen Unicode-Standard und ASCII-Zeichensatz sind die Unterschiede
bei der normalen Verwendung von Strings ohne Belang.
Anders als in C braucht der Java-Programmierer
keine Kenntnisse über den internen Aufbau von Strings
zu haben. Insbesondere ist nicht davon auszugehen, dass ein
String durch ein nullterminiertes
Array von char-Elementen dargestellt wird. Natürlich
heißt dies nicht, dass die interne Struktur von Strings
vollkommen anonym ist, denn sowohl Compiler als auch Laufzeitsystem
müssen sie kennen. Für den Programmierer, der lediglich
Java-Programme schreiben will, ist sie aber bedeutungslos.
|
|
Bei der Kommunikation
mit RMI hat der Client den Eindruck,
Methoden von Objekten aufzurufen,
die auf dem Server liegen. In Wirklichkeit liegen die Dinge
natürlich etwas komplizierter, denn der Client hat von
der RMI-Registry lediglich ein
Stub-Objekt erhalten, und das Remote-Objekt hat den Server
nicht wirklich verlassen. Ein Stub ist eine Klasse,
die - wie das implementierende Remote-Objekt - das Remote- Interface
implementiert und daher für den Client als Platzhalter
für den Zugriff auf das Remote-Objekt dient.
Der Stub kommuniziert über eine TCP-Verbindung
mit dem als Skeleton bezeichneten Gegenstück auf der
Server-Seite. Das Skeleton kennt das tatsächliche Applikationsobjekt,
leitet die Anfragen des Stubs an dieses weiter und gibt den
Rückgabewert an ihn zurück. Stub und Skeleton werden
während der Entwicklung mit Hilfe eines Tools generiert
und verbergen die komplizierten Details der Kommunikation
zwischen Server und Client.
|
|
super
|
Superklassenkonstruktor
|
Falls als erste Anweisung
innerhalb eines Konstruktors
ein Aufruf der Methode super steht, wird dies als Aufruf des
Superklassenkonstruktors interpretiert. super wird wie eine
normale Methode verwendet und kann mit oder ohne Parameter
aufgerufen werden. Der Aufruf muss natürlich zu einem
in der Superklasse definierten Konstruktor
passen.
Falls als erste Anweisung im Konstruktor
kein Aufruf von super steht, setzt der Compiler an dieser
Stelle einen impliziten Aufruf super(); ein und ruft damit
den parameterlosen Konstruktor
der Vaterklasse auf. Falls ein
solcher Konstruktor in der Vaterklasse
nicht definiert wurde, gibt es einen Compiler-Fehler. Das
ist genau dann der Fall, wenn in der Superklassendeklaration
lediglich parametrisierte Konstruktoren
angegeben wurden und daher ein parameterloser default-Konstruktor
nicht automatisch erzeugt wurde.
Alternativ zu diesen beiden Varianten, einen
Superklassenkonstruktor aufzurufen, ist es auch erlaubt, mit
Hilfe der this-Methode einen
anderen Konstruktor der eigenen
Klasse aufzurufen. Um die oben erwähnten Zusagen einzuhalten,
muss dieser allerdings selbst direkt oder indirekt schließlich
einen Superklassenkonstruktor
aufrufen.
|
|
Die Ausdrücke
in Java entsprechen weitgehend denen von C und C++. Java besitzt
eine if-Anweisung, eine while-, do- und for-Schleife und ein
switch-Statement. Es gibt die von C bekannten break- und continue-Anweisungen
in normaler und mit einem Label versehenen Form. Letztere
ermöglicht es, mehr als eine Schleifengrenze zu überspringen.
Java besitzt allerdings kein allgemeines goto-Statement. Variablendeklarationen
werden wie in C++ als Anweisungen angesehen und können
an beliebiger Stelle innerhalb des Code-Parts eines Programms
auftauchen.
Verzweigungen in Java dienen wie in allen
Programmiersprachen dazu, bestimmte Programmteile nur beim
Eintreten vorgegebener Bedingungen, die erst zur Laufzeit
bekannt werden, auszuführen. An Verzweigungen bietet
Java die if- und if-else-Anweisung sowie die switch-Anweisung.
Die switch-Anweisung ist eine Mehrfachverzweigung.
Zunächst wird der Ausdruck ausdruck, der vom Typ byte,
short, char oder int sein muß, ausgewertet. In Abhängigkeit
vom Ergebnis wird dann die Sprungmarke angesprungen, deren
Konstante mit dem Ergebnis des Ausdrucks übereinstimmt.
Die Konstante und der Ausdruck müssen dabei zuweisungskompatibel
sein.
Das optionale default-Label wird dann angesprungen,
wenn keine passende Sprungmarke gefunden wird. Ist kein default-Label
vorhanden und wird auch keine passende Sprungmarke gefunden,
so wird keine der Anweisungen innerhalb der switch-Anweisung
ausgeführt. Jede Konstante eines case-Labels
darf nur einmal auftauchen. Das default-Label
darf maximal einmal verwendet werden.
Nachdem ein case-
oder default-Label angesprungen
wurde, werden alle dahinterstehenden Anweisungen ausgeführt.
Im Gegensatz zu Sprachen wie PASCAL erfolgt auch dann keine
Unterbrechung, wenn das nächste Label erreicht wird.
Wenn dies erwünscht ist, muss der Kontrollfluß
wie in C und C++ mit Hilfe einer break-Anweisung unterbrochen
werden. Jedes break innerhalb einer switch-Anweisung führt
dazu, dass zum Ende der switch-Anweisung verzweigt wird.
Wie aus den bisherigen Ausführungen
deutlich wurde, ist die Semantik der switch-Anweisung in Java
der in C und C++ sehr ähnlich. Ein wichtiger Unterschied
besteht darin, dass in Java alle Anweisungen, die unmittelbar
innerhalb des switch liegen, case-
oder default-Labels sein müssen.
Der Trick, in switch-Anweisungen Schleifen zu packen, die
sich über mehrere Labels erstrecken, funktioniert in
Java nicht.
|
|
Das Swing Toolset
stellt eine Reihe zusätzlicher Dialogelemente zur Verfügung
und ermöglicht die Konstruktion sehr komplexer grafischer
Oberflächen. Mit seinem Pluggable Look-and-Feel bietet
es die Möglichkeit, das Look-and-Feel eines Programmes
zur Laufzeit umzuschalten und den Bedürfnissen des jeweiligen
Benutzers und den Fähigkeiten der Systemumgebung anzupassen.
Neben dem AWT gibt es eine zweite Bibliothek
für die Gestaltung grafischer Benutzeroberflächen.
Sie heißt Swing, ist seit dem JDK 1.1 als Add-On verfügbar
und seit der Version 1.1 fester Bestandteil des Java Development
Kit. Da Swing-Anwendungen in ihren Möglichkeiten weit
über das hinausgehen, was das AWT bietet, werden heute
die meisten GUI-Programme mit Swing geschrieben.
|
|
Quelle: Java - Glossary zusammengestellt aus „Go To Java 2“,
Zweite Auflage, Addison Wesley, Version 2.0 © 2000 Guido Krüger
|
|