Anwendungen, Applets und Hybride
Wenn Sie Java 101 gefolgt sind , wissen Sie, dass Jacob Weintraub eine hervorragende Artikelserie erstellt hat, die Java-Neulingen dabei helfen soll, Java-Entwickler zu werden. Da Jacob diese Spalte jedoch nicht mehr fortsetzen kann, hat JavaWorld die Fackel an mich weitergegeben.
Sie werden schnell feststellen, dass mein Weg zum Java-Entwickler einen anderen Weg einschlägt. Zum Beispiel möchte ich lieber über die Programmieraspekte von Java sprechen, die nicht objektorientiert sind (wie Typen, Variablen, Operatoren, Ausdrücke und Anweisungen), bevor ich mich mit seiner objektorientierten Seite befasse. Ich glaube, dass dieser Ansatz den natürlichen Fluss von Java 101 von einem Thema zum anderen verbessern wird - ein Fluss, der sich nahtlos von Anfang bis Ende bewegt. Um die Diskussion zu erleichtern, werde ich gelegentlich ein fortgeschrittenes Konzept vorstellen, bevor ich es vollständig erkläre. Infolgedessen finden Sie kurze Erklärungen zu fortgeschritteneren Themen, während Sie sich durch diesen und zukünftige Artikel arbeiten.
Java 101 wird viele Beispielprogramme vorstellen. Jedes Programm wird mit dem Java 2 Platform Standard Edition Version 1.4 (auch als SDK 1.4 bekannt) von Sun kompiliert und auf der Windows 98 SE-Plattform getestet. Obwohl ich versuchen werde, Windows-Verweise auf ein Minimum zu beschränken, ist dies nicht immer möglich. Ich warne Sie daher, wenn ein Artikel in die Welt von Windows eintaucht.
Da ich aus Serversicht nicht viel Zeit mit Java verbracht habe, konzentriert sich diese Spalte auf clientseitiges Java. Das bedeutet nicht, dass wir Themen wie Remote Method Invocation und JDBC, die die Client- und Serverseite verbinden, nicht untersuchen werden. Ich werde jedoch keine Servlets, Enterprise JavaBeans, Java Server Pages und andere serverseitige Themen präsentieren. In der Seitenleiste The Road Ahead finden Sie eine Übersicht über die Java 101- Kurse, um eine bessere Vorstellung von den Themen zu erhalten, die ich behandeln werde .
Im Artikel dieses Monats diskutiere ich die Struktur von Anwendungs-, Applet- und Hybridprogrammen. Aus Sicht der Anwendung finden Sie möglicherweise einige Überschneidungen mit Jacobs früheren Artikeln, aber ich werde auch einige neue Inhalte vorstellen.
Programmkategorien
Mit Java können Sie vier Arten von Programmen erstellen: Anwendungen, Applets, Hybride und Servlets. Ich diskutiere die ersten drei Programme in diesem Artikel. Weitere Informationen zu Servlets finden Sie in der Dokumentation zu Java 2 Platform, Enterprise Edition.
Anwendungen
Eine Anwendung ist ein eigenständiges Programm, das aus mindestens einer Klasse mit einer main()
Methode besteht. Diese Methode weist die folgende Signatur auf:
public static void main (String [] args)
Das public
Schlüsselwort means kann main()
von außerhalb der Klasse aufgerufen werden, in der es deklariert ist. Das static
Schlüsselwort means kann main()
ohne Objektreferenz aufgerufen werden. Mit anderen Worten, die JVM muss main()
vor dem Aufruf kein Objekt aus der deklarierten Klasse erstellen main()
. Schließlich void
bedeutet das Schlüsselwort, main()
dass kein Wert zurückgegeben wird.
Hat wie bei anderen Methoden main()
eine Parameterliste, eine Liste von Typen und Variablennamen. In diesem main()
Fall wird nur ein Parameter angezeigt - args
. Dieser Parameter wird als Verweis auf ein Array von String
Objekten deklariert - auch als Adresse eines Objekts bezeichnet. Jedes Objekt enthält den Inhalt eines Arguments, das über die Befehlszeile des Programms an die Anwendung übergeben wird. Hinweis: Sie müssen args
den Namen dieses Parameters nicht verwenden. Sie können genauso einfach angeben chickens
wie in String [] chickens
.
Listing 1 enthält den Quellcode für eine aufgerufene Anwendung App
. Diese Anwendung druckt eine Liste von Argumenten aus, die über die Befehlszeile an sich selbst übergeben werden.
Listing 1. App.java
// App.java Klasse App {public static void main (String [] args) {System.out.println ("Befehlsargumente \ n"); für (int i = 0; i <args.length; i ++) System.out.println (args [i]); }}
TEXTFELD:
TEXTBOX_HEAD: Kommentare
Listing 1 zeigt eine Technik, mit der ich Programme identifiziere. Am Anfang einer Quelldatei platziere ich einen Kommentar, der den Namen der Quelldatei identifiziert. Ich finde diesen Kommentar nützlich, um Programme im Auge zu behalten. Wenn Sie mit dem Konzept eines Kommentars nicht vertraut sind, ist nichts anderes als die Quellcodedokumentation, die nur auf der Quellenebene von Bedeutung ist. Wenn der Quellcode kompiliert wird, wird der Kommentar weggeworfen. Wir werden uns die Kommentare nächsten Monat noch einmal ansehen.
: END_TEXTBOX
Code innerhalb App
der main()
Methode ruft eine der Methoden der out
Objektreferenzvariablen auf println()
, um Informationen an das Standardausgabegerät auszugeben. In der Regel handelt es sich bei diesem Gerät um ein Befehlsfenster wie das Microsoft Windows DOS-Fenster, obwohl das Gerät in eine Datei umgeleitet werden kann. (Ich werde diese Umleitung in einem nachfolgenden Artikel demonstrieren.) Das Punktzeichen trennt den println()
Methodenaufruf von der out
Objektreferenzvariablen. Wird wiederum out
in einer Klasse deklariert, die aufgerufen System
und System
durch ein Punktzeichen getrennt ist. Eine Objektreferenzvariable ähnelt stark einem C- oder C ++ - Zeiger: Diese Variable enthält die Adresse einer anderen Variablen. In den kommenden Artikeln werden Sie viel über Objektreferenzvariablen erfahren.
Wenn Sie mit C oder C ++ gearbeitet haben, sind Sie wahrscheinlich mit der Struktur der for-Schleifenanweisung vertraut (die im Quellcode über das Schlüsselwort angezeigt wird for
). Die for-Schleifenanweisung führt wiederholt eine oder mehrere Anweisungen entweder für eine bestimmte Anzahl von Malen oder auf unbestimmte Zeit aus. (In zukünftigen Artikeln werde ich die for-Schleifenanweisung und andere Anweisungen im Detail untersuchen.) In diesem App
Fall wird for
ein System.out.println
Methodenaufruf für jedes Argument ausgeführt, das an dieses Programm in der Befehlszeile übergeben wurde. Hinweis args.length
. Ist in Java length
eine Eigenschaft eines Arrays und gibt eine Anzahl von Array-Elementen zurück.
Geben Sie in der Befehlszeile javac App.java
zum Kompilieren ein App
. Wenn Sie alles wie gezeigt eingegeben haben, sollten Sie mit einer Klasse - Datei am Ende genannt , App.class
die enthält App
‚s Bytecode-Instruktionen. Wie rennst du App
? Werfen Sie einen Blick auf Abbildung 1. Das Bild zeigt , App
von der Kommandozeile mit drei Argumenten ausgeführt: one
, two
, und three
.
Hinweis: Abbildung 1 zeigt die App
Ausführung unter Windows 98 SE. Unix und Linux laufen App
ähnlich. Wenn Sie jedoch unter dem Mac ausgeführt werden, müssen Sie wahrscheinlich etwas mehr Arbeit erledigen. Ich würde Ihnen gerne zeigen, wie das geht, aber ich habe Java noch nie auf einem Mac verwendet.
Das java
Programm führt eine Anwendung aus. Unter Windows wird dieses Programm in einer ausführbaren Datei namens gespeichert java.exe
. Wie bei javac
, java
wird in der Befehlszeile angegeben. Der Name der Klassendatei, die die main()
Methode enthält , folgt dann java
.
Das java
Programm sucht nach der main()
Methode in der Klassendatei. Wenn es nicht gefunden wird main()
, wird eine Fehlermeldung ausgegeben. (Wie Sie in Abbildung 1 sehen können, geben Sie die Dateierweiterung NICHT an .class
.)
Argumente können dem Klassennamen folgen, sind jedoch optional. In Abbildung 1 sind die Argumente one
, two
und three
. java
Erstellt ein String
Array (über das Java Native Interface - JNI) und füllt jedes Element mit einem Verweis auf ein String
Objekt, das die Zeichen enthält, aus denen ein Argument besteht. Nach Abschluss wird die main()
Methode aufgerufen (über die JNI) und eine Referenz an das String
Array übergeben.
Angenommen, Sie geben java App *
in der Befehlszeile ein. Was würde das Befehlsfenster Ihrer Meinung nach anzeigen? Wenn Sie der Meinung sind, dass die Antwort ein Sternchen ist, sehen Sie sich Abbildung 2 an.

Abbildung 2 zeigt App
die Namen der Dateien, die sich im selben Verzeichnis wie befinden App.class
. Es stellt sich heraus, dass das Sternchen einen Platzhalter darstellt. Mit anderen Worten, es repräsentiert alle Dateinamen im aktuellen Verzeichnis. Beim java
Erstellen des String
Arrays wird eine Liste aller Dateinamen des aktuellen Verzeichnisses abgerufen und jeder Dateiname in einem separaten String
Objekt abgelegt, das dann als Element im Array gespeichert wird.
Versuche zu rennen java App * *
. Ratet mal, was angezeigt wird. Da jedes Sternchen dazu führt java
, dass eine Liste aller Dateinamen abgerufen wird, werden im aktuellen Verzeichnis zwei Kopien aller Dateinamen angezeigt.
Suppose you write a Calculator
application that multiplies two numbers with the asterisk, as in java Calculator 4 * 3
. Based on the previous discussion, 4 and 3 will not multiply. If you want the asterisk to be interpreted as itself -- and not a wildcard -- you must surround it with a pair of double quote characters. For example, you would type java Calculator 4 "*" 3
. Furthermore, if your argument contains embedded space characters, and you want to include those space characters as part of the argument, you must use double quotes. For example, type java App "my compound argument"
at the command line to specify my compound argument
as App
's single argument.
Our first Java application consisted of a single class. However, you can also create applications that consist of multiple classes. Furthermore, each class can have its own main()
method. To see what that situation looks like, check out Listing 2.
Listing 2. Fred.java
// Fred.java class A { public static void main (String [] dogs) { System.out.println ("Class A main() method"); } } class B { public static void main (String [] chickens) { System.out.println ("Class B main() method"); System.out.println ("Num args: " + chickens.length); } }
Listing 2 presents source code stored in a file called Fred.java
. That source code consists of two classes: A
and B
. When compiled (as in javac Fred.java
), you end up with two class files: A.class
and B.class
. If you were to type java A
, you would see Class A main() method
in the command window. However, if you were to type java B
, the command window would display Class B main() method
, followed by a line that begins with Num args:
and identifies the number of arguments passed on the command line.
Is Fred
one application or two applications? The answer depends on your perspective. Normally, an application consists of a single class with a main()
method. As you've seen, you run the application by specifying java
and the name of the class that contains main()
. However, you might find yourself placing a main()
method in other classes (for debugging purposes). To prevent confusion for anyone using your program, either remove all main()
methods except the main()
method that starts the application, or identify the class file containing the official main()
method before deploying the application.
In addition to java
, the Java 2 SDK includes a javaw
program that you can use to run applications. That program is almost identical to java
, except that javaw
does not display a command window when running an application (unless you run the application through a Windows batch file, which automatically opens a command window). For example, suppose your class file called GUIDemo
is stored in the c:\jdk1.4\projects
directory (assuming Windows). You decide to create a Windows shortcut for running that program, and choose the following command line: java -cp c:\jdk1.4\projects GUIDemo
. (The -cp
option tells java
where to find a class file called GUIDemo.class
.) When you select the shortcut, a command window pops up along with GUIDemo
's GUI window. However, if you change java
to javaw
, you won't see the command window.
Now that you've had a chance to play with applications, let's take a look at the second category of Java programs -- applets.
Applets
An applet is an application that runs in the context of a Web browser that controls the applet. Because a rectangular area of the Webpage displays an applet's output, applets are described as being embedded in Webpages. Furthermore, by calling certain methods -- which we'll shortly investigate -- the browser manages an applet's life cycle.
An applet's class files download automatically to a user's machine when the user surfs to a Webpage containing the applet. Once downloaded, the browser's virtual machine or the Java Plug-in software executes those class files. (See Resources for an article that explores Java Plug-in.)
Imagine a malicious person creating an applet that deletes files, wastes reams of printer paper, steals passwords or other sensitive information, and so on. An applet with unrestricted access to a user's machine could perform all of those misdeeds. For that reason, applets can only execute limited functions. For example, an applet cannot perform any file-related activities.
Sun has established a specific (and involved) procedure for turning restricted applets into unrestricted applets. However, unrestricted applets can only run under the user's permission. (We will explore that subject in a future article.) To be an applet, one -- and only one -- of the applet's classes must conform to the following pattern:
public class class_name extends java.applet.Applet { }
The required public
keyword gives the Web browser access to the applet. The extends
keyword indicates the object-oriented programming concept of inheritance and suggests that the class_name
class inherits applet capabilities from a class called Applet
(located in the java.applet
package -- an organizational mechanism for classes and class files -- to be explored in a future article).
Jedes Applet hat einen Lebenszyklus. Ein Applet wird initialisiert (einmal und nur einmal), gestartet und gestoppt (ein- oder mehrmals während seiner Lebensdauer) und zerstört (einmal und nur einmal). Der Browser ruft an wichtigen Punkten während dieses Lebenszyklus eine von vier Methoden auf, um anzuzeigen, dass das Applet in eine andere Existenzphase eingetreten ist. Diese Methoden sind init()
, start()
, stop()
, und destroy()
.