|
|
.JAVA GLOSSAR A-E
A
In Java ist es möglich, abstrakte
Methoden zu definieren. Im Gegensatz
zu den konkreten Methoden enthalten
sie nur die Deklaration der Methode, nicht aber ihre Implementierung.
Syntaktisch unterscheiden sich abstrakte Methoden dadurch,
dass anstelle der geschweiften Klammern mit den auszuführenden
Anweisungen lediglich ein Semikolon steht. Zusätzlich
wird die Methode mit dem Attribut
abstract versehen. Abstrakte Methoden können nicht aufgerufen
werden, sie definieren nur eine Schnittstelle. Erst durch
Überlagerung in einer abgeleiteten Klasse und Implementierung
des fehlenden Methodenrumpfes wird eine abstrakte Klasse konkret
und kann aufgerufen werden.
Eine Klasse, die mindestens eine abstrakte
Methode enthält, wird selbst als abstrakt angesehen und
muss ebenfalls mit dem Schlüsselwort abstract versehen
werden. Abstrakte Klassen können nicht instanziert werden,
da sie Methoden enthalten, die
nicht implementiert wurden. Statt dessen werden abstrakte
Klassen abgeleitet, und in der abgeleiteten Klasse werden
eine oder mehrere der abstrakten Methoden
implementiert. Eine abstrakte Klasse wird konkret, wenn alle
ihre Methoden implementiert sind.
Die Konkretisierung kann dabei auch schrittweise über
mehrere Vererbungsstufen erfolgen.
Eine Klasse kann ein Interface auch dann
implementieren, wenn sie nicht alle seine Methoden
implementiert. In diesem Fall ist die Klasse allerdings als
abstract zu deklarieren und kann nicht dazu verwendet werden,
Objekte zu instanzieren. |
|
Eine Adapterklasse in Java ist eine Klasse, die ein vorgegebenes
Interface mit leeren Methodenrümpfen
implementiert. Adapterklassen können verwendet werden,
wenn aus einem Interface lediglich
ein Teil der Methoden benötigt
wird, der Rest aber uninteressant ist. In diesem Fall leitet
man einfach eine neue Klasse aus der Adapterklasse ab, anstatt
das zugehörige Interface
zu implementieren, und überlagert die benötigten
Methoden. Alle übrigen Methoden
des Interfaces werden von der
Basisklasse zur Verfügung gestellt.
Eine Adapterklasse implementiert ein Interface
mit mehreren Methoden und erlaubt
es somit abgeleiteten Klassen,
nur noch die Methoden zu überlagern,
die tatsächlich von Interesse sind
|
|
Die häufigste Anwendung lokaler Klassen
innerhalb von Methoden besteht
darin, diese anonym zu definieren. Dabei erhält die Klasse
keinen eigenen Namen, sondern Definition und Instanzierung
erfolgen in einer kombinierten Anweisung. Eine anonyme Klasse
ist also eine Einwegklasse, die nur einmal instanziert werden
kann. Anonyme Klassen werden normalerweise aus anderen Klassen
abgeleitet oder erweitern existierende Interfaces.
Ihre wichtigste Anwendung finden sie bei der Definition von
Listenern für graphische
Oberflächen.
Beispiel: Verwendung einer anonymen Klasse
als Ereignishandler: Die Verwendung einer anonymen Klasse,
die aus KeyAdapter abgeleitet wurde, kann als Ereignisempfänger
verwenet werden. Zum Instanzierungszeitpunkt erfolgt die Definition
der überlagernden Methode keyPressed, in der der Code
zur Reaktion auf das Drücken der Taste [ESC] untergebracht
wird.
Vorteilhaft bei dieser Vorgehensweise ist
der verminderte Aufwand, denn es muss keine separate Klassendefinition
angelegt werden. Statt dessen werden die wenigen Codezeilen,
die zur Anpassung der Adapterklasse
erforderlich sind, dort eingefügt, wo die Klasse instanziert
wird, nämlich beim Registrieren des Nachrichtenempfängers.
Anonyme Klassen haben einen ähnlichen Einsatzbereich
wie lokale, empfehlen sich aber vor allem, wenn sehr wenig
Code für den Ereignisempfänger benötigt wird.
Bei aufwendigeren Ereignisempfängern ist die explizite
Definition einer benannten Klasse dagegen vorzuziehen.
|
|
Applets sind lauffähige Java-Programme.
Anders als Applikationen, werden
sie aus einer HTML-Seite heraus aufgerufen und benötigen
zur Ausführung einen Web-Browser (oder ein Hilfsprogramm
wie den Appletviewer, das sich in gewissem Sinne wie ein Web-Browser
verhält).
Das Hauptprogramm eines Applets wird immer
aus der Klasse Applet abgeleitet. Bei einer Applikation
ist es prinzipiell gleichgültig, woraus die Hauptklasse
abgeleitet wird.Applets werden nicht durch die Methode public
static void
main gestartet, sondern müssen
aus der Klasse Applet abgeleitet und nach deren Architekturmerkmalen
konstruiert werden. Zum Starten des Programms erzeugt der
Browser eine Instanz der abgeleiteten Klasse und ruft nacheinander
eine Reihe vordefinierter Callback-Methoden auf. Callback-Methoden
sind Methoden, die von der abgeleiteten
Klasse zur Verfügung gestellt und vom Browser oder AppletViewer
aufgerufen werden.
Die für die Entwicklung von Applets
wichtige Klasse Applet ist eine direkte Unterklasse von Panel.
Sie erweitert zwar die Funktionalität der Klasse Panel
um Methoden, die für das
Ausführen von Applets von Bedeutung sind, bleibt aber
letzlich ein Programmelement, das eine Größe und
Position hat, auf Ereignisse reagieren kann und in der Lage
ist, weitere Komponenten aufzunehmen. Einerseits ist es bemerkenswert,
daß eine Klasse wie Applet, die für eine riesige
Zahl von Anwendungen von elementarer Bedeutung ist, ganz unten
in der Vererbungskette eines
stark spezialisierten Zweigs der Klassenhierarchie steht.
Andererseits liefert die Klasse Applet jedoch mit der vorstehenden
Beschreibung eine nahezu perfekte Charakterisierung von Applets.
Im Gegensatz zu den eingeschränkten
Möglichkeiten, die Script-Sprachen wie JavaScript bieten,
sind Applets vollständige Java-Programme, die alle Merkmale
der Sprache nutzen können. Insbesondere besitzt ein Applet
alle Eigenschaften eines grafischen Ausgabefensters und kann
zur Anzeige von Text, Grafik und Dialogelementen verwendet
werden. Einer der großen Vorteile von Applets gegenüber
herkömmlichen Programmen ist ihre einfache Distributierbarkeit.
Anstelle explizit auszuführender Installationsroutinen
lädt der Classloader des Browsers die Bestandteile eines
Applets einfach aus dem Netz und führt sie direkt aus.
Das ist vor allem bei kleineren und mittelgroßen Anwendungen
in einer lokalen Netzwerkumgebung sehr hilfreich, insbesondere
wenn diese sich häufig ändern.
Sicherheit war eines der wichtigsten Designziele
bei der Entwicklung von Java, und es gibt eine ganze Reihe
von Sicherheitsmechanismen, die verhindern sollen, dass Java-Applets
während ihrer Ausführung Schaden anrichten. So ist
es einem Applet, das in einem Web-Browser läuft, beispielsweise
nicht erlaubt, Dateioperationen auf dem lokalen Rechner durchzuführen
oder externe Programme zu starten.
Tatsächlich unterscheiden sich Applets
und Applikationen gar nicht so
stark voneinander, wie man vermuten könnte. Bis auf wenige
Ausnahmen werden sie mit denselben Werkzeugen und Techniken
konstruiert. Vereinfacht kann man sagen, dass Java-Applikationen
eigenständige Programme sind, die zur Ausführung
den Stand-Alone-Java-Interpreter benötigen, während
Java-Applets aus HTML-Seiten heraus aufgerufen werden und
zur Ausführung einen Web-Browser benötigen.
Die wichtigsten Unterschiede kann man in
einer kurzen Liste zusammenfassen:
· Das Hauptprogramm eines Applets
wird immer aus der Klasse Applet abgeleitet. Bei einer Applikation
ist es prinzipiell gleichgültig, woraus die Hauptklasse
abgeleitet wird.
· Eine Applikation
wird gestartet, indem vom Java-Interpreter die Klassenmethode
main aufgerufen wird. Das Starten
eines Applets wird dadurch erreicht, daß der Web-Browser
die Applet-Klasse instanziert und die Methoden
init und start aufruft.
· Aus Sicherheitsgründen darf
ein Applet in der Regel weder auf Dateien des lokalen Rechners
zugreifen noch externe Programme auf diesem starten. Eine
Ausnahme bilden signierte Applets. Für eine Applikation
gelten diese Beschränkungen nicht.
· Ein Applet arbeitet immer grafik-
und ereignisorientiert. Bei einer Applikation
dagegen ist es möglich, auf die Verwendung des AWT zu
verzichten und alle Ein-/Ausgaben textorientiert zu erledigen.
· Applets bieten einige zusätzliche
Möglichkeiten im Bereich des Benutzerschnittstellen-Designs,
die so bei Applikationen nicht
ohne weiteres zu finden sind. Die Ausgabe von Sound beispielsweise
ist standardmäßig auf Applets beschränkt.
|
|
Applikationen bilden eigenständige
Programme in Java. Sie benötigen keinen Browser zur Ausführung,
sondern nur den Java-Interpreter und die . class-Files
der verwendeten Klassen.
Technisch betrachtet ist eine Applikation
nicht mehr als eine einzelne Klasse, in der eine Methode vom
Typ public static
void main
definiert wurde. Jede Klasse, die eine solche Methode enthält,
kann als Applikation verwendet werden.
Durch einfaches Hinzufügen einer Methode
public static
void main
kann also jede beliebige Klasse sehr leicht in eine Applikation
verwandelt und vom Java-Interpreter aufgerufen werden. Dies
kann beispielsweise nützlich sein, um in Low-Level-Klassen,
die eigentlich nur als Dienstleister auftreten, eigenständig
ausführbaren Testcode unterzubringen, oder um eine solche
Klasse mit Benutzungshinweisen auszustatten, die der Entwickler
durch einfaches Starten der Klasse als Applikation abrufen
kann.
|
|
Applikations-Server
|
Mehrstufige Client-Server-Architekturen
|
Mit JDBC können sowohl zwei- als
auch drei- oder höherstufige Client-Server-Systeme aufgebaut
werden (Multi-Tier-Architekturen). Während bei den zweistufigen
Systemen eine Aufteilung der Applikation
in Datenbank (Server) und Arbeitsplatz (Client) vorgenommen
wird, gibt es bei den dreistufigen Systemen noch eine weitere
Schicht, die zwischen beiden Komponenten liegt. Sie wird gemeinhin
als Applikations-Server bezeichnet und dient dazu, komplexe
Operationen vom Arbeitsplatz weg zu verlagern. Der Applikations-Server
ist dazu mit dem Datenbank-Server verbunden und kommuniziert
mit diesem über ein standardisiertes Protokoll (z.B.
JDBC). Den Arbeitsplätzen stellt er dagegen höherwertige
Dienste (z.B. komplette Business-Transaktionen) zur Verfügung
und kommuniziert mit ihnen über ein spezielles Anwendungsprotokoll
(z.B. HTTP, RMI, CORBA oder andere). |
|
B
Ein Bezeichner ist eine Sequenz von Zeichen,
die dazu dient, die Namen von Variablen,
Klassen oder Methoden
zu spezifizieren. Ein Bezeichner in Java kann beliebig lang
sein, und alle Stellen sind signifikant. Bezeichner müssen
mit einem Unicode-Buchstaben beginnen (das sind die Zeichen
'A' bis 'Z', 'a' bis 'z', '_' und '$') und dürfen dann
weitere Buchstaben oder Ziffern enthalten. Unterstrich und
Dollarzeichen sollen nur aus historischen Gründen bzw.
bei maschinell generiertem Java-Code verwendet werden.
Ein Buchstabe im Sinne des Unicode-Zeichensatzes
muss nicht zwangsläufig aus dem lateinischen Alphabet
stammen. Es ist auch zulässig, Buchstaben aus anderen
Landessprachen zu verwenden. Java-Programme können daher
ohne weiteres Bezeichner enthalten, die nationalen Konventionen
folgen. Java-Bezeichner dürfen jedoch nicht mit Schlüsselwörtern,
den booleschen Literalen true
und false oder dem Literal null
kollidieren.
|
|
Mit boolean besitzt Java einen eigenen
logischen Datentyp und beseitigt damit eine oft diskutierte
Schwäche von C und C++. Der boolean-Typ muss zwangsweise
dort verwendet werden, wo ein logischer Operand erforderlich
ist. Ganzzahlige Typen mit den Werten 0 oder 1 dürfen
nicht als Ersatz für einen logischen Typen verwendet
werden.Der Datentyp boolean kennt zwei verschiedene Werte,
nämlich true und false.
Neben den vordefinierten Konstanten gibt es keine weiteren
Literale für logische Datentypen.Zu
beachten ist, dass der Testausdruck in der Schleife vom Typ
boolean sein muss. Anders als in C ist es in Java nicht erlaubt,
einen numerischen Ausdruck an seiner Stelle zu verwenden.
Wertebereich: true,
false; Standardwert: false
|
|
Java stellt vier ganzzahlige Datentypen
zur Verfügung, und zwar byte, short, int und long, mit
jeweils 1, 2, 4 und 8 Byte Länge. Alle ganzzahligen Typen
sind vorzeichenbehaftet, und ihre Länge ist auf allen
Plattformen gleich.
Wertebereich: -27...27-1; Standardwert: 0
|
|
C
Da Objektparameter im Gegensatz zu primitiven
Typen per Referenz übergeben werden, wären Wrapper-Klassen
prinzipiell geeignet, Methodenparameter per call by reference
zu übergeben. Damit könnten Änderungen von
primitiven Parametern an den Aufrufer zurückgegeben werden.
In der Praxis funktioniert das allerdings nicht, denn alle
vordefinierten Wrapper-Klassen
sind unveränderlich (das wird auch als immutable bezeichnet).
Sollen primitive Typen per Referenz übergeben
werden, bieten sich zwei Möglichkeiten an:
1. Der primitive Typ kann in einen eigenen
Wrapper verpackt werden, der das Ändern des Wertes erlaubt.
2. Der primitive Typ kann als Element eines
Array übergeben werden. Da Arrays Objekte sind und somit
stets per Referenz übergeben werden, sind Änderungen
an ihren Elementen auch für den Aufrufer sichtbar.
|
|
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
Kontrollfluss 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.
|
|
catch
|
Die try-catch-Anweisung
|
Der try-Block
enthält dabei eine oder mehrere Anweisungen, bei deren
Ausführung ein Fehler des Typs Ausnahmetyp auftreten kann.
In diesem Fall wird die normale Programmausführung unterbrochen,
und der Programmablauf fährt mit der ersten Anweisung nach
der catch-Klausel fort, die den passenden Ausnahmetyp deklariert
hat. Hier kann nun Code untergebracht werden, der eine angemessene
Reaktion auf den Fehler realisiert. [try] |
|
Eine Klassendefinition in Java wird durch
das Schlüsselwort class eingeleitet. Anschließend
folgt innerhalb von geschweiften Klammern eine beliebige Anzahl
an Variablen- und Methodendefinitionen. |
|
CLASSPATH
|
Laden von Klassen im JDK 1.2 und 1.3 |
Anders als in den Vorgängerversionen
benötigen die JDKs 1.2 und 1.3 bei einer Standardinstallation
unter Windows keine Umgebungsvariable CLASSPATH mehr, denn
die entsprechenden Informationen werden bei der Installation
in die Registry geschrieben (sie liegen in unterschiedlichen
Abschnitten, eine Suche nach »javasoft« hilft
weiter). Ist jedoch eine CLASSPATH-Variable vorhanden, wird
sie auch verwendet. Wird das JDK 1.2 oder 1.3 also über
eine 1.0er oder 1.1er Version installiert, muss dafür
gesorgt werden, dass eine eventuell gesetzte CLASSPATH-Variable
modifiziert oder entfernt wird. Es ist insbesondere häufig
passiert, dass durch falsches Setzen oder Nichtentfernen veralteter
Umgebungsvariablen die Systemklassen selbst nicht mehr gefunden
werden konnten und auf diese Weise das gesamte Laufzeitsystem
unbenutzbar wurde.
Um dem Compiler diese Art der Speicherung
der Klassendateien bekannt zu machen, muss in der CLASSPATH-Umgebungsvariable
nicht nur das Verzeichnis, sondern auch der Name der .zip-Datei
angegeben werden, z.B.:
CLASSPATH=.;c:\java\LIB\CLASSES.ZIP
Seit dem JDK 1.2 gibt es die Datei classes.zip nicht mehr.
Die Klassenbibliotheken liegen nun als .jar-Dateien (z.B.
rt.jar ) vor und befinden sich
im Unterverzeichnis jre\lib der
JDK-Installation. Wie zuvor erwähnt, werden sie unabhängig
vom Inhalt der CLASSPATH Umgebungsvariable gefunden.
Seit dem JDK 1.2 wurde daher die Bedeutung
der CLASSPATH-Umgebungsvariable dahingehend verändert,
dass sie nur noch zur Suche der benutzerspezifischen Klassen
verwendet wird. Alle Standardpakete
und Standarderweiterungen (beide zusammen werden seit dem
JDK 1.2 Bootstrap Classes genannt)
werden dagegen unabhängig vom CLASSPATH mit Hilfe der
auf das Installationsverzeichnis verweisenden Systemeigenschaft
sun.boot.class.path gefunden. Sie wird bei der JDK-Installation
automatisch gesetzt und sollte später nicht mehr verändert
werden. Der CLASSPATH braucht also nur noch dann explizit
gesetzt zu werden, wenn benutzerspezifische Klassen vorhanden
sind, die nicht im aktuellen Verzeichnis liegen (letzteres
wird ebenfalls automatisch durchsucht).
|
|
D
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
Kontrollfluss wie in C und C++ mit Hilfe einer break-Anweisung
unterbrochen werden.
|
|
E
extends
|
Ableiten einer Klasse
|
Um eine neue Klasse aus einer bestehenden
abzuleiten, ist im Kopf der Klasse mit Hilfe des Schlüsselworts
extends ein Verweis auf die Basisklasse anzugeben. Hierdurch
erbt die abgeleitete Klasse alle Eigenschaften der Basisklasse,
d.h. alle Variablen und alle
Methoden. Durch Hinzufügen
neuer Elemente oder Überladen
der vorhandenen kann die Funktionalität der abgeleiteten
Klasse erweitert werden.
Die Vererbung
von Klassen kann beliebig tief geschachtelt werden. Eine abgeleitete
Klasse erbt dabei jeweils die Eigenschaften der unmittelbaren
Vaterklasse, die ihrerseits die
Eigenschaften ihrer unmittelbaren Vaterklasse
erbt usw. Wir können also beispielsweise die Klasse
Cabrio verwenden, um daraus eine neue Klasse ZweisitzerCabrio
abzuleiten
Nicht jede Klasse darf zur Ableitung neuer
Klassen verwendet werden. Besitzt eine Klasse das Attribut
final, ist es nicht erlaubt, eine neue Klasse aus ihr abzuleiten.
|
|
Quelle: Java - Glossary zusammengestellt aus „Go To Java 2“,
Zweite Auflage, Addison Wesley, Version 2.0 © 2000 Guido Krüger
|
|