Java
Inhalt
5 Aufbau und Anwendungspotentiale von Java
5.1 Aufbau und Konzepte
5.1.1 Kurzeinführung in JAVA
5.1.2 Gegenüberstellung Java - herkömmliche Programmiersprachen 5.1.3 Was fällt weg? (im Vergleich zu C/C++)
5.1.4 Speicherverwaltung 5.1.5 Threads
5.1.6 Benennungskonventionen
5.1.7 Datentypen und Strukturen
5.1.8 Die Syntax, eine Ãœbersicht
5.1.9 Compiler
5.1.10 Virtuelle Maschine
5.1.11 Linker? 5.2 Java - Entwicklung und Java - Tools
5.2.1 Was ist Java?
5.2.2 Wie entstand Java?
5.2.3 Die ersten Java - Projekte 5.2.4 Das Java - Development - Kit (JDK) und dessen Nutzung
5.2.5 Die Java - Packages
5.2.6 Entwicklungsumgebungen für Java 5.3 Applets: Animation und Interaktion im WWW
5.3.1 Java und das WWW
5.3.2 Java - Applets in WWW - Seiten
5.3.3 Operationen beim Abruf einer WWW - Seite mit Applets
5.3.4 Gartner - Group Modell 5.3.5 Animation und Interaktion mit Java - Applets
5.3.6 Sicherheitsaspekte
Literaturverzeichnis
5 Aufbau und Anwendungspotentiale von Java
5.1 Aufbau und Konzepte
In diesem Kapitel soll ein Überblick über die Konzepte von Java gegeben werden. In der Knappheit, die diesem Dokument auferlegt wurde, können natürlich nicht alle Aspekte mit der nötigen Tiefe erörtert werden. Es wurde jedoch versucht alle Besonderheiten der Sprachkonzepte Javas zu würdigen.
5.1.1 Kurzeinführung in JAVA
Was ist JAVA?
JAVA ist eine Programmiersprache.
Beim Design von Java wurde versucht die Goodies der bekannten Programmiersprachen zu übernehmen und deren Nachteile die sich im Laufe deren Existenz gezeigt haben auszubügeln. Java ist rein objektorientiert und hat keine strukturellen Überbleibsel, wie das z.B. in C++ der Fall ist. Java sollte alles enthalten, was das Programmieren angenehm macht und dabei mit einer klar überschaubaren und redundanzfreien Syntax auskommen.
Nach SUN (http://java.sun.com/java.sun.com/allabout.html):
Java is a simple, robust, object - oriented, platform - independent multi - threaded, dynamic general - purpose programming environment. It's best for creating applets and applications for the Internet, intranets and any other complex, distributed network.
Java entstand aus der deprimierenden Erfahrung Suns, dass die vorhandenen "neuen" Programmiersprachen mit neuen Programmierparadigmen keinesfalls eine revolutionäre Erleichterung in der Softwareentwicklung mit sich brachten. Java soll nun endlich die Vorzüge neuer Entwicklungsmethoden auf die Ebene der Programmiersprache bringen und dem Programmierer das "Leben" erleichtern.
Was kann JAVA?
Java kann nicht mehr und nicht weniger als andere Programmiersprachen auch. Durch die Konzeption eignet sich Java jedoch für eine Fülle von Anwendungen die Plattformunabhängigkeit macht Java z.B. zur idealen Programmiersprache für verteilte Anwendungen, insbesondere im WWW. Dabei bleibt der Anspruch auf Portabilität nicht im leeren Raum (man erinnert sich noch vage an die Aussage das C eine portable Programmiersprache ist), der praktische Einsatz verschiedener Java Applikationen und insbesondere der Applets zeigt, dass Java durch seine Konzepte wirklich auf den unterschiedlichsten Plattformen lauffähig ist.
Verschiedene große Betriebsystem Hersteller wollen Java als Bestandteil in ihre Betriebsysteme integrieren. Dazu gehören z.B. Micro$oft, IBM und Apple.
Was kann JAVA nicht?
Kaffee kochen.
5.1.2 Gegenüberstellung Java - herkömmliche Programmiersprachen
Um JAVA gegenüber den bekannten Programmiersprachen abgrenzen zu können werden wir zunächst Unterschiede und Gemeinsamkeiten heraus arbeiten und dann auf die Unterschiede genauer eingehen.
Cobol |
C |
C++ |
Smalltalk |
Java |
|
Objektorientiert |
|||||
Datentypen |
|||||
Zeiger |
|||||
Unions/Strukturen |
|||||
Einfach |
|||||
Standard Library |
|||||
Portable |
|||||
Garbage Collection |
|||||
Threading |
|||||
Fehlerbehandlung |
|||||
Precompiler |
|||||
Interpretiert |
|||||
Linker |
|||||
Dynamisch |
|||||
Verifizierung |
|||||
Robust |
|||||
Sicher |
5.1.3 Was fällt weg? (im Vergleich zu C/C++)
Keine Strukturen, Aufzählungstypen, Unions
Die Aufzählungstypen (z.B. enum), Strukturen und Unions können in Java, wie in jeder objektorientierten Programmiersprache, durch geeignete Klassen dargestellt werden. Deshalb sind explizite Typendefinitionen unnötig. Dieser Schritt, typedefs, enums etc. aus C++ zu entfernen war wegen der gewünschten "Kompatibilität" zu C nicht möglich. In Java wird durch diese Maßnahme die Syntax wesentlich schlanker und auch die Probleme der Namensraumvergabe wird durch die dann nötigen zugehörigen Klassen vermieden. (In C haben z.B. alle enum Typen einen eigenen, gemeinsamen Namensraum)
Keine Funktionen
Alleinstehende Funktionen, die nicht Methoden einer Klasse sind, werden nicht unterstützt. Das vermeidet Mehrdeutigkeiten und Widersprüche in der Klassenhierarchie. Java unterstützt Klassenmethoden und Klassenvariablen, wodurch alleinstehende Funktionen unnötig werden.
Keine Header Files
In Java werden die Klassen komplett in einem File Codiert. Header Files wie in C gibt es nicht. Zu jeder Klasse wird ein eigenes Klassenname.class File erzeugt. Dadurch kann es z.B. nicht mehr vorkommen, dass durch Änderungen in einer Zentralen Klasse in einem Header File das gesamte Projekt neu Übersetzt werden muss. Der Einsatz von Java macht Hilfsmittel wie make und trickreiche Compilerfeatures, die versuchen dieses Problem zu minimieren unnötig.
Kein Ãœberladen von Operatoren
Java unterstützt kein Operator Overloading. Diese Möglichkeit war bzw. ist schon immer umstritten. Sun hat der Regel der Einfachheit und Klarheit Vorrang gegeben. Die Möglichkeiten des Operator Overloadings kann durch Klassenmethoden einfach ersetzt werden.
Kein Precompiler (z.B. #DEFINE)
Precompiler, wie man sie von C oder C++ her kennt, werden von Java nicht eingesetzt. Der durchgängig objektorientierte Ansatz soll einen Precompiler unnötig machen. Globale Definitionen von Konstanten können als Klassenvariablen (static) realisiert werden. Dadurch bekommen die Konstanten auch einen eigenen Namensraum, was widersprüchliche Bezeichnernamen ausschließt. Diverse Tricks und auch Fehlerquellen werden so ausgeschlossen.
Keine vage definierte Datentypen
In Java sind die primitiven Datentypen, anders als in C vollständig definiert. So ist ein int immer 32 Bit breit und mit Vorzeichen behaftet. Es gibt anders als in C feste Definitionen für die Basis Datentypen. Die übrigens die einzigen Typen sind die keine Klasse darstellen. Durch Vererbung können ihnen jedoch weitere Methoden zugeordnet werden.
Die direkte Implementierung von Basis Datentypen in die Programmiersprache verbessern das Laufzeitverhalten, gegenüber Typenlosen Programmiersprachen wie zum Beispiel Smalltalk, enorm.
Keine (expliziten) Pointer und keine Pointerarithmetik
Java hat zum Ziel, eine möglichst sichere Laufzeitumgebung zur Verfügung zu stellen. Aufgrund der Möglichkeit, komplexe Strukturen mit Hilfe von Klassenhierarchien darzustellen, ist Java nicht auf Pointerarithmetik angewiesen. In Java gibt es generell keine expliziten Pointer, womit ein weiterer Großteil der Fehlermöglichkeiten herkömmlicher C und C++ Programme ausgeschlossen werden.
Keine vargs (freie Argumentenanzahl)
Java unterstützt keine Funktionen mit variabler Argumentenanzahl wie es z.B. in C bei der Funktion printf verwendet wird. Auch hier stellt der objektorientierte Ansatz geeignetere und weniger fehlerträchtige Möglichkeiten zur Verfügung (wie es schon in C++ mit cout realisiert wird).
Keine Mehrfachvererbung
Die gewaltigen Probleme die durch den Einsatz von Mehrfachvererbungen auftreten können sind dadurch umgangen werden, dass es diese Möglichkeit nicht gibt. Durch den Einsatz von Interfaces die einen Satz von Schnittstellenmethoden definieren, die in der Klasse implementiert werden, wird eine weitgehend vergleichbare Funktionalität ohne die bekannten Probleme erreicht. Diese Interfaces wurden den protocols in Objective C nachempfunden.
Kein Semikolon oder doch Semikolon
Beim Design von Java wurde darauf geachtet, dass der Programmierer nicht mit irgendwelchen "; erwartet" Fehlermeldungen zu kämpfen hat. Wo es die Grammatik erlaubt ist der ";" optional oder kann beliebig oft gesetzt werden. Bei der Entwicklung der Sprache wurde auch darauf geachtet, das der Compiler die Möglichkeit hat Fehler genau zu lokalisieren. Die in C übliche Fehlermeldung mit Verweis auf eine Zeile die auf die eigentlich fehlerhafte Zeile mit fehlendem Semikolon folgt sollte in Java nicht vorkommen.
5.1.4 Speicherverwaltung
Als erste Besonderheit, insbesondere für nicht Smalltalk Programmierer ist das Konzept der Speicherverwaltung in Java zu nennen. In Java gibt es keinen Heap auf dem dynamische Daten allociert werden, also auch kein malloc oder mfree. Vielmehr sorgt die Java Laufzeitumgebung selbst dafür, das nicht mehr benötigte Objekte automatisch freigegeben werden. Dazu trägt jedes Objekt einen Zähler mit sich, wie viele Verweise auf das Objekt noch existieren.
Die Arbeit selbst dafür zu sorgen das Objekte rechtzeitig freigegeben werden, die z.B. in C++ bei komplexeren Programmen extreme Ausmaße annimmt entfällt also völlig. Man spricht von einem Garbage Collector. In Java läuft dieser Garbage Collector in einem eigenen Task mit niederer Priorität, das Aufräumen wird also im Hintergrund erledigt.
Speicherleichen, also Objekte die nicht mehr benötigt werden, deren Speicher jedoch nicht freigegeben wurde gehören automatisch der Vergangenheit an. Es kann auch nicht mehr vorkommen das eine Referenz auf ein nicht mehr allociertes Objekt existiert, was bei C und C++ zu häufigen Fehlern geführt hat (z.B. eine durch eine lokale Funktion deklarierte Variable wird per Pointer dem Aufrufer bekanntgegeben).
Dieses Konzept tritt nicht nur auf Objekte sondern auch für Klassen in Kraft, da Klassen in Java nichts anderes sind als von der Klasse Objekt abgeleitete Objekte. Das heißt insbesondere das zur Laufzeit eines Programms nur die Klassen im Hauptspeicher gehalten werden die auch wirklich gebraucht werden. Das hat zur Folge, dass beim Programmstart zunächst nur die Basisklassen z.B. der awt Library geladen werden, was allerdings auf Grund des dynamischen Linkvorgangs, der gleichzeitig einsetzt merklich Zeit in Anspruch nimmt.
5.1.5 Threads
Java verwendet selbst z.B. zur Realisierung der Speicherverwaltung Threads und es bietet dem Programmierer Klassen und Methoden zur Threadbildung zur Verfügung. Threads ermöglichen das parallele Ausführen einzelner Programmteile. Bei GUI basierenden Systemen ist es z.B. wichtig das verschiedene Aufgaben parallel erledigt werden. So will der Anwender in der Menüstruktur blättern, während in einem Fenster Berechnungen ausgeführt werden und in einem anderen gerade eine Grafik aufgebaut wird.
Bei Java muss sich der Programmierer nicht mehr mit den Besonderheiten der Zielplatform auseinandersetzen und er muss auch keine Bedenken haben ob die standard Library Funktionen reentredant (sprich mehrfach gleichzeitig aufgerufen werden dürfen) sind. Er bekommt durch Java einheitliche Methoden zur Synchronisation von Threads und zur Kommunikation zwischen verschiedenen Threads zur Verfügung gestellt. Durch den Modifizierer synchronized können Methoden eines Objekts gegen mehrfachen parallelen Aufruf geschützt werden. Ein in der Java Laufzeitumgebung implementierter Monitor überwacht dann das diese Methoden des Objekts nicht parallel sondern seriell Ausgeführt werden. Generell sollten alle Methoden die Objektatribute verändern als synchronized deklariert werden.
Die Standardbibliothek ist vollständig "Threadfest", das heißt Methoden kann uneingeschränkt mehrfach parallel aufgerufen werden.
5.1.6 Benennungskonventionen
Wie schon mehrfach erwähnt werden in Java Klassen unter ihrem Realnamen abgelegt. Dadurch muss man beachten, dass ein File mit dem Namen test.java nach der Compilierung unter Umständen mehrere Files erzeugt die zum Beispiel klasse1.class, klasse2.class etc. heißen. Zum Auffinden der Klassen wird vom ClassLoader der Klassen eine bestimmte Strategie verfolgt (wie Eingangs erwähnt kann der ClassLoader auch überladen werden und dadurch sein Verhalten verändert werden). Klassen werden zu sogenannten Packages zusammengefaßt. Bestes Beispiel sind die standard Librarys deren Namen alle mit dem Prefix java. beginnen. Um den Anspruch an die Dateisysteme nicht übergebühr zu erhöhen wird zum Beispiel für die Klasse java.awt.list der Filenamen list.class Verzeichnis .\java\awt\ verwendet.
Inzwischen ist man dazu übergegangen die kompletten Librarys in einem Archiv zu speichern (CLASSES.ZIP). Dieses File darf bei der Installation von Java keinesfalls ausgepackt werden.
Zur Benennung von Klassen die (Inter - ) Netz weit bekannt sein sollen, gilt die Konvention als Prefix der Klassen den eigenen URL zu verwenden (dadurch wäre es mit einem geeigneten ClassLoader möglich Klassen automatisch in der aktuellsten verfügbaren Version vom durch den URL zu identifizierenden Server zu Laden). Die Problematik der unter Umständen recht langen Klassennamen (de.fh - furtwangen.ask.katze.libs.car.class) wird derzeit heftig diskutiert und ist auch reichlich umstritten.
5.1.7 Datentypen und Strukturen
In Java gibt es folgende grundlegende Basis Datentypen:
-
byte 8 Bit Zahlenwert ( - 128..127) short 16 Bit Zahlenwert int 32 Bit Zahlenwert long 64 Bit Zahlenwert float 32 Bit IEEE 754 Fließkommazahl double 64 Bit IEEE 754 Fließkommazahl char 16 Bit Unicode Zeichen boolean "echter" 1 Bit Wert Arrays String Unicode String
String ist in Java ein echter Datentyp und nicht wie in C ein künstliches Array von Zeichen. Allerdings sind einige Methoden zur Stringmanipulation in einer Klasse der Standard Library gekapselt.
5.1.8 Die Syntax, eine Ãœbersicht
Die Kontrollstrukturen, Schleifen und Operatoren sind weitgehend die von C oder C++ her bekannten Konstrukte. Lediglich bei den Operatoren musste, da es keine vorzeichenlosen Zahlen gibt der>>> Operator eingefügt werden, der eine Zahl bitweise nach rechts Schiebt und von rechts Nullen nach schiebt. Im Gegensatz zum>> Operator, der das Vorzeichenbit nach schiebt. In C wurde dies anhand dessen entschieden, ob der Zahlenwert vorzeichenbehaftet war oder nicht.
Auf der nächsten Seite befindet sich die, bis auf die kursiv dargestellten Symbole DocComment, Identifier, Number, String und Character komplette Syntaxbeschreibung der Programmiersprache Java. Die Syntax ist trotz der Objektorientiertheit nicht wesentlich Komplexer als die der Programmiersprache C. Die Fett dargestellten Symbole sind Zeichen wie sie im Quelltext erscheinen. Folgende Notation wird für die Grammatik verwendet:
Ausdruck = Metaausdruck; "|" steht für Alternativen, (...) für Gruppierungen, ? für kein oder einmaliges Auftreten und * für kein oder mehrmaliges Auftreten.
CompilationUnit= PackageStatement? ImportStatement* TypeDeclaration* ;
PackageStatement= package PackageName ; ;
ImportStatement= import PackageName. * ;| import ( ClassName | InterfaceName ); ;
TypeDeclaration= ClassDeclaration | InterfaceDeclaration | ; ;
ClassDeclaration = Modifier* class Identifier (extends ClassName)? (implements InterfaceName (, InterfaceName)*)? { FieldDeclaration* } ;
InterfaceDeclaration = Modifier* interface Identifier (extends InterfaceName (, InterfaceName)*)? { FieldDeclaration* } ;
FieldDeclaration = DocComment? MethodDeclaration | DocComment? ConstructorDeclaration | DocComment? VariableDeclaration | StaticInitializer | ; ;
MethodDeclaration = Modifier* Type Identifier ( ParameterList? ) ( [ ] )* ( { Statement* } | ;) ;
ConstructorDeclaration = Modifier* Identifier ( ParameterList? ) { Statement* } ;
VariableDeclaration= Modifier* Type VariableDeclarator (, VariableDeclarator)* ; ;
VariableDeclarator= Identifier ([ ])* (= VariableInitializer)? ;
VariableInitializer= Expression | { ( VariableInitializer (, VariableInitializer )* ,? )? } ;
StaticInitializer= static { Statement* } ;
ParameterList = Parameter (, Parameter)* ;
Parameter = TypeSpecifier Identifier ([ ])* ;
Statement = VariableDeclaration | Expression ; | { Statement* } | if ( Expression ) Statement (else Statement)? | while ( Expression ) Statement | do Statement while ( Expression ) ; | try Statement (catch ( Parameter ) Statement)* (finally Statement)? | synchronized ( Expression ) Statement | return Expression? ; | throw Expression ; | switch ( Expression ) { Statement* } | case Expression : | default; | Identifier : Statement | break Identifier? ; | continue Identifier? ; | ; ;
BiOp= + | - | * | / | % | ^ | & | | | && | || | << |>> |>>> | = | += | - = | *= | /= | %= | ^= | &= | |= | <<= |>>= |>>>= | < |> | <= |>= | == | != |. |, ;
Expression= Expression BiOp Expression | Expression instanceof ( ClassName | InterfaceName ) | Expression ? Expression : Expression | Expression [ Expression ] | ++ Expression | - - Expression | Expression ++ | Expression - - | - Expression | ! Expression | ~ Expression | ( Expression ) | ( Type ) Expression | Expression ( ArgList? ) | new ClassName ( ArgList?) | new TypeSpecifier ( [ Expression ] )+ ([ ])* | new ( Expression ) | true | false | null | super | this | Identifier | Number | String | Character ;
ArgList = Expression (, Expression )* ;
Type = TypeSpecifier ([ ])* ;
TypeSpecifier= boolean | byte | char | short | int | float | long | double | ClassName | InterfaceName ;
Modifier= public | private | protected | static | final | native | synchronized | abstract | threadsafe | transient ;
PackageName= Identifier | PackageName. Identifier ;
ClassName= Identifier | PackageName. Identifier ;
InterfaceName= Identifier | PackageName. Identifier ;
Java lässt für Bezeichner (Identifier) Zeichen aus dem Unicode zu, das heißt, dass z.B. auch Umlaute in Namen vorkommen können. Diese Möglichkeit bereitet allerdings noch etlichen Dateisystemen Probleme, da die Klassennamen direkt in *.class Files abgelegt werden, daher ist bei der Benennung der Klassen darauf zu achten nur ASCII Zeichen zu verwenden, die auch in üblichen Dateisystemen verwendet werden dürfen. Da einige Betriebsysteme etwas lausig mit dem Vergleich von Dateinamen umgehen (Namentlich z.B. WIN95) sollte auch darauf geachtete werden, dass sich Klassen nicht nur durch Groß - und Kleinschreibung unterscheiden, was in Java generell möglich ist.
Zahlen (Number) werden wie in C üblich dargestellt. char ist immer ein 16Bit Unicode Wert, der entsprechend dargestellt wird 7 Bit ASCII Werte werden direkt in ihre Unicode Entsprechungen transformiert.
Strings werden wie in C üblich durch doppelte Hochkomma eingeschlossen dargestellt. Für die Darstellung von Unicode Zeichen gibt es eine spezielle Escape Darstellung.
Bleiben noch die DocComments, mittels des zur Java Entwicklungsumgebung gehörenden Dokumentencompilers kann aus Java Quelltext eine Dokumentation der Klassenhierarchie und der Klasseninterfaces erstellt werden. Sun hat aus der Not, das der Quelltext sich schneller verändert als die Dokumentation angepaßt wird eine Tugend gemacht und ermöglicht die Dokumentation des Codes direkt im Programmcode unterzubringen.
Um textuelle Beschreibungen in diese Dokumentation einfließen zu lassen gibt es eine spezielle Kommentarklammerung. Der Text zwischen /** und */ wird zur Beschreibung des darauffolgenden Codes (in der Regel eine Definition) verwendet und Automatisch eingebunden. Das erzeugte Dokument wird im HTML Format ausgegeben. Es ist auch möglich im Kommentar HTML Tags zu verwenden die dann in das Dokument übernommen werden. Hyperlinks ermöglichen es die Verschiedenen Hierarchiestufen der Klassen zu verfolgen. In den Kommentaren können dadurch auch HTML Tags z.B. zur Hervorhebung genutzt werden.
5.1.9 Compiler
Der Java Compiler (javac) überprüft den Quelltext und erzeugt aus den *.java Files die entsprechenden *.class Files der Klassen die darin Implementiert sind. In der aktuellen JDK Version (1.01) muss zwischen dem Dateinamen des Quelltextes und den der erzeugten Class Dateien kein Zusammenhang mehr bestehen. In früheren Versionen musste in der Quelltextdatei eine Klasse mit dem Namen der Datei enthalten sein. Bei der Compilation wird der Quelltext bereits, soweit möglich, auf Fehler untersucht und in den von der Virtuellen Maschine zu interpretierenden Bytecode umgewandelt. Identifizierer, die zum Beispiel für den Zugriff auf andere Klassen benötigt werden bleiben dabei in Klarschrift erhalten und werden erst vom Interpreter in (physische) Adressen umgesetzt.
Zum Compiler gehört auch javadoc, der aus Java Quellfiles ein HTML Dokument der Klassenhierarchien und der Klassen Methoden und Attribute erzeugt. Dazu werden auch die Texte aus den Dokumentkommentaren verwertet.
In Suns JDK (Java Development Kit) ist auch ein Compiler namens javac_g vorhanden. Dieser hat die gleiche Funktionalität wie der javac Compiler, er wurde jedoch mit Debuging Informationen übersetzt und ermöglicht so das leichtere Auffinden von Fehlern innerhalb des Compilers. Der Compiler selbst verwendet die Java Librarys, daher ist die Größe des Programms überraschend gering.
5.1.10 Virtuelle Maschine
Die Virtuelle Maschine interpretiert den Java Bytecode. Erst sie löst externe Referenzen auf, indem sie den ClassLoader, der die benötigte Klasse bei Bedarf sucht und in den Hauptspeicher lädt, aufruft und die Klartextnamen durch Adressreferenzen ersetzt.
Auf einem Computer bzw. Betriebssystem auf dem diese Virtuelle Maschine realisiert ist können alle Java Programme laufen. Dabei ist keine Neucompilierung des Quelltextes nötig. Vor der Instanziierung einer Klasse werden dabei Laufzeitprüfungen und eine Verifikation vorgenommen, welche die Sicherheit des Programms gewährleisten sollen (dazu später mehr).
5.1.11 Linker?
In Java gibt es keinen Linker im ursprünglichen Sinne, wie schon oben Beschrieben wird jede Klasse in ein einzelnes File gespeichert. Der ClassLoader lädt die Klassen automatisch bei Bedarf (und erst dann) in den Hauptspeicher. Gibt es keine Referenz bzw. Instanz der Klasse mehr, so wird der Speicher wieder freigegeben.
Der Klassenlader kann dabei durch eigene Klassen überladen werden und ermöglicht so z.B. das auffinden einzelner Klassen über die Grenzen des lokalen Rechners hinweg.
Der Linkprozeß findet also erst zur Laufzeit des Programms statt. Eine Unterscheidung, wie in C++ zwischen frühem und spätem Linken existiert nicht.
5.2 Java - Entwicklung und Java - Tools
5.2.1 Was ist Java?
Java ist eine neue, von Sun Microsystems entwickelte, objektorientierte und plattformunabhängige Programmiersprache. Dabei wird oft davon gesprochen, dass Java das WWW revolutionieren wird. Denn mit Java lassen sich faszinierende Dinge auf Web - Seiten machen, die bisher nicht möglich waren. Herausragenstes Merkmal ist wohl das Ausmaß der Interaktivität, die doch bei weitem alles übersteigt, was bei CGI - programmierten Web - Seiten zur Zeit möglich ist. So eröffnet Java ganz neue Möglichkeiten Web - Seiten mit Multimedia - Inhalten wie flüssige Animationen, erweiterte Grafiken, Sound und Video effektvoll zu gestalten.
5.2.2 Wie entstand Java?
Das Java - Team bei Sun Microsystems wollte ursprünglich Software zur Gerätesteuerung entwickeln. Allerdings musste das Team feststellen, dass die existierenden Programmiersprachen wie C und C++ dafür nicht geeignet waren.
In C oder C++ geschriebene Programme müssen für einen bestimmten Computerchip kompiliert werden. Kommt ein neuer Chip auf den Markt, so können seine Leistungsmerkmale nur dann voll genutzt werden, wenn der größte Teil der Software erneut kompiliert wird.
Da ein Computerchip, der zu teuer wird, umgehend durch einen neueren, kosteneffizienteren ersetzt wird, muss eben auch die Steuerungssoftware auf dem neuen Chip arbeiten.
So begann 1990 James Gosling bei Sun Microsystems in Mountain View, Kalifornien, mit der Arbeit an einer neuen Programmiersprache, die für Steuerungselektronik geeigneter und gleichzeitig die mit den traditionellen Sprachen wie C und C++ verbundenen Probleme umgehen sollte.
5.2.3 Die ersten Java - Projekte
Die ersten Java - Projekte kamen selbstverständlich von Sun selbst und beeinflußte die Java - Entwicklung nachhaltig.
Das Green - Projekt
Das Green - Projekt war das erste Projekt, bei dem Java eingesetzt wurde. Es sollte eine neue Form von Benutzeroberfläche für die Steuerung von Geräten im häuslichen Alltag wie Videorecorder, Fernseher, Lampen, Telefon usw. entwickelt werden. So bauten die beteiligten Mitarbeiter einen experimentellen, tragbaren Computer, dem sie den Namen "*7" (gesprochen: "star seven") gaben.
Die Benutzeroberfläche, die vollständig in Java geschrieben worden war, bestand nun aus einer farbigen, animierten Darstellung der häuslichen Umgebung, bei der verschiedene Geräte durch Bildschirmberührung bedient werden konnten.
Das Nachfolgeprojekt für den *7 war ein Demoprogramm für Video - On - Demand (VOD). Hier sollten kleine Programme über die TV - Kanäle übertragen werden, um das Fernsehen interaktiv und attraktiv zu gestalten. Dadurch konnte gezeigt werden, dass sich die Benutzeroberfläche (und natürlich Java) nicht nur zur Gerätesteuerung eignet, sondern auch für interaktives Fernsehen.
WebRunner und HotJava
Etwa 1993 entwickelte sich das World Wide Web von einem auf Text basierenden zu einem immer stärker grafisch ausgerichteten Interface, das immer mehr Interesse fand.
Da Java - Programme durch die Plattformunabhängigkeit auf all den verschiedenen Computertypen wie PC, Mac oder Unix ablauffähig sind und deren lokale Rechenpower nutzen, wurde den Java - Entwicklern klar, dass sich diese Sprache hervorragend für die Programmierung von Web - Anwendungen eignet, ja sogar eine neue Dimension eröffnet.
So entwickelte man einen Web - Browser vollständig in Java und nannte ihn "WebRunner". Aus urheberrechtlichen Gründen wurde dieser Browser später in "HotJava" umgetauft. So war "HotJava" der erste Web - Browser, der Java - Applets unterstützte. Dieser Web - Browser brachte nun die Programmiersprache Java erst ins Rampenlicht der Öffentlichkeit.
Im Mai 1995 stellte Sun Microsystems die Java - Technologie in San Francisco offiziell vor. Dadurch, dass Netscape Communications zusätzlich bekanntgab, dass der Netscape Navigator Java - Applets unterstützt, hat das schon ohnehin sehr große Interesse nur noch eingeheizt. So unterstützt der Netscape Navigator ab der Version 2.0 Java - Applets.
5.2.4 Das Java - Development - Kit (JDK) und dessen Nutzung
Das JDK wird von Sun Microsystems für verschiedene Plattformen kostenlos angeboten. So können mit dem JDK "Java Applets" als auch "Java Applications" (Stand - alone - Anwendungen, die mit dem Interpreter "java" zu starten sind) entwickelt werden. Aber auch andere Unternehmungen, wie etwa IBM, entwickeln an einem JDK für ihre jeweiligen Systeme. So steht inzwischen z.B. für OS/2 ein JDK 1.0 und ein Java - fähiger WebExplorer jeweils im Betastadium zur Verfügung. Anm.: Den WebExplorer kann man unter "http://www.ics.raleigh.ibm.com" beziehen. Anm.: Dass Java wohl keine Eintagsfliege ist, machen die Ankündigungen mehrerer großer Betriebssystemhersteller deutlich, dass sie in Zukunft Java in ihre Betriebssysteme integrieren wollen.
Wie man das JDK installiert und nutzt soll nun am Beispiel von OS/2 erläutert werden:
Das JDK für OS/2 besteht aus zwei gepackten Archiven:
-
Runtime.zip und Toolkit.zip
Wenn man also z.B. das JDK auf Laufwerk C: im Verzeichnis C:\Prg (in welchem mehrere Programmiersprachen installiert sind) installieren möchte, kopiert man eben dort die Archive hinein.
Nun entpackt man beide Archive. Dabei ist zu beachten, dass der Entpacker lange Dateinamen unterstützen muss und dass man den Parameter zur Generierung der Unterverzeichnisse nicht vergessen darf! Der Aufruf sieht dann z.B. folgendermaßen aus:
C:\Prg>unzip - d runtime
C:\Prg>unzip - d toolkit
Es wurde nun folgendes Unterverzeichnis erstellt:
C:\Prg\JavaOS2
In diesem Verzeichnis befinden sich nun alle benötigten Programme wie etwa Compiler, Interpreter, Appletviewer usw.
Es wurde folgende Verzeichnisstruktur erstellt:
Datenträger, Laufwerk C, hat den Namen OS2.
Datenträgernummer ist 667C:8C15
Verzeichnis von C:\prg\javaos2
2.05.96 14.19
2.05.96 14.19
12.04.96 10.58
12.04.96 11.00
12.04.96 10.58
12.04.96 11.00
12.04.96 10.58
12.04.96 0.15 483 0 copyrght
2.05.96 14.25 1068 0 index.html
12.04.96 0.15 3119 0 readme.run
12.04.96 0.15 5657 0 readme.tlk
12.04.96 10.55 3564 0 release.not
12 Datei(en) 13891 Byte belegt
48381440 Byte frei
So belegt das JDK für OS/2 etwas mehr als 7 MB auf dem Plattenspeicher (ohne Beispiele!).
Um nun damit arbeiten zu können, müssen noch einige Änderungen an der Systemdatei "Config.sys" gemacht werden:
-
das PATH - Statement muss um C:\Prg\JavaOS2\bin erweitert werden das LIBPATH - Statement muss um C:\Prg\JavaOS2\dll erweitert werden SET JAVA_HOME=C:\Prg\JavaOS2 SET JAVA_USER=C:\Daten\Internet\JavaOS2 (Hier werden benutzerspezifische Daten gespeichert. Dieses Verzeichnis sollte von dem Programmverzeichnis verschieden sein!) SET JAVA_WEBLOGS=C:\Daten\Internet\JavaOS2 (Hier wird für jeden gestarteten Java - Prozeß ein Logfile erstellt. Dieses Verzeichnis sollte von dem Programmverzeichnis verschieden sein!)
-
javac - Das ist der Java - Compiler. Durch Eingabe von "javac DasPrg.java" wird eine Datei "DasPrg.class" erzeugt, welches nun den Java - Bytecode enthält. java - Das ist der Java - Interpreter für Java - Applikationen, die NICHT das "Abstract Window Toolkit (AWT)" benutzen. Durch Eingabe von "java DasPrg.class" wird die Java - Applikation ausgeführt. javapm - Das ist der Java - Interpreter für Java - Applikationen, die das "Abstract Window Toolkit (AWT) benutzen. Durch Eingabe von "javapm DasPMPrg.class" wird das Programm auf der Workplace - Shell von OS/2 ausgeführt. applet - Das ist ein Programm, um Applets in HTML - Sites ohne einen Web - Browser ausführen zu können. Durch Eingabe von "applet WebSite.html" werden evtl. vorhandene Applets innerhalb der vorgegebenen Web - Site auf der Workplace - Shell von OS/2 ausgeführt. Anm.: Auf anderen Plattformen heißt das Programm zum starten von Applets meist "appletviewer". javadoc - Dies ist ein Programm, das aus bestimmt markierten Kommentaren automatisch eine Dokumentation im HTML - Format erzeugt. Die Dokumentation des JDK's wurde auf diese Weise erstellt.
Neben Klassen, die es ermöglichen, Felder und Methoden zu gruppieren, existieren in Java die sogenannten Packages. Mit Hilfe dieser Packages ist es möglich, verwandte Klassen zu gruppieren. Klassen aus solchen Packages lassen sich durch einen von Modula - 2 abgeleiteten import - Befehl durch andere Klassen benutzen. Der import - Befehle ist damit mit einem #include - Statement bei C oder C++ vergleichbar.
Die Java - Packages
In Java gibt es sechs (sehr umfangreiche) Packages, die standardmäßig zum JDK gehören:
-
java.lang: Dieses Package beinhaltet wesentliche Java - Klassen. Dieses Package wird implizit in jede Java - Datei importiert. So muss ein "import java.lang.*" nicht in einer Java - Datei deklariert werden. java.io: Dieses Package enthält Klassen, die für die Datenein - bzw. ausgabe benutzt werden können. java.util: Enthält Utility - Klassen wie Hashtables, Vektoren, Zufallszahlen, Datum usw. java.net: Enthält Klassen für die Netzwerkverbindung. Diese Klassen können zusammen mit den Klassen aus dem java.io - Package benutzt werden, um Daten aus dem Netzwerk zu lesen oder in das Netzwerk zu schreiben. java.awt: Mit diesem Package lassen sich plattformunabhängige GUI - Applikationen schreiben. Es sei hier ausdrücklich darauf hingewiesen, dass speziell dieses Package Java für die Programmierung im Internet interessant macht. Mit diesem Package erreicht man einen Interaktivitätsgrad, der mit herkömmlicher CGI - Programmierung undenkbar wäre. java.applet: Enthält Klassen für die Java - Applet - Programmierung. Diese Applets können dann in jedem Java - kompatiblen Web - Browser ablaufen.
Das Abstract Window Toolkit (AWT) ist ein GUI - Toolkit, das plattformübergreifend arbeitet. Es beinhaltet natürlich nicht alle Features, die die unterschiedlichen Betriebssysteme bieten, sondern hat eine allgemeine Reihe von Merkmalen, die von den meisten Plattformen unterstützt werden. Es ist eben so, dass man sich bei plattformunabhängiger Programmierung nun mal auf den kleinsten gemeinsamen Nenner einigen muss. Dabei werden die Methoden so weit als möglich auf die darunterliegenden plattformspezifischen GUI - APIs abgebildet.
Da das AWT wohl das wichtigste Package für zukünftige Java - Applikationen und besonders Java - Applets darstellt, sollen dessen Aufbau und Möglichkeiten kurz dargestellt werden.
Zusätzlich sei gesagt, dass das AWT natürlich erweiterbar ist, wobei man dann auch sicher sein kann, dass diese Erweiterungen ebenfalls plattformübergreifend arbeiten.
Die folgende Abbildung zeigt nun die wichtigsten AWT - Klassen in ihrer Hierarchie:
Abbildung : Die wichtigsten AWT - Klassen
-
Component: Das ist die Basisklasse vieler AWT - Klassen. Der Hauptzweck dieser Klasse besteht darin, etwas mitsamt seiner Lage und Größe auf dem Bildschirm darzustellen. Container: Das ist die Basisklasse aller Komponenten. Sie selbst kann andere Klassen enthalten. Zu dieser Klasse gehört ein Hilfsobjekt: ein Layout - Manager, der die Komponenten im Container nach bestimmten Grundsätzen ordnet. Window: Ein Hauptfenster ohne Rahmen. Frame: Ein Hauptfenster mit Rahmen. Diese Klasse ist meist mit einem "MenuBar" - Objekt verbunden. Dialog: Ein Hauptfenster, zum Erstellen von Dialogen. Dieses Fenster kann modal oder nicht modal sein. FileDialog: Dialog zur Dateiauswahl. Panel: Dies ist eine von der Container - Klasse abgeleitete Klasse, die in anderen Containern benutzt werden kann. Dadurch können komplizierte Layouts erstellt werden. Button: Ein GUI - Aktionsknopf wie etwa "Abbruch". Canvas: Dies ist eine allgemeine Komponente, die es erlaubt, Eingabebefehle des Benutzers zu zeichnen oder abzufangen. Checkbox: Ein Feld mit Boolean - Charakter. Dieses Feld kann man setzen oder löschen. Label: Ausgabe einer Zeichenkette an einer bestimmten Stelle. List: Scollbare Liste von Zeichenketten. Scrollbar: Rollbalken, mit denen scrollbare Canvases erstellt werden können. TextArea: Einfache Texteditierung. Textfield: Textkomponente mit nur einer Zeile zur Erstellung von Formularen.
5.2.6 Entwicklungsumgebungen für Java
Mit dem vorliegenden JDK ist natürlich ein angenehmes Arbeiten aufgrund der Kommandozeilen - Befehle nicht machbar. Dies haben die Software - Hersteller für Entwicklungsumgebungen natürlich erkannt und trimmen nun ihre bereits bestehenden C/C++ - Entwicklungsumgebungen auf Java.
Daher sollen hier die derzeit wichtigsten Java - Entwicklungsumgebungen kurz vorgestellt werden:
-
Sun Microsystems stellte auf der Cebit ´96 eine erste Version ihrer Java - Entwicklungsumgebung "Java Workshop" vor, die selbst in Java geschrieben wurde. Rogue Wave Software bietet schon eine komplette, visuelle Java - Entwicklungsumgebung für Win32 und Solaris an. "JFactory" beteht aus einem Applikationsdesigner, einem Codegenerator und dem Compiler. Anm.: "Jfactory" ist unter "http://www.roguewave.com" zu beziehen. Symantec bietet schon jetzt "Espresso" für Win32 und "Caffeine" für den Macintosh an. Dabei handelt es sich aber lediglich um eine Einbindung von Sun's JDK in die Oberflächen der jeweiligen Symantec - Compiler. Die integrierte Lösung mit eigenem Compiler, Debugger usw. soll es bald als "Café" folgen. Anm.: Kontakt über "http://www.symantec.com". PowerSoft will mit "Optima++" auf den Markt. "Optima++" setzt zwar weiterhin als primäre Programmiersprache C++ ein, soll aber lernen, Java - Applets zu erzeugen. Innovative Software bietet ihr auf Java getrimmtes OEW als ein Reverse/Forward - Engineering - und Designwerkzeug an. Die Version 0.9 von "OEW/Java" ist zudem kostenlos vom Server "www.isg.de" zu beziehen. Metrowerks bietet für den Mac den "CodeWarrior 8" an. Der "Code Warrior 9" soll nach Auskunft von Metrowerks für den Mac Mitte Mai erscheinen. Dabei sollen sowohl der Compiler, als auch der Debugger Eigenbauten sein. Anm.: Kontakt über "http://www.metrowerks.com". Natural Intelligence bietet für den Mac die integrierte Java - Entwicklungsumgebung "Roaster" an. melonSoft Berlin bietet mit "ACupOfCoffee" den ersten kompletten GUI - Builder für das Java - Abstract - Window - Toolkit (AWT) an. "ACupOfCoffee" ist eine Palette für den NextStep InterfaceBuilder. Anm.: Kontakt über "mailto: suckow@contrib.de". Borland will in naher Zukunft ebenfalls eine integrierte Java - Entwicklungsumgebung anbieten. Diese soll ebenfalls plattformübergreifend sein (durch Entwicklung mit Java) und hofiert unter dem Codename "Latte". Microsoft will Java - Entwicklungstools in die nächste Version von Visual C++ integrieren.
5.3 Applets: Animation und Interaktion im WWW
5.3.1 Java und das WWW
Java animiert WEB Seiten und ermöglicht interaktive und spezialisierte Anwendungen. Hypertext als Basis für die Informationsorganisation bietet ein Vehikel für die Auswahl der Information. Das Common Gateway Interface (CGI) stellt eine Schnittstelle zwischen Web - Seiten im Client - Browser und dem WWW - Server dar. Java hingegen gibt erstmals die Möglichkeit Animation sowie komplexe Benutzerinteraktion in Echtzeit auf WWW - Seiten darzustellen. Durch Java wird die klassische W3 - Hypertext - Seite nicht nur dynamischer als mit Hilfe des CGI; Benutzer, die im WWW auf Java - Programme stoßen, können an vielfältiger Interaktion und Animation teilnehmen, die ausschließlich durch die Phantasie des Java - Entwicklers begrenzt wird.
Ausführbare Elemente in W3 - Seiten
Lokale Echtzeitinteraktion und - animation im Client - Browser wird durch ausführbare Inhalte ermöglicht, mit denen der WWW - Designer seine Seiten anreichert. Diese ausführbaren Elemente werden mit HTML - Tags in die Web - Seiten eingewoben. Allerdings kann nicht jeder beliebige Browser diese ausführbaren Inhalte anzeigen. Der Browser Hot Java von Sun Microsystems war der erste Browser, der die Java - Features nutzen konnte. Heute ist auch in Netscape 2.0 die virtuelle Java - Engine integriert. Dabei spielt es keine Rolle, auf welcher Plattform der Java - kompatible Browser läuft.
5.3.2 Java - Applets in WWW - Seiten
Die ausführbaren Elemente in WWW - Seiten werden Applets genannt und mit dem