Wollis Homepage
Studienarbeiten

Tipps und Tricks
IoT
Studienarbeiten
  Diplomarbeiten
    DI
    DII
  Seminararbeiten
Privates
Suche
Startseite > Studienarbeiten > Diplomarbeiten > DI

Einführung in die Programmiersprache Java

Diplomarbeit - 2. Einfhrung in die Programmiersprache Java

2. Einführung in die Programmiersprache Java

2.1 Grundlagen

Die folgende Einführung in die Programmiersprache Java setzt die Kenntnis einer Programmiersprache und Basiswissen über objektorientierte Programmierung voraus. Sie dient dazu, die Programmierungen im Rahmen dieser Diplomarbeit nachvollziehen zu können. Der Code der Beispiele, die in diesem Kapitel angeführt werden und des Programms KIS, kann in einem beliebigen ASCII-Editor geschrieben werden. Zum Kompilieren der Beispiele kann das Java Development Kit (JDK) in der Version 1.02 verwendet werden, das kostenlos von der Firma Sun Microsystems unter der Internetadresse http://www.javasoft.com bezogen werden kann. Alternativ besteht die Möglichkeit, das Schreiben und Kompilieren der Programme etwas komfortabler zu gestalten, indem man eine kommerzielle Programmierumgebung verwendet, wie zum Beispiel:

 

  • Café von Symantec ( http://cafe.symantec.com/cafe/index.html)
  • Java Workshop von Sun (http://www.sun.com/developer-products/)
  • Latté von Borland (http://www.borland.com/internet/latte/)
  • Visual J++ von Microsoft (http://www.microsoft.com)
  • VisualAge for Java von IBM (http://ncc.hursley.ibm.com/javainfo)

 

Von den oben genannten Programmierumgebungen stehen Testversionen mit zeitlich begrenzter Laufzeit unter den angegebenen Internetadressen zur Verfügung. Da die Programme sich sehr stark unterscheiden, sollte man die Möglichkeit zur Nutzung der Testversionen wahrnehmen und die Programmierumgebung aussuchen, die einem am meisten zusagt, bevor man eine Umgebung erwirbt.

 

Im folgenden werden zunächst grundlegende Eigenschaften von Java dargestellt. Anschließend werden wesentliche Sprachelemente aufgezeigt. Daraufhin werden die objektorientierten Elemente von Java vorgestellt und eine Beurteilung der Sprache wird vorgenommen.

 

 

2.2 Eigenschaften von Java

Java ist eine Programmiersprache, die auf den Grundlagen von C++ aufbaut. Im Vergleich zu C++ wird in Java die Objektorientierung weiterentwickelt. Hierdurch ist es dem Programmierer in Java möglich, flexible modulare Programme zu schreiben, außerdem wird die Wiederverwendbarkeit des Codes erhöht. 1

 

Java eignet sich durch die integrierten Netzwerkfunktionen besonders für die Internet-Programmierung. Einfache Internetzugriffe sind in Java, wie auch im folgenden erklärt wird, durch wenige Programmierzeilen zu realisieren.

 

Im Vergleich zu anderen Sprachen weist Java folgende Besonderheiten auf, die größtenteils als Vorteile gewertet werden können:

 

  • Einfachheit: Die Sprache ist kompakt und vermeidet durch den Wegfall von Mehrfachvererbungen, Zeigern und Zeiger-Arithmetik viele beim Programmieren schwer lokalisierbare Fehler. Aufgrund der Ähnlichkeit mit C++ ist die Sprache für Programmierer mit C++ Kenntnissen leicht zu erlernen.
  • Portabilität und Plattformunabhängigkeit: In Java geschriebene und kompilierte Programme können auf allen Rechnertypen und Betriebssystemen ausgeführt werden, sofern eine Javaumgebung existiert.
  • Sicherheit: In Java sind Sicherheitsmechanismen eingebaut, die verhindern, daß in Java geschriebene Programme unbefugt Daten vom Rechner, auf dem die Programme ausgeführt werden, lesen und manipulieren können.
  • Multithreading: Java unterstützt die Nutzung von Threads, die Prozesse kontinuierlich und unabhängig voneinander ausführen.
  • Robustheit: Durch den Wegfall von Mehrfachvererbungen, Zeigern, Zeiger-Arithmetik und die Änderung des Speichermanagements können relativ robuste Programme entwickelt werden.

2.3 Sprachelemente von Java

Im folgenden Abschnitt werden die grundlegenden Befehle von Java erklärt. Die Beschreibung beschränkt sich auf die Standardanwendung der jeweiligen Befehle. Ausnahmen und Sonderfälle bleiben weitgehend unbeachtet, da sie im Rahmen des Programms KIS nicht verwendet werden und daher für das Verständnis des Programmcodes nicht nötig sind.

 

2.3.1 Anweisungen und Ausdrücke

 

In Java geschriebenen Programme bestehen hauptsächlich aus Anweisungen und Ausdrücken. Anweisungen in Java sind einzelne Java-Operationen.2 Eine besondere Form von Anweisungen sind Ausdrücke, welche dadurch gekennzeichnet sind, daß sie einen Wert ausgeben.3 Beispielhaft sei eine Anweisung wie folgt dargestellt: int x;.Exemplarisch für einen Ausdruck sei x=3+4; angeführt. Es ist zu beachten, daß jede Anweisung mit einem Semikolon endet.

 

2.3.2 Variablen

Die in Java enthaltenen Datentypen unterscheiden sich kaum von denen der herkömmlichen Programmiersprachen. Sie weisen allerdings größtenteils den Vorteil auf, daß ihr Wertebereich an die heutigen hohen Anforderungen an eine Programmiersprache angepaßt sind.

 

Folgende Basisdatentypen (Primitivtypen) sind in Java enthalten: 4

Datentyp

Größe

Wertebereich

Byte

1 Byte

-128 bis 127

Short

2 Byte

-32768 bis 32767

Int

4 Byte

-2147483648 bis 2147483647

Long

8 Byte

-9223372036854775808 bis 9223372036854775807

Float

4 Byte

maximal: 3.40282347e+38
minimal: 1.40239846e-45

Double

8 Byte

maximal: 1.79769313486231570e+308

minmal: 4.94065645841246544e-324

Char

2 Byte

Unicode Zeichen

Boolean

1 Byte

true oder false

Tabelle 1: Datentypen und Wertebereiche in Java

 

Bei der Benutzung von Gleitpunktzahlen ist zu beachten, daß sie auf älteren Rechnern, deren Prozessoren die Bearbeitung von Gleitpunktzahlen nicht unterstützen, sehr langsam laufen. Die Gleitpunktzahlentypen float und double werden in Java nach der Norm IEEE 754 bearbeitet. Für den Datentyp char verwendet Java nicht den üblichen ASCII-Zeichensatz, sondern den Unicode-Zeichensatz. In diesem Unicode-Zeichensatz sind Sonderzeichen und länderspezifische Zeichen vieler Länder integriert.5 Als Nachteil ergibt sich, daß ein Zeichen zwei Byte lang ist, anstatt wie bei dem ASCII-Zeichensatz ein Byte.

 

Steuerzeichen in Variablen vom Typ char und vom Typ String - der Erweiterung von char - werden wie folgt dargestellt:6

Beschreibung der Escape Sequenz

Escape Sequenz

Ausgabe

Zeichen

"a"

a

A
a

Rückschritt (Backspace)

\b

 

Horizontaler Tabulator

\t

 

Zeilenvorschub

\n

 

Formularvorschub

\f`

 

Wagenrücklauf

\r

 

Doppeltes Anführungszeichen

\"

"

Einfaches Anführungszeichen

\

Backslash

\\

\

Oktal

\45

%

Unicode Zeichen

\u2122

Tabelle 2: Escape Sequenzen in Java

Variable werden in Java durch eine Anweisung deklariert, in der zuerst der Datentyp und dann der Variablenname angegeben wird, zum Beispiel int jahr;. Bei der Deklaration von Variablen ist es auch möglich, ihnen sofort einen Startwert zuzuordnen, zum Beispiel int jahr=1997;. Die Variablennamen in Java müssen mit einem Buchstaben, einem Unterstrich (_), einem Dollarzeichen ($) oder einem Zeichen, das über der Unicode-Zeichennummer 00c0 liegt, beginnen.7 Um Variablen Werte zuzuweisen, benutzt man den Zuweisungsoperator =, zum Beispiel jahr=1997; oder jahr=jahr+1;.

 

Die Gültigkeit von Variablen in Java ist identisch mit der Gültigkeit von Variablen in C++. Es gibt Instanzvariablen, die ab ihrer Definition in der gesamten Instanz Gültigkeit haben. Variablen, die in einer Klassenmethode definiert werden, sind ab dem Zeitpunkt ihrer Definition gültig und werden nach dem Verlassen des Blocks, in dem sie definiert wurden, ungültig.

 

Java unterstützt fünf grundlegende arithmetische Operationen: Addition (+), Subtraktion (-), Multiplikation (*), Division (/) und Modulo (%). Es gibt wie in C++ Inkrement- und Dekrementausdrücke, so erhöht ++ und verringert -- den Wert der Variablen um 1. Sie können prefix und postfix angewendet werden. Die folgenden Zeilen machen die Bedeutung dieser Unterscheidung klar:

 

int x=10;

int y,z;

y=x++;

z=++x;

 

Die ersten beiden Zeilen deklarieren die drei Variablen x, y, z, und die Variable x bekommt den Startwert 10. In der nächsten Zeile wird y der Wert von x zugewiesen, und x wird dann um eins erhöht. Somit enthält y den Wert 10 und x den Wert 11. Der nächste Ausdruck erhöht x um eins und weist dann z den Wert von x zu. Der Wert von x und z ist somit 12.

 

Um Werte zu vergleichen, stellt Java folgende Vergleichsoperatoren zur Verfügung: 8

Operator

Beschreibung

<

Kleiner als

>

Größer als

<=

Kleiner als oder gleich

>=

Größer als oder gleich

==

Gleich

!=

Nicht gleich

Tabelle 3: Vergleichsoperatoren in Java

 

Die Ausdrücke mit den Vergleichsoperatoren geben die booleschen Werte true oder false zurück. Um komplexere Vergleiche zu realisieren, gibt es die logische AND (&&), OR (||) und NOT (!) Verknüpfung.

 

2.3.3 Typumwandlungen

Datentypen kann man mit dem sogenannten Casting in andere Datentypen umwandeln. Das Casting gibt einen Wert zurück und ändert nicht den Ursprungswert sondern nur den Datentyp. Ein Casting kann wie folgt aussehen:

 

int x=(int) (5/2);

 

In dieser Zeile wird eine Variable x erzeugt, die den Wert der Operation (5/2) zugewiesen bekommt. Der Datentyp dieser Operation ist float, aber durch das vorangestellte (int) wird das "float" Ergebnis in eine Integer-Zahl umgewandelt. Es ist darauf zu achten, daß beim Casting Informationen vernichtet werden können. Bei dem oben angeführten Beispiel gehen die Nachkommastellen des Ergebnisses verloren.

 

Zu jedem einfachen Datentyp - auch Primitivtyp genannt - existiert ein Instanztyp. Wenn der Primitivtyp in den zugehörigen Instanztyp umgewandelt wird, können zahlreiche Methoden auf die Instanz angewendet werden, zum Beispiel gibt es bei der Integerinstanz eine Methode, um Strings in Zahlen umzuwandeln.

 

2.3.4 Schleifen

 

In Java gibt es, wie in den meisten anderen Programmiersprachen, Zählschleifen und kopf- und fußgesteuerte Schleifen. Die Zählschleife wird mit for (Startwert; Abbruchbedingungen; Zählerveränderung) {} erstellt. Eine Schleife, die die Zahlen von null bis zehn ausgibt, sieht wie folgt aus:

 

for (int i=0; i<=10; i++) {

System.out.println(i);

}

 

Als Startwert wird in dieser Schleife die Integervariable i erzeugt und auf null gesetzt. Die Abbruchbedingung sagt aus, daß der Schleifenkörper so lange ausgeführt wird, wie i kleiner oder gleich zehn ist. Die Zählerveränderung erhöht die Varible i bei jedem Durchgang um eins. Wenn in einer Schleife nur eine Anweisung ausgeführt werden soll, können die geschweiften Klammern weggelassen werden, aber bei mehreren Anweisungen sind die geschweiften Klammern wichtig, da sonst nur der erste Befehl als Schleifenkörper interpretiert wird.

 

Die kopfgesteuerte Schleife hat die Syntax while(Abbruchbedingung) {}. Das oben für die Zählschleife beschriebene Beispiel hat mit einer kopfgesteuerten Schleife folgendes Aussehen:

 

int i=0;

while (i<=10) {

System.out.println(i);

i++;

}

 

In der ersten Zeile wird die Variable deklariert, und dann die Abbruchbedingung festgelegt. Es folgt der Schleifenkörper.

 

Der letzte Schleifentyp ist die fußgesteuerte Schleife mit der Syntax do {} while (Abbruchbedingung);. Das obige Beispiel hat mit einer fußgesteuerten Schleife die Gestalt:

 

int i=0;

do {

System.out.println(i);

i++;

} while (i<=10);

 

Es fällt auf, daß die kopf- und fußgesteuerten Schleifen sich stark ähneln. Der Unterschied zwischen den beiden Typen besteht darin, daß die kopfgesteuerte Schleife zuerst die Abbruchbedingung prüft und dann den Schleifenkörper ausführt, während die fußgesteuerte Schleife erst nach der Ausführung des Schleifenkörpers die Abbruchbedingung prüft. Der Schleifenkörper einer fußgesteuerten Schleife wird daher mindestens ein Mal ausgeführt.

 

 

2.3.5 Bedingungen

 

Bedingungen dienen dazu, bestimmte Befehle nur beim Eintritt eines definierten Ereignisses auszuführen. Es gibt zwei verschiedene Bedingungen in Java, die if-Bedingung und die switch-Bedingung. Die switch-Bedingung wird hier nicht weiter beschrieben, da sie den Nachteil aufweist, nur Integervariablen auf Einzelwerte prüfen zu können. Die if-Bedingung hat die Syntax if (Bedingung) {} else {}. Eine Anwendung der if-Bedingung kann folgendermaßen aussehen:

 

if (alter<20) {

System.out.println("Du junger Spunt!");

}

else if (alter<30){

System.out.println("Na ja, auch schon ins Alter gekommen!");

}

else {

System.out.println("Hallo Opa/Oma!");

}

 

So oder ähnlich kann die Auswertung eines vom Benutzer eingegebenen Alters lauten. Die erste if-Bedingung prüft, ob die eingegebene Zahl kleiner als zwanzig ist, ist dies der Fall wird "Du junger Spunt!" ausgegeben, und die if-Bedingung wird verlassen. Die else-Anweisung vor der zweiten if-Bedingung bewirkt, daß beim Eintreten der ersten Bedingung die weiteren nicht mehr überprüft werden. Anderenfalls wird die zweite if-Bedingung geprüft. Ergibt sich hierbei ein Alter unter 30, wird der entsprechende Kommentar angezeigt und die if-Bedingung verlassen. Ist das Alter nicht unter 30, wird der Kommentar "Hallo Opa/Oma!" ausgegeben.

 

2.3.6 Strings und Arrays

Strings sind in Java als Klasse implementiert. Damit man mit einem String arbeiten kann, muß man eine Instanz der Klasse String erstellen. Das kann mit folgenden Befehlen geschehen:

 

String text1=new String();

String text2=new String("Testtext");

 

Die Befehle bewirken, daß der Speicherplatz für eine Stringinstanz reserviert wird. Danach wird diesem Speicherplatz eine Instanz vom Typ String zugewiesen und beim ersten Befehl mit einem leeren String und im zweiten Fall mit "Testtext" initialisiert. Es ist auch möglich, Methoden auf die Instanz anzuwenden, wie zum Beispiel text1=text2.substring(0,4);. Diese Methode kopiert die ersten vier Buchstaben der Variablen text2 als String in text1.

 

Mit Arrays ist es möglich, Listen von Elementen abzuspeichern. Es kann auf jedes Element einzeln zugegriffen werden. Um Arrays in Java zu erzeugen, muß eine Arrayinstanz erstellt werden. Ein Integer-Array, das fünf Werte aufnehmen kann, wird wie folgt erstellt:

 

int[] intarray=new int[5];

 

Um auf einzelne Werte des Arrays zugreifen zu können, muß der Arrayname mit der Nummer des Wertes in eckigen Klammern angegeben werden. Die Numerierung der Werte beginnt bei null. Bei dem oben erstellten Array kann man auf die Integerwerte intarray[0] bis intarray[4] zugreifen. Sollen die Elemente des Arrays mit Werten initialisiert werden, kann der Befehl

 

int[] intarray={1,2,3,4,5};

 

benutzt werden. Die Größe des Arrays wird durch die Anzahl der Initialisierungswerte festgelegt. Die einzelnen Werte des Arrays können wie normale Integervariablen gebraucht werden. Eine Ausgabe des dritten Integerwertes wird mit der Anweisung:

 

System.out.println(intarray[2]);

 

realisiert. Arrays können mit allen Primitivtypen sowie mit Objekten erzeugt werden.

 

2.3.7 Kommentare

 

In Java kann man auf drei Arten Kommentare in den Quellcode einfügen. Mehrzeilige Kommentare werden zwischen /* und */ gesetzt. Alles, was sich zwischen den beiden Befehlen befindet, wird beim Übersetzen des Quellcodes ignoriert. Es ist nicht zulässig, Kommentare ineinander zu verschachteln. Die zweite Art ist der einzeilige Kommentar. Dafür wird in einer Zeile ein doppelter Slash (//) benutzt. In der Zeile werden sämtliche Zeichen hinter dem doppelten Slash beim Kompilieren ignoriert. Die letzte Kommentarart dient der automatischen Dokumentationserzeugung und wird zwischen /** und */ geschrieben. Mit dem Programm javadoc, das mit dem JDK ausgeliefert wird, können Dokumentationen im HTML-Format erzeugt werden.

 

2.4 Packages

Packages sind Sammlungen von Klassen, die nach logischen Gesichtspunkten gruppiert sind.9 Sie werden mit dem Befehl import in ein Programm eingebunden. Im Programm kann dann auf die Klassen und Methoden der importierten Packages zugegriffen werden. Eine Reihe von Grundfunktionen ist schon in den mit Java ausgelieferten Packages enthalten. Man erkennt die Standard Java Packages daran, daß sie mit "java." anfangen. Es ist darüber hinaus möglich, eigene Packages zu erstellen. Dabei muß man allerdings beachten, daß diese Packages auf dem Rechner vorhanden sein müssen, auf dem Programme mit selbst erstellten Packages verwendet werden sollen. Der Packagename ist ein Dateiname, bei dem die Zeichen Slash (/) bzw. Backslash (\) durch einen Punkt ersetzt werden.10 Es ist möglich, mehrere Klassen auf einmal zu importieren, indem man das Zeichen "*" als Joker benutzt, der Befehl sieht dann wie folgt aus: import java.io.*;.

 

2.5 Applikationen und Applets

Programme, die in Java geschrieben sind, können in zwei Gruppen eingeteilt werden, in die Applikationen und die Applets. Applikationen sind eigenständige Programme, die unabhängig von einem WWW-Browser gestartet werden können. Ein Beispiel für eine Java Applikation ist der WWW-Browser HotJava von Sun Microsystems. Applets sind Java-Programme, die für WWW-Seiten geschrieben sind. Beim Aufruf der WWW-Seite mit einem javafähigen Browser wird das Applet gestartet und kann unter anderem dazu genutzt werden, die Seite dynamisch und interaktiv zu gestalten.

 

Eine einfache Applikation, die in Java programmiert werden kann, ist das "Hallo Welt!" Programm. Das Programm gibt beim Starten "Hallo Welt!" aus.

 

class HalloWelt {

public static void main(String args[]) {

System.out.println("Hallo Welt!");

}

}

 

Das Programm wird unter dem Namen HalloWelt.java abgespeichert, da der Dateiname eines Source-Codes immer dem Namen einer Klasse entsprechen muß. Es ist darauf zu achten, daß auch die Groß- und Kleinschreibung übernommen wird. Arbeitet man mit dem JDK, wird das Programm mit der Kommandozeile

javac HalloWelt.java

kompiliert. Bei der Verwendung anderer Entwicklungsumgebungen muß das Programm, wie in der jeweiligen Anleitung beschrieben, kompiliert und ausgeführt werden.

 

Zum Ausführen des Programms benutzt man die Kommandozeile

java HalloWelt.

Der Befehl java dient dazu, die Javaumgebung zu starten, mit der das Java-Programm ausgeführt wird. Bei javafähigen Betriebssystemen, wie zum Beispiel OS/2 Warp Version 4 braucht man nur den Dateinamen einzugeben, da die Javaumgebung schon im Betriebssystem enthalten ist.

 

Der Befehl class HalloWelt{} legt eine neue Klasse mit dem Namen HalloWelt an. Die geschweiften Klammern werden genauso wie in C++ zum Blocken von Befehlen gebraucht. In der zweiten Zeile des Beispiels wird die Methode main() definiert, die als Einsprungspunkt beim Programmstart dient. Die main() Methode muß in jeder Applikation enthalten sein. Diese Methode wird public, das heißt aufrufbar bzw. zugreifbar für alle Programmteile definiert. Mit static wird festgelegt, daß es sich um eine Klassenmethode handelt. Daß diese Methode keine Werte zurückliefert, wird durch void kenntlich gemacht. In den runden Klammern definiert man einen String-Array, in dem Parameter, die beim Aufruf des Programms angegeben werden, gespeichert sind. Die nächste Zeile gibt "Hallo Welt!" auf der Standardausgabekonsole, dem Bildschirm, aus.

 

Als nächstes werden Java Programme, die als Applet geschrieben sind, beispielhaft untersucht. Um Applets anzuschauen, kann man den Appletviewer, der mit dem JDK ausgeliefert wird, oder einen javafähigen WWW-Browser, zum Beispiel den Netscape Navigator ab Version 2.0 oder den Microsoft Internet Explorer ab Version 3.0 gebrauchen. Als erstes wird eine HTML-Seite benötigt, in der das Java-Applet aufgerufen wird. Die HTML-Seite kann wie folgt aussehen:

 

<html>

<head>

<title>Ausgabe eines Applets</title>

</head>

<body>

<h1>Ausgabe des Applets:</h1>

<applet code="HalloWeltApplet.class" width=200 height=40>

</applet>

</body>

</html>

 

Dieses HTML-Dokument zeigt durch den Befehl <applet code=...> auf ein vorhandenes Applet. Dieses kann in dem durch Breite und Höhe angegebenen Bereich angezeigt werden. Wird das HTML-Dokument von einem javafähigen Browser aufgerufen, lädt dieser das Applet und führt es aus.

 

Ein Applet zu dieser HTML-Seite kann zum Beispiel die Gestalt haben:

 

import java.awt.Graphics;

import java.applet.Applet;

public class HalloWeltApplet extends Applet {

public void paint(Graphics g) {

g.drawString("Hallo Welt!",8,30);

}

}

 

Als erstes werden die Packages java.awt.Graphics und java.applet.Applet importiert. Das Package java.awt.Graphics enthält Methoden für die Grafikausgabe, die benötigt werden, um dem Applet die Fähigkeiten zu geben, etwas auf der HTML-Seite auszugeben. Es ist nämlich nicht möglich, wie bei einer Applikation auf die Standardausgabekonsole zu schreiben, um eine Ausgabe auf der HTML-Seite zu erzielen. Die Klasse java.applet.Applet muß importiert werden, da jedes Applet von dieser Klasse abgeleitet werden muß.

 

Einige wichtige Methoden, die die Klasse java.applet.Applet enthält und die in fast jedem Applet gebraucht werden, sind:

 

  • void init(): Wird automatisch beim Initialisieren des Applets aufgerufen.
  • void start(): Wird automatisch bei der Aktivierung und Reaktivierung des Applets aufgerufen.
  • void stop(): Wird automatisch aufgerufen, wenn das Applet im Moment nicht angezeigt wird. Bei erneuter Anzeige wird es mit der Methode start() reaktiviert.
  • void destroy(): Wird automatisch zur Zerstörung des Applets und zur Freigabe der Ressourcen aufgerufen.
  • void paint(Graphics): Zeichnet den Applet Bereich und wird von init(), beim Verschieben des Fensters und wenn das Fenster mit dem Applet in den Vordergrund gebracht wird, automatisch aufgerufen. Die Methode ist für die Grafikausgabe des Applets zuständig.

 

Als nächstes wird die Klasse HalloWeltApplet definiert. Die Klasse erweitert die Klasse Applet, die die Grundfunktionen eines Applets enthält. Dann wird die Methode paint mit einem Parameter vom Typ Graphics definiert. Diese Methode ist schon in dem importierten Package enthalten und wird erweitert. Sie zeichnet den Bereich des Applets. Der Parameter vom Typ Graphics liefert einen Bezug zum aktuellen Grafikobjekt. In dieses Grafikobjekt wird dann der Text mit der Methode drawString(String,int,int) geschrieben. Als Stringvariable gibt man den auszugebenen String an, und die Integervariablen beschreiben die x- und y-Koordinate der Ausgabe in dem Anzeigefeld des Applets.

 

2.6 Objektorientierte Elemente von Java

2.6.1 Klassen und Instanzen

 

Klassen werden mit class Klassenname{ } definiert. Um mit einer Klasse arbeiten zu können, muß man eine Instanz - häufig auch als Objekt bezeichnet - von der Klasse erstellen. Eine Klassen ist eine abstrakte Darstellung eines Objekts, und eine Instanz ist dessen konkrete Darstellung. Von Klassen können mehrere Instanzen erzeugt werden, von denen jede Instanz eigene Instanzvariablen besitzt. Dieses Prinzip nennt sich Datenkapselung. Eine Instanz von einer Klasse wird wie folgt gebildet:

Klassenname NamederInstanz=new Klassenname();

Es wird eine Variable vom Typ Klassenname erzeugt. Hierbei handelt es sich um eine Variable, die eine Instanz vom Typ Klassenname aufnehmen kann, dieser Variablen wird eine Instanz von Klassenname zugewiesen. In den runden Klammern können Werte angegeben werden, die beim Initialisieren der Instanz gebraucht werden, falls das in der Klasse vorgesehen ist. Bei der Hauptklasse, die bei den Applets und Applikationen aufgerufen wird, wird durch den Aufruf eine Instanz der jeweiligen Klasse erstellt.

 

2.6.2 Methoden und Attribute

 

Jede größere Klasse, die in Java geschrieben wird, enthält Methoden und Attribute. Methoden sind Funktionen, die in den Klassen definiert werden. Sie können unter anderem Attribute ändern, mit Methoden aus anderen Instanzen kommunizieren und den Status einer Instanz ausgeben. Methoden kann man am einfachsten an einem Beispiel erklären. Man kann sich eine Klasse "Glühbirnen" vorstellen. Die Glühbirnen können ein- oder ausgeschaltet sein und eine beliebige Leuchtkraft haben. Des weiteren können sie ein- und ausgeschaltet werden. Die Attribute liefern Angaben über die Zustände der Instanz, zum Beispiel 100 Watt, eingeschaltet. Als Methode kann das Ein- und Ausschalten der Glühbirne definiert werden, wobei beim Aufruf dieser Methode das Attribut eingeschaltet/ausgeschaltet geändert wird.

2.6.3 Überladen und Überdefinieren von Methoden

Es ist in Java möglich, Methoden zu überladen. Man spricht von einer überladenen Methode, wenn mehrere Methoden definiert werden, die den gleichen Namen haben, sich aber durch die Parameterliste unterscheiden. Die Angabe der Parameter beim Aufruf entscheidet, welche der Methoden aufgerufen werden soll.

 

Beim Überdefinieren einer Methode wird eine eventuell geerbte Methode in der Instanz überschrieben, das heißt man kann der Methode eine neue oder geänderte Funktion zuordnen. Die überdefinierte Methode ist nicht verschwunden, sondern nur verdeckt. Man kann die ursprüngliche Methode mit Hilfe des Schlüsselwortes super ansprechen.

 

2.6.4 Konstruktoren und Finalizer

 

In den Klassen kann man Konstruktor-Methoden definieren, diese Methoden werden automatisch beim Erstellen einer neuen Instanz dieser Klasse aufgerufen. Wird in Java mit new eine neue Instanz einer Klasse angelegt, führt Java drei Aufgaben aus:11

 

  • Die Instanz bekommt Speicher zugewiesen.
  • Die Instanzvariablen werden initialisiert.
  • Die Konstruktormethode der Klasse wird aufgerufen.

 

Konstruktoren haben immer den gleichen Namen wie die Klasse, in der sie definiert werden. Eine Klasse kann mehrere Konstruktoren haben, die sich nur in den übergebenen Parametern unterscheiden. Beim Erstellen der Instanz wird dann anhand der übergebenen Parameter festgestellt, welcher Konstruktor aufgerufen wird. Man verwendet Konstruktoren, um Variablen mit bestimmten Werten zu initialisieren und um Instanzen anderer Klassen anzulegen, die von dieser Instanz benötigt werden.

 

Das Gegenstück zu den Konstruktor-Methoden ist die Finalizer-Methode. Sie wird aufgerufen, wenn die Instanz der Klasse gelöscht wird. In Java wird eine Instanz automatisch gelöscht, wenn keine Referenzen mehr auf die Instanz existieren.12 Die Bedeutung der Finalizer-Methode ist in Java wesentlich geringer als das Äquivalent in C++, die Destruktor-Methode, da nicht der Programmierer sondern die Javaumgebung selbst für die Speicherverwaltung verantwortlich ist.

2.6.5 Zugriffsschutzebenen public, protected und private für Methoden und Variablen

 

Durch Schutzebenen ist es möglich, die Daten von Variablen und den Aufruf von Methoden zu kapseln. Dadurch kann sichergestellt werden, daß Klassen nur auf bestimmte Methoden und Variablen anderer Klassen zugreifen können. Es wird ausgeschlossen, daß gekapselte Variablen und Methoden in ungewollter Weise manipuliert werden. Die Schutzebene public erlaubt von jeder anderen Klasse aus, diese Methode bzw. Variable zu sehen und darauf zuzugreifen.13 Will man den Zugriff und die Sichtbarkeit einschränken, kann die Schutzebene protected verwendet werden. Wenn eine Methode oder Variable protected definiert wird, kann auf diese Methode bzw. Variable von allen Methoden aus dieser Klasse und aus Subklassen zugegriffen werden. Die höchste Schutzebene stellt private dar, die eine Sichtbarkeit und Manipulation nur innerhalb der aktuellen Klasse zuläßt.14

 

2.6.6 Vererbung

 

Die Vererbung ist ein wichtiges Konzept der objektorientierten Programmierung. Durch sie erreicht man, daß Klassen in einer Vererbungsstruktur hierarchisch angeordnet sind und Methoden und Variablen von den übergeordneten Klassen erben. Die Realisation erfolgt in der Klassendefinition durch das Schlüsselwort extends und die Angabe der Superklasse. In Java ist es nicht möglich, eine Mehrfachverbung - das Erben von mehreren Superklassen - zu erstellen. Als Ersatz existieren in Java Schnittstellen, die Masken mit Eigenschaften bieten, die in andere Klassen implementiert werden sollen. 15

2.6.7 Schnittstellen

Bei einer Schnittstelle werden abstrakte Methoden und Konstanten verbunden. Abstrakte Methoden sind noch nicht implementierte Methoden, die in der Klasse, in die die jeweilige Schnittstelle importiert wird, konkretisiert werden. Diesen Vorgang kann man sich wie das Ausfüllen einer Schablone vorstellen.16 Das folgende Beispiel verdeutlicht die Benutzung einer Schnittstelle:

 

interface Textausgabe {

static final String Konst=new String ("Ausgabe: ");

void Textanzeige();

}

class Motorrad implements Textausgabe {

public void Textanzeige() {

System.out.println(Konst+"Motorrad");

}

}

class Auto implements Textausgabe {

public void Textanzeige() {

System.out.println(Konst+"Auto");

}

}

public class Schnittstelle {

public static void main(String args[]) {

Motorrad Fahrzeug1=new Motorrad();

Auto Fahrzeug2=new Auto();

Fahrzeug1.Textanzeige();

Fahrzeug2.Textanzeige();

}

}

 

Die Schnittstelle Textausgabe enthält eine Konstante mit dem Namen Konst, die mit dem Inhalt "Ausgabe:" vordefiniert wird. Des weiteren beinhaltet sie die abstrakte Methode Textanzeige. Die Klassen Motorrad und Auto implementieren die Schnittstelle. Beide Klassen konkretisieren die abstrakte Methode Textanzeige. In der main Methode werden dann Instanzen von den Klassen erstellt, und die Schnittstellenmethoden werden aufgerufen.

2.6.8 Schlüsselwörter this und super

 

Das Schlüsselwort this trifft man in vielen Programmen an.17 Stellt man this vor eine Variable, so meint man die Variable der aktuellen Instanz. Ein kleines Beispiel macht den Befehl deutlich:

 

int Zahl=1;

Test(int Zahl){

this.Zahl=Zahl;

}

 

In der ersten Zeile wird die Instanzvariable Zahl deklariert und initialisiert. Als nächstes wird eine Methode Test definiert, die als lokale Variable auch eine Variable mit dem Namen Zahl besitzt. Greift man nun in der Methode auf die Variable Zahl zu, wird automatisch auf die lokale Variable zugegriffen. Um auf die Instanzvariable zuzugreifen, muß man dem Variablennamen this voranstellen. Mit dem Befehl this.Zahl=Zahl; wird der Instanzvariablen der Wert der lokalen Variablen zugewiesen.

 

Das Schlüsselwort super bewirkt, daß man auf Methoden und Variablen der Superklasse - der Klassen von der die aktuelle Klasse Methoden und Variablen geerbt hat - zugreift. Mit einem Beispiel wird dieser Befehl verdeutlicht:

 

class Superklasse {

void drucke(){

System.out.println("Ausgabe der Superklasse!");

}

}

class Erbe extends Superklasse{

void drucke(){

super.drucke();

...

}

}

 

Zu Beginn wird die Klasse Superklasse definiert. Diese Klasse enthält die Methode drucke, die einen Text auf der Standardkonsole ausgibt. Die Klasse Erbe erbt alle Methoden der Klasse Superklasse und überdefiniert die Methode drucke. Bei dieser Methode wird zuerst die Methode drucke der Superklasse aufgerufen und ausgeführt, dann können weitere Befehle benutzt werden.

2.7 Internetzugriffe mit Java

Die Programmierung von Internetzugriffen mit Java ist einfach, da in der Klassenbibliothek viele Methoden existieren, mit denen der Netzzugriff ermöglicht wird. Die folgende Beispielapplikation liest eine WWW-Seite zeilenweise ein und gibt den HTML-Code dann auf der Standardausgabekonsole aus.

 

import java.net.*;

import java.io.*;

public class WWWSeiteLaden {

public static void main(String args[]) {

try {

URL WWWAdresse=new URL("http://www.uni-essen.de");

URLConnection WWWVerbindung=WWWAdresse.openConnection();

DataInputStream dis=new DataInputStream(WWWVerbindung.getInputStream());

String Zeilelesen;

while ((Zeilelesen=dis.readLine())!=null) {

System.out.println(Zeilelesen);

}

dis.close();

}

catch(MalformedURLException me) {

System.out.println("MalformedURLException: " +me);

}

catch(IOException ioe) {

System.out.println("IOException: " +ioe);

}

}

}

 

Um Netzfunktionen benutzen zu können, wird das Package java.net.* importiert. Die Anweisung try{} aktiviert die Behandlungsroutinen für Ausnahmen, welche mit der catch(Exception e){} angegeben sind. In Java gibt es verschiedene Ausnahmen, die beim Auftreten eines Fehlers aktiviert werden. Bei den Ein- und Ausgaben gibt es unter anderem die IOException, die FileNotFoundException und die InterruptedIOException. Falls ein Fehler in dem Programmblock der try{} Anweisung auftritt, wird die Abarbeitung der Befehle abgebrochen und es wird eine Ausnahmebehandlung aufgerufen, die durch die catch Anweisung abgefangen werden kann. In der catch Anweisung kann die Reaktion auf die Ausnahme programmiert werden. Innerhalb des try Programmblocks legt man als erstes eine URL Instanz an und weist dieser die Adresse der WWW-Seite zu. Mit der URL Instanz kann eine URLConnection Instanz erzeugt werden, die die für die Verbindung notwendigen Methoden enthält. Als nächstes muß man eine DataInputStream Instanz erstellen und dieser den Eingabestrom der Verbindung zuweisen. Nun können von diesem Datenstrom die Daten der WWW-Seite gelesen werden. Im Beispiel wird die Methode readLine() benutzt. Die Daten werden hiermit zeilenweise gelesen. Nachdem das Lesen beendet ist, muß der geöffnete Datenstrom mit der Methode close() geschlossen werden. Die nun folgenden catch Befehle gehören, wie schon oben beschrieben, zu dem try Befehl. Diese Befehle werden bei einem problemlosen Ablauf der Vorgänge ignoriert. Im Beispiel werden die Fehler, die mit der URL Instanz zusammenhängen, sowie die allgemeinen Eingabe- und Ausgabefehler abgefangen und die Fehlerbezeichnung wird auf der Standardkonsole ausgegeben.

 

Dieses als Applikation geschriebene Programm läßt sich auch in einem Applet verwenden. Dabei ist zu beachten, daß man mit einem Applet aus Sicherheitsgründen nur auf WWW-Seiten zugreifen kann, die auf dem Server liegen, von dem das Applet geladen wird. In der Literatur sind Beispiele zu finden, wo Applets auf fremde WWW-Seiten zugreifen. Beim Testen dieser Beispiele stellt sich jedoch heraus, daß sie nicht funktionieren.18

 

Neben der Möglichkeit, mit Java HTML-Seiten einzulesen, kann ein Java-Programm die Funktion übernehmen, Parameter über die CGI-Schnittstelle (Common Gateway Interface) weiterzuleiten. Die CGI-Schnittstelle erlaubt es, externe Programme unterhalb eines WWW-Servers zu betreiben.19 Externe Programme können in einer beliebigen Programmiersprache geschrieben sein, sofern diese mit Aufrufen und Parametern, die über die CGI-Schnittstelle übergeben werden, arbeiten können. Die Kommunikation über die CGI-Schnittstelle findet in zwei Richtungen statt: vom Client zum Server und umgekehrt vom Server zum Client. Es existieren mit der GET und der POST Methode zwei Möglichkeiten, um Daten vom Client zu dem auf dem Server ablaufenden Programm zu schicken. Die Methoden unterscheiden sich in der Art, wie die Daten übermittelt werden. Bei Verwendung der GET Methode werden die zu übertragenden Informationen an den URL-Adresse angehängt und zum Server transferiert. Über die Umgebungsvariable "QUERY_STRING" erhält das auf der Serverseite aufgerufene Programm die Parameter. Die POST Methode benutzt eine HTTP-Verbindung und sendet die Daten in einem URL-kodierten Datenstrom, wobei die Kodierung dazu dient, Fehlinterpretationen zu vermeiden. Das Programm auf dem Server muß eine URL-Dekodierung vornehmen. Der Vorteil der POST Methode besteht darin, daß es keine Beschränkungen bei der Übertragung der Zeichenmenge gibt. Bei der GET Methode können die URLs durch viele übergebene Daten sehr lang werden. Probleme treten dadurch auf, daß viele WWW-Server eine maximale Länge für URLs besitzen, die sie verarbeiten können.20

 

Die Parameterübergabe mit der POST Methode kann folgende Gestalt haben:

 

import java.applet.Applet;

import java.net.*;

import java.io.*;

public class CGIApplet extends Applet {

public void start() {

try {

String Argument=URLEncoder.encode("Karl Heinz");

URL url=new URL("http://bugs:8080/servlet/gruss");

URLConnection Verbindung=url.openConnection();

Verbindung.setDoOutput(true);

PrintStream Ausgabestrom=new PrintStream(Verbindung.getOutputStream());

Ausgabestrom.print("Benutzername="+Argument);

Ausgabestrom.close();

}

catch (MalformedURLException me) {

System.err.println("MalformedURLException: "+me);

}

catch (IOException ioe) {

System.err.println("IOException: "+ ioe);

}

}

}

 

Teile dieses Beispiels sind bereits im Rahmen des vorangegangenen Beispiel erklärt worden.

Die Anweisung String Argument=URLEncoder.encode("Karl Heinz"); bewirkt, daß der Text beim WWW-Client in das x-www-form-urlencode Format umgewandelt wird, das für den Datenversand über die CGI-Schnittstelle benötigt wird.21 In den nächsten zwei Zeilen wird eine Verbindung zum CGI-Script hergestellt. Das Vorgehen ist identisch mit dem Verfahren zum Verbindungsaufbau zu einer HTML-Seite im vorangegangen Beispiel.

 

Die Bedeutung der Anweisung Verbindung.setDoOutput(true); ist nicht klar. Verwendet man die CGI-Schnittstelle in einer Applikation, wird dieser Befehl nicht benötigt.22 Die CGI-Schnittstelle kann ohne diese Anweisung benutzt werden, wenn das Applet mit dem Microsoft Internet Explorer 3.0 oder dem AppletViewer von Sun Microsystems angezeigt wird. Bei der Benutzung des Netscape Navigators hingegen wird ohne die Anweisung folgende Fehlermeldung ausgegeben:

 

java.net.UnknownServiceException: protocol doesn't support output

 

 

Nach Einfügen der Anweisung funktioniert das Applet auch mit dem Netscape Navigator. In dem Java API steht als Erklärung zu dieser Anweisung:

 

"public void setDoOutput(boolean dooutput)
Eine URL Verbindung kann für Eingaben und / oder Ausgaben benutzt werden. Setzen Sie das DoOutput Flag auf True, wenn Sie beabsichtigen die URL Verbindung für Ausgaben zu verwenden oder auf False wenn nicht. Der Standardwert ist False."23

 

Als nächstes kann dann ein Ausgabestrom auf die Verbindung angelegt werden. Nun ist es möglich, etwas in den Ausgabestrom zu schreiben. Diese Daten werden direkt zum Server geschickt. Um die Ausgaben von einem CGI-Script bearbeiten zu können, muß der Parametername mit einem nachgestellten Gleichheitszeichen und dem Parameterwert im x-www-form-urlencode Format übergeben werden. Sollen mehrere Parameter übergeben werden, ist es ab dem zweiten Parameter notwendig, ein "&" vor den Parameternamen zu stellen.

 

2.8 Probleme der Programmiersprache Java

Obwohl Java als Programmiersprache für das Internet einige wesentliche Vorteile gegenüber herkömmlichen Sprachen aufweist (vgl. Kapitel 2.2), muß man beachten, daß Java eine neue Programmiersprache ist und im Moment in der Sprachversion 1.02 vorliegt. Diese Version hat einige Mängel, die im folgenden beschrieben werden sollen. Die nächste Version von Java (Version 1.1) ist für das 1. Quartal 1997 vom Hersteller Sun Microsystems angekündigt und einige der Schwächen sollen in der neuen Sprachversion behoben sein.

 

Ein Nachteil von Java liegt darin, daß keine Mehrfachvererbungen verwendet werden können. Sie sind in der aktuellen Version durch einen Delegationsmechanismus mit Interface-Klassen ersetzt. Mit den Interface-Klassen lassen sich viele Aufgaben, die in C++ mit Mehrfachvererbungen erledigt werden, in Java nur sehr umständlich lösen.24

 

Außerdem sind die Klassenbibliotheken von Java nicht sehr umfangreich. Es fehlen zum Beispiel Klassen, um Texte oder Grafiken zu einem Drucker zu schicken. Das Abstract Window Toolkit (AWT) enthält nur wenige Klassen zur Gestaltung von Oberflächen.25 Dadurch werden die Gestaltungsmöglichkeiten für Benutzeroberflächen mit Java stark eingeschränkt. Da die Klassenbibliotheken noch nicht ausgereift sind, kommt es regelmäßig zu Grafikfehlern und Instabilitäten.26

 

Ein wesentlicher Nachteil der Programmiersprache Java gegenüber anderen Sprachen ist die Ausführungsgeschwindigkeit. Der Java-Compiler erzeugt einen plattformunabhängigen Bytecode, der bei Ausführung eines Programms während der Laufzeit von einem Interpreter abgearbeitet wird. Dieses Verfahren bringt Java die Portabilität, bedeutet aber gleichzeitig einen Performanceverlust.27 Um dieses Problem auszuschalten, gibt es zwei Lösungsansätze von Sun Microsystems. Der erste Lösungsansatz ist ein sogenannter "Just-in-Time"-Compiler.28 Dieser Compiler übersetzt den Bytecode in Maschinencode und versucht, Bereiche des Programms zu finden, die häufiger ausgeführt werden, wie zum Beispiel Schleifeninhalte. Diese Bereiche werden dann in Maschinencode zwischengespeichert, so daß sie bei mehrfacher Ausführung nur einmal übersetzt werden müssen. Mit dieser Technologie hat Sun es in einem Versuch geschafft, Java-Programme genauso schnell wie kompilierte C-Programme laufen zu lassen.29 Der andere Lösungsansatz benutzt einen sogenannten java2c-Übersetzer. Der mit dem Java-Compiler erzeugte Bytecode wird mit dem java2c-Übersetzer in C übersetzt und anschließend mit einem C-Compiler in den Maschinencode des jeweiligen Systems umgewandelt.30

 

Da Java sich als Internetsprache etablieren will, ist die Sicherheit ein wichtiger Aspekt. Java bietet durch sein Sicherheitssystem, das unter anderem Applets verbietet, auf lokale Dateisysteme zuzugreifen und den Bytecode einer Sicherheitsprüfung unterzieht, mehr Sicherheit als andere Programmiersprachen. Aber Java hat noch einige Sicherheitslücken.31 Es gibt beispielsweise Java-Applets, die sich nicht mehr schließen lassen, oder sonstige Ärgernisse bei dem Client-Browser verursachen können.32

 

Ein weiterer Mangel von Java kann darin gesehen werden, daß die Entwicklungsumgebungen, die die Entwicklung von Java-Programmen unterstützen, nicht so komfortabel und stabil sind, wie zum Beispiel die Entwicklungsumgebungen von Borland Delphi oder Microsoft Visual Basic.33

2.9 Die Zukunft von Java

Die Programmiersprache Java hat Anfang 1996 durch die Implementierung in dem zur damaligen Zeit beliebtesten Internet-Browser - dem Netscape Navigator 2.0 - eine große Verbreitung gefunden. Heutzutage gibt es bereits 83 000 WWW-Seiten im Internet, die Java nutzen. Im Jahr 2000 soll es nach einer IDC-Schätzung an die 800 000 Java-Entwickler geben.34 Die Stärke von Java liegt in der Internetprogrammierung, die durch die Einbindung von Netzwerkklassen in die Klassenbibliothek sehr leicht zu realisieren ist.

 

Durch die vielfältigen Aufgaben, die über das Internet erledigt werden, muß auf jeden Fall eine Internet-Programmiersprache benutzt werden. So ist es denkbar, eine Hotelanwendung zu entwickeln, die es ermöglicht, ein Hotelzimmer anzuschauen, zu buchen und mit der Kreditkarte zu bezahlen. Diese Anwendung wäre zwar auch über CGI-Programme lösbar, aber mit Java hat man wesentlich mehr Möglichkeiten. Beispielsweise wäre eine Verschlüsselung der Kreditkartennummer für die Netzübertragung denkbar, die über CGI-Programme nicht zu realisieren ist.

 

Die für Java optimierten Prozessoren, die von Sun Microsystems entwickelt werden, bieten eine hohe Performance. Der demnächst erhältliche Prozessor picoJava I soll laut Sun Microsystems eine bis zu 20mal höhere Javaperformance erreichen als Prozessoren der x86- und anderer Prozessorarchitekturen. Bei Verwendung eines "Just-in-Time"-Compilers soll picoJava I eine Geschwindigkeitssteigerung um das Fünffache gegenüber den anderen Prozessoren bewirken.35 Falls diese für Netzwerk-Computer vorgesehenen Prozessoren sich am Markt behaupten, ist das eine gute Ausgangsposition für die Programmiersprache Java, da für Netzwerk-Computer Programme aller Art geschrieben werden müssen. Da Java plattformunabhängig ist, ständen die Programme auch für alle weiteren javafähigen Plattformen zur Verfügung. Daß es möglich ist, mit Java anspruchsvolle Applikationen zu schreiben, hat Sun Microsystems schon durch den in Java geschriebenen WWW-Browser HotJava, der Java-Programmierumgebung Java Workshop und dem WWW-Server Jeeves bewiesen.

 

Trotz der oben erwähnten guten Zukunftsperspektiven von Java als Internetsprache existiert eine starke Konkurrenz durch Visual Basic mit ActiveX von Microsoft. Diese Sprache bietet im Internetbereich ähnliche Möglichkeiten, hat aber den Vorteil, daß sie leichter zu erlernen ist.36 Da diese Sprache auf Visual Basic aufbaut, ist die Sprachgrundkonstruktion langjährig getestet.

 

Druckversion
(C)1996-2024 Wolfgang Büning  >> Impressum