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 publicSchlüsselwort means kann main()von außerhalb der Klasse aufgerufen werden, in der es deklariert ist. Das staticSchlü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 voidbedeutet 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 StringObjekten 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 argsden Namen dieses Parameters nicht verwenden. Sie können genauso einfach angeben chickenswie 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 Appder main()Methode ruft eine der Methoden der outObjektreferenzvariablen 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 outObjektreferenzvariablen. Wird wiederum outin einer Klasse deklariert, die aufgerufen Systemund Systemdurch 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 AppFall wird forein System.out.printlnMethodenaufruf für jedes Argument ausgeführt, das an dieses Programm in der Befehlszeile übergeben wurde. Hinweis args.length. Ist in Java lengtheine Eigenschaft eines Arrays und gibt eine Anzahl von Array-Elementen zurück.

Geben Sie in der Befehlszeile javac App.javazum Kompilieren ein App. Wenn Sie alles wie gezeigt eingegeben haben, sollten Sie mit einer Klasse - Datei am Ende genannt , App.classdie enthält App‚s Bytecode-Instruktionen. Wie rennst du App? Werfen Sie einen Blick auf Abbildung 1. Das Bild zeigt , Appvon der Kommandozeile mit drei Argumenten ausgeführt: one, two, und three.

Hinweis: Abbildung 1 zeigt die AppAusfü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 javaProgramm führt eine Anwendung aus. Unter Windows wird dieses Programm in einer ausführbaren Datei namens gespeichert java.exe. Wie bei javac, javawird in der Befehlszeile angegeben. Der Name der Klassendatei, die die main()Methode enthält , folgt dann java.

Das javaProgramm 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, twound three. javaErstellt ein StringArray (über das Java Native Interface - JNI) und füllt jedes Element mit einem Verweis auf ein StringObjekt, 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 StringArray ü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 Appdie 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 javaErstellen des StringArrays wird eine Liste aller Dateinamen des aktuellen Verzeichnisses abgerufen und jeder Dateiname in einem separaten StringObjekt 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().