Eine Applikation ist ein Programm, das genau wie ein Programm
in einer anderen Programmiersprache (z. B. Pascal,
C, C++)
auf dem lokalen Rechner gestartet wird. Generell kann man aber nicht sagen, dass
Applikationen grundlegend anders aufgebaut sind als Applets.
Im Gegenteil: Man kann sogar Programme schreiben, die sowohl als Applet als
auch als Applikation gestartet werden können. In Abschnitt 7.4 wird beschrieben, wie dies gemacht wird und was man dabei berücksichtigen muss.
Dieser Abschnitt ist jedoch ausschließlich den
Besonderheiten von Applikationen gewidmet. Das einfachste
Beispiel für eine
Java-Applikation ist sicherlich das viel zitierte »Hello World«-Beispiel:
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
Wird das oben abgedruckte Programm gestartet, so wird lediglich der Text »Hello World!«
auf der Standardausgabe angezeigt.
Nach diesem kurzen einführenden Beispiel wird im Folgenden die Struktur einer Anwendung
genauer analysiert.
Die Hauptklasse einer Applikation muss die Methode
public static void main(String args[])
implementieren. Startet man das Programm mit
java <programmname>
wird als Erstes diese Methode aufgerufen (analog zu main() in C).
Beim Aufruf von java darf die Endung der Klassendatei .class nicht mit angegeben werden. Weitere Informationen über den Java-Interpreter java können dem Anhang B.4 entnommen werden.
Da main() als static vereinbart ist, kann man
aus main() heraus nur auf Datenelemente und Methoden direkt zugreifen, die
ebenfalls static sind.
Statische Methoden
können aufgerufen werden, ohne
ein Exemplar der Klasse erzeugen zu müssen, in der sie deklariert sind.
Dynamische Methoden und Datenelemente hingegen werden erst
zum Zeitpunkt der Erzeugung angelegt.
Um also aus main() heraus auf andere Methoden und Datenelemente zugreifen zu
können, muss entweder ein Exemplar der betreffenden Klasse erzeugt
oder sie müssen ebenfalls als static deklariert werden.
Die folgende Applikation
würde einen Fehler zur Kompilierzeit hervorrufen, da aus einer
statischen Methode versucht wird, auf ein nicht-statisches
Datenelement zuzugreifen:
public class BuggyApplication {
int number;
public static void main(String args[]) {
number = 5; // Direkter Zugriff auf eine
} // nichtstatische Variable
// aus einer statischen Methode
}
Beim Programmaufruf können Parameter an die Applikation übergeben werden.
Über das Array args besitzt man die Möglichkeit,
auf sie zuzugreifen.
Folgendes Beispiel nimmt beliebig viele Parameter von der
Kommandozeile entgegen und gibt diese in umgekehrter Reihenfolge aus:
public class SimpleOutputDemo {
public static void main(String args[]) {
for (int i = args.length-1; i >= 0; i--)
System.out.println(args[i]);
}
}
Im Gegensatz zu C
bekommt main() in Java nur ein Array mit den
Argumenten übergeben und nicht deren Anzahl.
In Java ist ein Array ein Objekt, das außer den eigentlichen Elementen
zusätzlich das Datenelement length besitzt.
In diesem Datenelement ist die Anzahl der Elemente des Arrays vermerkt.
Dadurch ist es unnötig, die Anzahl der Parameter explizit zu übergeben,
da sie direkt im Array enthalten ist.
Wie obiges Beispiel zeigt, muss die Hauptklasse einer Applikation nicht von einer
bestimmten Klasse abgeleitet sein. Bei Applikationen, die eine grafische
Oberfläche
besitzen, ist es jedoch in vielen Fällen ratsam, die Hauptklasse
von Frame abzuleiten. Ein Frame stellt
in Java ein einfaches Fenster dar.
JFrame wird ausführlich im Kapitel 8.3.1 erklärt.
Das folgende Beispiel erläutert dieses Prinzip:
import java.awt.Frame;
public class FrameApplication extends Frame {
public static void main(String args[]) {
FrameApplication fa = new FrameApplication();
fa.setSize();
fa.setVisible(true); // Anzeigen des Frames
}
public void setSize() {
setSize(200, 200); // Festlegen der Größe
}
}
Obige Hauptklasse einer Applikation ist von JFrame
abgeleitet.
Deshalb wird die Klasse javax.swing.JFrame importiert. Im Paket
javax.swing sind alle Klassen enthalten, die zur Erzeugung einer
grafischen Oberfläche notwendig sind.
Die folgende Zeile
dient dazu, ein Exemplar dieser Klasse zu erzeugen:
FrameApplication fa = new FrameApplication();
Innerhalb der statischen Methode main() wird
dynamisch ein Exemplar einer Klasse angelegt, in diesem Fall ein Exemplar der »eigenen« Klasse.
Ist das Exemplar erzeugt, kann über
den Verweis auf die Exemplarmethoden dieser Klasse zugegriffen werden.
fa.setSize();
fa.setVisible(true); // Anzeigen des Frames
Durch die Methode setSize() wird in diesem Beispiel
die Größe des Fensters festgelegt,
das anschließend mit setVisible(true) angezeigt wird.
Dadurch, dass die Methode setSize(int, int) von der Klasse Component an
FrameApplication vererbt wird, kann man aus FrameApplication darauf
zugreifen, genau wie auf main() auch.
Der direkte Aufruf von setSize() aus main()
würde jedoch zu einem Fehler führen.
Man hat nämlich keinen direkten Zugriff auf eine nicht-statische Methode,
wenn man nicht vorher ein Exemplar ihrer Klasse angelegt hat.
Die Vorgehensweise dieses Beispiels ist nicht sehr effizient (es wäre effizienter
gewesen, die Größe direkt im Konstruktor festzulegen).
Sie demonstriert aber, wie man bei Applikationen vorgehen kann,
ohne Methoden und Variablen static definieren zu müssen.
Durch Aufruf der Methode System.exit() kann eine Applikation vorzeitig beendet,
werden.
Eine ausführliche Beschreibung von System.exit() ist im Abschnitt 14.3 zu finden.
Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.