IT Solution Company
IT-Strategie IT-Knowledge
Translate this page into English X

Java Einführung in die Programmiersprache


1. Einführung

In diesem Vortrag geht es um die Programmiersprache Java®. Der Vortrag stellt eine kurze Einführung in die Sprachsyntax dar und versucht, sie in die Sprachlandschaft einzuordnen sowie seine Zukunftsperspektive abzuschätzen.

1.1. Internet

Internet wurde gebaut als ein paketorientiertes Netzwerk. Es sollte im Kriegszustand einen stabilen und fehlertoleranten Informationsaustausch garantieren sowie während des Friedens die Kommunikation zwischen den Universitäten und wissenschaftlichen Instituten fördern und somit der Amerikanischen Wirtschaft helfen, ihren Technologievorsprung zu sichern. Seit dem hat sich vieles geändert. Internet ist nicht nur für die Wissenschaftler und Militärs zugänglich. Mehr und mehr wird das Netz für kommerzielle Zwecke benutzt. Internet hat sich zu einem Netz entwickelt, welches alle anderen Netze miteinander verbindet. Außerdem hat sich Internet über alle Kontinente und wahrscheinlich über alle Staaten verbreitet.

Es ist kein homogenes Medium. Niemand kann es kontrollieren (sogar Bill Gates nicht!) oder ausschalten. Mit Hilfe des Internet ist es möglich, Informationen über alle denkbaren Themen zu besorgen, auch dann, wenn irgendwelche nationale Gesetze oder Institutionen es verbieten. Man kann andere Leute mit gleichen Interessen kennenlernen, Fragen stellen, Einkaufen usw. Das Problem bei dieser Informationsfülle ist eben diese Informationsfülle. Es kann sein, daß die gesuchten Informationen irgendwo im Netzt verfügbar sind, aber man findet sie nicht. Man kennt nicht einmal alle Orte (Hosts), an denen man suchen kann. Auch dafür wurden Werkzeuge geschaffen (Archie, Ways, Gopher). Im allgemeinen gibt es drei Möglichkeiten:

  • Man läßt es darauf ankommen - also man sucht fast ziellos im Netz und stößt eventuell dabei auf Informationen oder Hinweise zu Stellen, wo man das Gesuchte findet.
  • Man sucht auf Listings von Hosts (mit Beschreibung des Inhaltes) oder Newsgruppen, die auf Host hinweisen und sucht dort interessierende Themen.
  • Man benutzt gezielt Suchwerkzeuge um Dokumente und Dateien über die gewünschte Themen zu finden.
  • Doch all das ist manchmal nicht ausreichend. Internet ist eben ein Konglomerat. Es gibt dort kein "Root", wo man mit der Suche anfangen kann. Nicht nur, daß man nicht weiß, welche Hosts es gibt, man weiß auch nicht, welche Themen es überhaupt gibt oder wie die andere Leute es bezeichnen, falls sie darüber etwas geschrieben haben.

Für die meisten Nicht-Computerprofis ist die Benutzung von vielen Werkzeugen mit ihren kryptischen Kommandos und schwer verständlichen Adressierungsmechanismen ebenfalls sehr schwer. Um die Benutzung des Internet zu vereinfachen hat man viele menüorientierte, graphische und sonstige Werkzeuge und Protokolle (z.B. Gopher) erschaffen. Eines dieser Werkzeuge ist auch WWW (World Wide Web).

1.2. URL, HTML und HTTP

WWW wurde in CERN entwickelt. Es sollte ein einfaches "leichtes" Internetprotokoll werden, welches auch alle anderen Protokolle mit einschließt. In WWW werden Adressen nicht mehr in Vier-Punkte-Notation des Internet angegeben, sondern in URL (Uniform Ressource Locator). URL gibt außer der Hostadresse auch die Position in dem Dateisystem und das passende Protokoll an (z.B. ftp://ftp.tu-ilmenau.de//pub/unix/linux/xxx.txt). Dadurch weiß der WWW-Browser, wo sich die referenzierte Datei befindet und mit welchem Programm man sie anzeigen kann. Viele Protokolle kann der Browser selbst implementieren. Für andere muß der Browser ein externes Programm oder einen Viewer aufrufen.

Das WWW-Protokoll (HTTP - HyperText Transport Protokoll) implementiert ein hypertextorientiertes Verweissystem - HTML (Hypertext Markup Language), um auf andere Dokumente und Dateien zu verweisen, die ähnliche Themen beschreiben. Wählt man einen solchen Verweis aus, so wird automatisch das verwiesene Dokument geladen. So erspart man sich die Eingabe der entsprechenden Internetadressen, das Einloggen und Suchen in dem jeweiligen Verzeichnisbaum. Entsprechende Werkzeuge (WWW-Browser, z.B. NSCA Mosaic und Netscape) zeigen die Texte und Graphiken an und erleichtern die Arbeit. Den ersten WWW-Browser hat Tim Berners-Lee entwickelt. Er ist jetzt der Vorsitzender des WWW (oder W3C) - Konsortium, das über die weitere Entwicklung der WWW-Standards entscheiden soll. Alle großen Browserhersteller sind Mitglieder der W3C-Konsortium. Durch WWW-Standards soll gewährleistet werden, daß die Anwender mit ihrem Browser auch alle WWW-Seiten im Internet lesen können. Schließlich war dies das Ziel von WWW - ein protokollübergreifender Standard zu sein. Doch leider halten sich die meisten Browserhersteller aus Wettbewerbsgründen nicht daran. Jeder versucht, eigene WWW-Protokollelemente (Tags) zu erstellen, um die Anwender von den Vorteilen seines Browsers zu überzeugen.

Neue Protokolle sollen auch den Sicherheitsaspekt im Internet lösen. Durch die Verschlüsselung sollen private Internetpakete nur für den Empfänger lesbar sein. Die Sache ist etwas kompliziert durch die Exportbeschränkungen der US-Regierung, die "zu gute" Verschlüsselungsverfahren als eine Waffe einstuft und dadurch vom Export ausschließt. Außerdem sind verschlüsselte Telefonübertragungen in manchen Ländern (z.B. Frankreich) grundsätzlich verboten. Will man aber Bankgeschäfte über das Internet abwickeln oder einfach seine Kreditkartennummer dem Warenhaus übergeben, müssen diese Probleme gelöst werden.

1.3. WWW-Browser

Der erste WWW-Browser war NSCA Mosaic von Tim Berners-Lee. Seit dem hat sich vieles geändert. Der aktuelle Marktführer bei WWW-Browser ist Netscape. Außerdem gibt es WWW-Browser auch vom IBM, Microsoft, Oracle und vielen anderen. Die Browser werden immer besser und können immer mehr Dateiformate anzeigen und bearbeiten. Oracle möchte seinen Powerbrowser zukünftig für das Datenbankfrontend benutzen. Der Powerbrowser selbst soll kostenlos verfügbar sein.

In der Zukunft werden die Browser wahrscheinlich auch VRML (Virtual Reality Modelling Language) und Bildtelefonaufgaben erledigen können.

Probleme entstehen aber, wenn immer mehr spezifische Protokolle oder Dateiformate benutzt werden. Das Werkzeug müßte alle diese Protokolle und Dateiformate kennen oder ein Verweis auf ein anderes, lokal installiertes Programm haben, welches dieses Datenformat lesen kann. Dafür wurde das Werkzeug HotJava entwickelt.

1.3.1. HotJava

Während andere WWW-Browser alle Protokolle und Dateiformate kennen müssen bzw. ein anderes Programm dazu aufrufen, kennt HotJava selbst keine speziellen Dateiformate. Es verläßt sich vollständig auf andere Programme. Diese Programme brauchen aber nicht mehr lokal vorhanden sein. Der entsprechende Host muß sie bereitstellen und HotJava lädt sie bei Bedarf mit den Daten runter.

Datenformate

Bild 1: Behandlung unbekannter Datenformate im HotJava Browser

Damit die Programme auf jedem Rechnertyp lauffähig sind, ist eine abstrakte Programmiersprache - Java - entwickelt worden. Diese Programme werden in HotJava interpretiert. Folgendes macht die Sprache sehr flexibel:

  • Interaktive Komponente - Mit einem einfachen WWW-Browser kann man nur Bilder und Text anzeigen. In Java kann man Dokumentenelemente entwickeln, die zwar ein Bild anzeigen, aber auch auf Benutzereingaben reagieren und dabei komplexe Animationen oder Aktionen ausführen.
  • Dynamische Datentypen - Normale WWW-Browser kennen nur eine beschränkte Anzahl von Datentypen. Andere können sie nicht anzeigen. HotJava kennt keine, ist aber lernfähig. Wenn es Daten in einem unbekannten Format anfordert, verlangt es gleich auch die notwendige Programme (Objekte) dazu.
  • Dynamische Protokolle - Andere WWW-Browser "kennen" alle ihre eigenen Protokolle - HTTP und einige andere Protokolle (FTP, GOPHER usw.). Diese Protokolle sind in den Adressen im URL Format angegeben. HotJava kennt keine spezifischen Protokolle, sondern stellt für alle einen Handler zur Verfügung. Trifft man auf ein unbekanntes Protokoll, so muß der entfernte Host einen Handler dazu liefern können. So kann man beliebig viele Protokolle zum HotJava Browser hinzufügen.
  • Erweiterbarkeit - Wenn jemand heute neue Protokolle oder Datentypen entwickelt, so werden diese Erweiterungen nur sehr langsam angenommen, da es sehr lange dauert, bis alle Browser diese Formate auf allen Plattformen unterstützen. Mit HotJava kann man aber neue Protokolle und Datentypen entwickeln ohne sich über die Browserunterstützung Gedanken zu machen. Das erste Mal, wenn jemand diese Daten benutzen möchte werden, die benötigte Handler geladen und es braucht keine zusätzliche Software beschafft zu werden.

HotJava enthält auch eingebaute Sicherheitsmechanismen die fehlerhafte oder virenverseuchte Java-Programme aufhalten, bevor sie ihr System angreifen.

1.4. Zukunftsperspektiven

Internet wird immer mehr zur Kommunikationsplattform Nummer 1. Über das Internet kann man die verschiedensten Dienste anbieten, ohne selbst ein breites Netz einrichten zu müssen. Aus diesem Grund nutzen immer mehr Firmen Internettechnologie auch für firmeninterne Informationssysteme (Intranet). So ist es einfacher, das firmeninterne Netz mit Internet zu verbinden. Würde man für Intranet ein anderes Protokoll benutzen, so müßte man spezielle Gateways mit Protokollkonvertern benutzen. Zur Zeit setzen also alle großen Hersteller (Microsoft, IBM, Lotus, Novell, Oracle etc.) auf Internet.

  • Microsoft:

    Vor kurzem wollte Microsoft noch eigene Konkurrenz-Standards (MSN - Microsoft Network) für das Internet setzen. Nun aber soll Internet ein integraler Bestandteil aller Microsoftanwendungen werden. Internet-Zugang soll in alle Office-Applicationen eingebaut und Web-Server-Software standardmäßig mit jedem Windows NT ausgeliefert werden. Access-Datenbanken liefern automatisch fertige Internet-Seiten, ein Visual-Basic-Add-On erlaubt es, Web-Design mit selbstprogrammierten Anwendungen zu verknüpfen. Folgende neue Produkte sind geplant:

    • Explorer 2.0: Kostenloser Internet-Browser (Inline-Video, scrollbarer Text, Tabellenfunktionen, nächste Version mit 3D-Standard VRML). Verfügbar ab sofort, kostenlos im Internet.
    • Internet Merchant Server: Kaufmännisches Abrechnungstool für Internet-Transaktionen, verfügbar Ende 1996.
    • Visual Basic Scripting Tool: Tool zur Programmierung interaktiver Internet-Services. Verfügbar ab Mitte 1996 kostenlos über Internet.
    • Internet Studio (vormals "Blackbird" für MSN): Publishing-Tool für WWW-Seiten (Mitte 1996).
    • Internet-Office: Web-Browser und HTML-Ausgabe in allen Office-Produkten, inkl. Internet-weite OLE-Verbindungen, verfügbar 1996.
    • Web-Server für Windows NT: Serverlösung für Web-Publishing. Verfügbar im 1. Quartal 1996.
    • Windows NT mit intergriertem Web-Server: BS mit integriertem Web-Server. Verfügbar 1997.

  • Novell:

    Novell Netware Anwender konnten bisher nicht über das Internet miteinander kommunizieren. Der neue Netware Webserver füllt diese Lücke. Eingebettet in SMP von Netware 4.1 garaniert der Webserver volles Multiprozessing und ist nach Angaben von Novell zweimal schneller als ähnliche Anwendungen unter Unix- oder Windows NT-Systemen. Netware Direct Services kontrolliert Filesystem, Benutzeridentifikationen und Daten im Internet. Das Adminstrationstool zum WWW läuft unter Windows.

  • Lotus:

    Lotus hat einige Notes Marktanteile an WWW verloren, weil seine Produkte zu teuer waren. Deshalb hat Lotus jetzt den Internotes Web Publisher, der Notes-Datenbanken in HTML-Seiten für WWW umgewandelt, kostenlos für Notes-Nutzer zur Verfügung gestellt. Lotus setzt auch auf Java bzw. Javascript. Folgende neue Produkte sind geplant:

    • Notes 4.0 Client: Notes- und gleichzeitig Web-Client. Verfügbar ab 1. Quartal 1996.
    • Internotes Web Publisher: Umgewandeltes Web/Notes-Format. Verfügbar ab sofort.
    • Spike-Paket: Web-Server, Notes-Server und Internotes Publisher. Verfügbar 1. Quartal 1996.
    • HTTP Notes Server: intergriert Notes- und Web-Server. Verfügbar Mitte 1996.

  • Oracle:

    Oracle hat angekündigt, über ein Produkt namens Websystem Oracle 7 Datenbanken mit WWW zu verbinden. Das Websystem enthält auch einen kostenlosen Powerbrowser und einen Personal Webserver für Workgroup-Anwendungen. Er integriert die Java-Technologie von Network Loadable Objects. Oracle bietet auch ein Internet-Commerce-Modul an, das Kunden, Lieferanten und Distributoren mit neuesten Unternehmensinformationen versorgt. Oracle setzt mehr auf Microsofts Visual Basic Script.

  • IBM:

    IBM's neueste OS/2 Version "Warp" enthält schon alle notwendige Internet-Werkzeuge. Eine Neuentwicklung namens "Merlin" soll noch mehr Netzwerkwerzeuge enthalten. Nach IBM's Meinung wird es in der Zukunft Benutzer ohne Internetzugang gar nicht mehr geben!

  • Borland:

    Borland hat eine visuelle Entwicklungstool für Java namens "Latte" für den zweiten Quartal 1996 angekündigt.

Durch die Einbettung weiterer Funktionalität werden die Browser immer mehr zu einer eigenständigen Oberfläche. Diese Entwicklung kann die Computerwelt grundlegend ändern. Man braucht nicht mehr unbedingt einen gut ausgerüsteten PC oder eine Workstation, um mit den heutigen Programmen sinnvoll arbeiten zu können. Die jetzigen Programme sind zu großen Alleskönnern geworden, von deren Umfang fast immer nur ein Bruchteil auch tatsächlich benutzt wird. Dadurch kosten diese Office-Pakete sehr viel und stellen große Anforderungen an die Hardware. Die großen Programmpakete sind auch nicht sehr flexibel. Wenn einem ein Programmteil (z.B. Grammatiküberprüfung) nicht gefällt, kann man dies nicht so einfach gegen ein anderes Modul (vielleicht von einem anderen Unternehmen) austauschen. In der Programmiersprache Java entwickelt man universell einsetzbare Klassen, die dann fast beliebig miteinander verbindbar sind. So kann man zuerst mit einer kleineren "Lightversion" eines Programms starten und beim Bedarf weitere Module übers Internet hinzuladen. Für die zahlt man dann gleich online. So spart man Geld und Computerressourcen. Außerdem lassen sich Javaprogramme unter allen Betriebssystemen einsetzen, auf denen ein Javainterpreter verfügbar ist. Damit gehört die Programmknappheit für bestimmte Betriebssysteme der Vergangenheit an, denn die Javaprogramme sind binärkompatibel zwischen allen Rechnerplattformen. Das spart natürlich viel Zeit für die Entwickler, die sich nicht mehr um die Portierung ihrer Programme kümmern müssen, und natürlich auch viel Geld für die Endanwender die nicht mehr alle einzelnen Versionen kaufen müssen. Es ist auch die Rede von speziellen Java-Rechnern, die im wesentlichen nur graphikfähige Internetterminals sind. Solche Rechner sollen schon ab 500 $ (Oracle Angaben) zu haben sein. Sie besitzen nur eine kombinierte Tastatur mit Basiseinheit, eine Maus, eine kleinere Festplatte und einfache CPU (etwa wie Amiga 500). Statt des Monitors bedienen sie sich des heimischen Fernsehers. Als Oberfläche benutzt man dann einen WWW-Browser.

Sun hat eine neue Generation von speziellen Java-optimierten Chips angekündigt. Diese CPUs sollen den Output des Java-Compilers direkt und ohne den Einsatz einer Softwareschicht abarbeiten können. Deshalb können sie die Java-Programme schneller als andere CPU-s ausführen. Allerdings eignen sie sich auch nur für die Java-Applets. Als erster Chip soll die "Pico-Java" Mitte 1996 erscheinen. Dieser Chip soll unter 25 $ kosten und in Peripheriegeräten und Mobilfunktelephonen Einsatz finden. Der nächste Chip - "Micro-Java" wird wahrscheinlich im ersten Quartal 1997 erscheinen und ist mit einem Stückpreis zwischen 25 $ und 100 $ für Netzwerkgeräte, Buchungssysteme, Mail-Terminals und Spielkonsolen bestimmt. Schließlich am Ende 1997 soll ein Chip namens "Ultra-Java" erscheinen. Ultra-Java wird etwas über 100 $ kosten. Er soll aber auch 2D und 3D-Graphik, Audio, Vidokompression, Netzwerke und Verschlüsselung unterstüzen und ist für die zukünftige Internet-PCs bestimmt.

2. Programmiersprache Java

Die Programmiersprache Java ist eine objektorientierte, relativ einfache, plattformunabhängige, interpretative Programmiersprache. Java hat mit Absicht eine C++-ähnliche Syntax gewählt, um den Programmierern den Umstieg auf Java zu erleichtern. Es hat einen eingebaute Garbage Collection Mechanism, um nicht referenzierte Speicherblöcke wieder freizugeben. Java-Programme sind binärkompatibel zwischen den verschiedenen Rechnerplattformen. Sie werden zu Bytecodes kompiliert und so ist die Implementierung der Programme nicht so einfach nachzuvollziehen (Begriff: reverse engineering). Deshalb sind die Urheberrechte bei Java-Programmen besser gesichert, als z.B. bei Smalltalk-Programmen. Außerdem kann man die Bytecodes schneller interpretieren, als reinen ASCII-Text. Die Bytecodes sind eigentlich ebenfalls Maschinenbefehle, die wie normale Maschinenbefehle aussehen (Befehlcode-Modifier-Datenbytes ...), aber sie sind Befehlscodes eines virtuellen Prozessors, den es so nirgendwo gibt. Diese virtuelle Maschine muß auf allen Plattformen emuliert werden. Somit werden alle maschinenspezifische Eigenschaften vor den Java-Programmen verborgen und man gewinnt zusätzlich mehr Sicherheit. Die Java-Programme dürfen keine Systemaufrufe durchführen oder direkt auf irgendwelche Ports zugreifen. Wegen fehlender Zeigerarithmetik können die Java-Programme auch nicht das Java-Laufzeitsystem irgendwie destabilisieren. Somit haben die vierenverseuchten oder schlecht programmierten Java-Programme wenig Chancen, dem Zielsystem Schaden zuzufügen. Die Interpretation der Bytecodes ist fast so schnell, wie die von C oder C++ Code. Für besonders zeitkritische Aufgaben kann man auch den Bytecode vor der Ausführung in direkten Maschinencode des Zielsystems konvertieren.

Ausfuehrung von JAVA Programmen

Bild 2: Ausführung von Java-Programmen

Kompilierte Java-Programme enthalten keine Adressen der Methodenaufrufe, sondern symbolische Links, die zur Laufzeit in Adressen umgerechnet werden (late binding). Dadurch kann man eine Oberklasse modifizieren, ohne alle davon abgeleiteten Klassen neu übersetzen zu müssen. Nur die Parameter und Namen der Methoden müssen gleich bleiben. Man kann aber auch neue Methoden hinzufügen. Das Linken geht sehr schnell und kann deshalb auf dem Zielsystem zur Laufzeit erfolgen.

Der Java-Klassen-Loader durchsucht immer zuerst das lokale System, um Namensreferenzen aufzulösen. Dadurch kann keine externe Klasse mit demselben Namen ein Sicherheitsrisiko für das Zielsystem werden. Doch auch dann traut der Java-Interpreter keinem Code. Jeglicher Code (auch lokale Klassen) wird vor der Ausführung verifiziert, um unbefugte Modifikationen des Speichers (überschreiten der Arraygrenzen usw.), Verletzungen der Zugriffsrechte (private, protected, public), Stackoverflows usw. zu entdecken.

Java enthälten Sprachelemente für die nebenläufige Ausführung von Programmteilen (Klassen: Thread, Runnable, etc.) sowie Kontrollmaßnahmen, um die nebenläufige Ausführung der Programmteile zu koordinieren (synchronised).

2.1. Entstehungsgeschichte

Es war alles nicht so geplant! Sun hatte im Jahr 1990 eine Team unter dem Codenamen "Green Project" zusammengestellt, um ein kleines, einfaches, objektorientiertes und plattformunabhängiges System für den "Consumer Electronics" Markt und später für "Settop-Boxen" zu entwickeln. Man wollte über das Fernsehkabel kleine Programme übertragen, um Fernsehen interaktiv und attraktiver zu gestalten. Der erste Prototyp hieß "Object Application Kernel" und war von vornherein auf Netzwerktauglichkeit und Portabilität angelegt. Den Markennamen "Java" erhielt das Produkt erst später. Java ist im amerikanischen Englisch ein umgangssprachlicher Ausdruck für Kaffee.

Bald entschied man sich, für die kleinen Java-Programme Internet als Transportmedium zu benutzen. Mit Hilfe der Java-Programme kann man die WWW-Seiten interaktiv und beliebig konfigurierbar gestalten. Java-Programme verringern auch die Netzbelastung. Dynamische WWW-Seiten (z.B. Börsenkurse, Versandhausangebote usw.) werden vor der Übertragung zu einem Bild zusammengefaßt, dann als Rasterbild übers Internet transportiert. Nun braucht man nur noch die wenige relevanten Informationen und (beim ersten Zugriff ) das entsprechende Programm zu übertragen. Auf der Clientseite wird aus den Daten das Bild zusammmensetzt. Javas virtuelle Maschine ist eine Stackmaschine.

2.2. Vergleich mit anderen Programmiersprachen

Java ist eine objektorientierte, interpretative, hardwareunabhängige, netzwerkfähige, multitaskingfähige, dynamisch erweiterbare Programmiersprache mit strenger Typisierung und einigen Sicherheitsmaßnahmen. Die Ausführungsgeschwindigkeit von Javas Bytecode ist genügend gut für Benutzerinterfaces. Zeitkritische Programmabschnitte lassen sich vor der Ausführung in direkte Maschinencode des Zielrechners umwandeln. Der Compiler macht ein paar Optimierungen und erzeugt relativ guten Code. Java ist streng typisiert und zwingt die Programmierer, frühzeitig Entscheidungen zu treffen. Anderenseits unterstütz er sie auch, indem er viele mögliche Fehlerquellen schon zur Kompilierzeit aufdeckt. Da Java erst sehr spät die eigentlichen Methodenaufrufe bindet und keinerlei Aussagen über das Layout der Klassen im Speicher von Zielsystem erlaubt, zwingt er die Programmierer, von unsauberem Programmierstil abzusehen. Hier noch ein Vergleich mit anderen Programmirsprachen:

JAVA Vergleich mit anderen Tools

Bild 3: Vergleich von Java mit anderen Programmiersprachen. Quelle: Sun Microsystems

In der Programmiersprache Java hat man versucht, die besten Eigenschaften von C++, SmallTalk, Oberon, Eiffel, Perl und anderen Programmiersprachen zu vereinen. Es ist ein Kompromiß zwischen einer hohen Ausführungsgeschwindigkeit, guter Portierbarkeit und Felxibilität.

2.3. Vergleich mit ähnlichen Bibliotheken und Protokollen

Einige Bibliotheken und Protokolle (CORBA, OLE, OpenDoc) realisieren zum Teil ähnliche Aufgaben wie Java. Sie lassen sich nicht direkt mit Java vergleichen, denn Java ist eine Programmiersprache, CORBA eine Spezifikation und OpenDoc sowie OLE Bibliotheken. OpenDoc und OLE sind entwickelt worden, um Verbunddokumente zu erstellen. Dabei sollte jedes "Objekt" im Dokument "wissen", mit welcher Anwendung sie erstellt worden sind. Solche "intelligenten Objekte" können in einem Dokument eingebettet oder gelinkt werden. Wenn der Anwender auf sie mit dem Maus klickt, so wird entweder die entsprechende Anwendung aufgerufen und die Daten werden in der Anwendung geladen oder der Anwendung arbeitet im Hintergrund und man kann die Daten direkt in dem Verbunddokument editieren.

In der Programmiersprache Java kann man Applets erstellen, die man in WWW-Seiten einbinden kann. Diese Applets implementieren interaktive Komponenten der WWW-Seite. Sie können auf Benutzereingaben reagieren und beliebige Aktionen durchführen. Da sie ihre Daten selbst anzeigen, können somit (genau wie mit OLE und OpenDoc) beliebige Daten gemischt werde. Darüber hinaus muß bei Java das genaue Datenformat dem Client nicht bekannt sein. Falls er dieses Datenformat noch nicht kennt, so lädt er vom Server das entsprechende Programm dazu. Eines der Ziele von Java war auch, mit Hilfe der Applets den Netzwerkehr zu verringern. Man kann statt kompletter Rasterbilder (Geschäftsgraphiken, Börsenkurse usw.) nur die nummerische Daten und falls notwendig ein Java-Programm übertragen, das das Bild auf der Clientseite erstellt. Java-Applets sind in einer WWW-Seite nicht miteinander verbunden, sondern akzeptieren nur die Eingaben und Verantwortung über ihren eigenen Bereich auf der WWW-Seite. Um Applets miteinader zu verbinden, kann man die Programmiersprache JavaScript benutzen. OLE und OpenDoc sind inzwischen ebenfalls netzwerkfähig. Java ist es schon von Grund auf. Außerdem unterstützt Java Threads und Hintergrundbearbeitung. Fazit: Mit Java lassen sich viele ähnliche Aufgaben wie mit OLE oder OpenDoc realisieren, aber es ist nicht mit diesem Ansatz entwickelt worden.

2.4. Unterschiede zu C++

Java wurde mit Absicht C++-ähnlich gestaltet, um den Programmierern den Umstieg auf die neue Sprache zu erleichtern. Es gibt aber mehrere wichtige Unterschiede:

  1. Java ist eine interpretative Sprache, C und C++ Compiler generieren den direkten Maschinencode des Zielsystems. Dadurch sind Java-Programme sicherlich etwas langsamer als C++ - Programme. Andererseits sind sie aber auch besser portierbar. Für Userinterfaces braucht man nicht unbedingt den schnellsten Code und zeitkritische Programmabschnitte kann man vor der Ausführung in direkten Maschinencode konvertieren. Die Bytecodes von Java werden etwas schneller interpretiert, als reine ASCII-Text (Smalltalk, Perl etc.). Es ist ein Kompromiß zwischen Ausführungsgeschwindigkeit und Flexibilität.
  2. C++ ist im wesentlichen ein C mit objektorientierten Erweiterungen - eine gemischte Sprache, die nicht unbedingt einen sauberen Programmierstil erzwingt. Java dagegen ist rein objetorientiert. Allerdings existieren in Java auch primitive numerische Typen (int, long, float, char). Alles andere ist aber ein Objekt.
  3. Zeichen in Java (char) sind nicht 8-Bit ASCII Zeichencodes, sondern 16-Bit Unicodezeichen. Java-Zeichen können in Arrays zusammengefaßt werden, aber sie sind deshalb noch nicht Strings. Für Strings benutzt man die Java-Klassen String (Zeichenketten konstanter Länge und Inhalt) und StringBuffer (Zeichenketten variabler Länge). Java-Strings werden auch nicht durch ein NULL Zeichen terminiert.
  4. Java hat keine Headerdateien und benötigt keinen Precompiler.
  5. Java kennt keine impliziten Typumwandlungen, außer der Umwandlung von numerischen Datentypen in den selben Datentyp mit größerer Genauigkeit (z.B int nach long). Würde man jedoch bei der Konvertierung an Genauigkeit verlieren, so muß man eine explizite Typumwandlung vornehmen.
  6. Java kennt keine Zeigerarithmetik. Es gibt nur Objekte und Arrays von Objekten. Alles, außer primitiven numerischen Typen, sind Objekte und die Variablen beinhalten Referenzen auf Objekte, nicht die Objekte selbst. Vor einem Zugriff auf ein neues Objekt muß man dieses also vorher immer mit dem new Operator anlegen. Arraygrenzen werden zur Laufzeit überprüft. Ein Array kann nach dem Anlegen nicht mehr vergrößert oder verkleinert werden.
  7. Alle Objekte und Arrays muß man explizit mit dem new Operator allokieren. Es gibt aber keinen delete Operator. Speicher wird durch den Garbage-Collector zurückgefordert.
  8. Alle primitiven Datentypen in Java haben einen festen Speicherbedarf und eine Genauigkeit, die nicht von der Zielplattform abhängig ist.
  9. Es gibt keine Structs, Unions, Typedefs oder Enums, sondern nur Klassen.
  10. Es gibt keine vorzeichenlosen Datentypen.
  11. Wahrheitswerte lassen sich nicht in numerische (und umgekehrt) umwandeln.
  12. Man kann die mathematischen Operatoren nicht überladen.
  13. Java enthält direkten Suppert für Threads, kritische Programmmabschnitte und Synchronisierung von Threads.
  14. Java enthält keine goto-Befehle, kennt aber Labels. Mit einem break, continue oder throw Befehl wird aus einer verschachtelten Schleife herausgesprungen.
  15. Java implementiert eine eigene Form der Mehrfachvererbung.
  16. Java benutzt "late binding". Statt Methodenadressen werden Symbole benutzt, die erst während der Laufzeit durch direkte Adressen ersetzt werden.
  17. Es gibt keine Funktionen, Prozeduren und globale Variablen.

2.5. Sprachsyntax

In diesem Abschnitt möchte ich einen kurzen Überblick über die Syntax von Java-Programmen geben. Als Grundlage für die hier beschriebene Syntax gilt die Java-Sprachspezifikation von 30. Oktober 1995 und das JDK Version 1.0 (beta2). Die Beispielprogramme sind JDK, Java-Tutorial und verschiedenen Zeitschriften entnommen und unter Windows NT Version 3.51 getestet. Der Vortrag ist mehr auf C++ Programmierer ausgelegt. Ich beschreibe hier die Sprachsyntax möglichst vollständig, aber konzentriere mich mehr auf die Unterschiede zu C++, denn Java ist auch am Vorbild von C++ entwickelt worden.

2.5.1. Programmaufbau

Java-Quelldateien haben den Suffix .java und sind im Unicode Zeichensatz geschrieben. Die kompilierte Bytecodedateien haben den Suffix .class.

Eine Quelldatei kann aus folgenden Elementen bestehen:

  1. Package-Spezifikation: package Name;

    Legt fest, zu welchem Package diese Klasse gehört. Fehlt die package Anweisung, gehört die Klasse zu einem namenslosen Package. So kann man schnell Klassen implementieren, Testen und später unter einem global eindeutigen Packagenamen freigeben. Die global eindeutigen Packagenamen sollten wie Internetadressen aussehen z.B. DE.TU-ILMENAU.PRAKINF.TESTAPP. Packages sind wie Bibliotheken in C++. Pro Quelldatei darf nur eine öffentliche Klasse oder Interface deklariert sein, aber mehrere Quelldateien können zu einer Package gehören.

  2. Import Befehl: import Name;

    Importiert ein anderes Packages, das diese Klasse verwendet bzw. von dem es abgeleitet ist.

  3. Typdeklarationen und/oder Interfacedeklarationen: Jede Quelldatei kann nur eine öffentliche Klasse oder Interface deklarieren (und implementieren).

2.5.2. Lexikalische Elemente

Java-Quelldateien können auch in ASCII-Zeichensatz geschreiben werden, wenn man für jedes Unicode-Zeichen ein Unicodeescape im ASCII-Zeichensatz in der Form \uxxxx eingibt, wobei xxxx der Hexcode des Unicodezeichens ist.

Die Zeilen der Quelldateien werden durch die ASCII-Zeichenkombination <CR><LF> terminiert. Der Java-Compiler überliest beim Kompilieren alle Leerzeichen, horizontale und vertikale Tabulatoren sowie Zeilenenden und Kommentare. Als Kommentare gelten:

  • /* normaler Kommentar, kann sich auch über mehrere Zeilen erstrecken */
  • // Kommentar bis zum Zeilenende
  • /** Kommentar für die automatische Generierung von Dokumentationen */

Reservierte Wörter sind:

abstract	do		implements	package		throw
boolean		double		import		private		throws
break		else		inner		protected	transient
byte		extends		instanceof	public		try
case		final		int		rest		var
cast		finally		interface	return		void
catch		float		long		short		volatile
char		for		native		static		while
class		future		new		super		byvalue
const		generic		null		switch
continue	goto		operator	synchronized
default		if		outer		this

Die Wörter byvalue, cast, const, future, generic, goto, inner, operator, outer, rest und var sind zwar reserviert, werden jedoch nicht benutzt.Die Namen von Variablen, Klassen und Methoden sind beliebig lange Unicode-Zeichenketten, beginnend mit einem Zeichen und gefolgt von Zeichen und Nummern.Literale sind Werte von primitiven Datentypen und die Klasse String.

  • Ganzahlige Werte: kann man zur Basis 10, 16 (0xnnnn) oder 8 (0nnnn) eingeben. Ganze Zahlen haben einen Wertebereich von -2^31 bis 2^31-1. Lange ganze Zahlen (mit dem Suffix l bzw. L) haben einen Wertebereich von -2^63 bis 2^63-1.
  • Gebrochene Zahlen: entweder mit einfacher Genauigkeit (optionales Suffixs f, von 1.40239846e-45f bis 3.40282347e+38f) oder doppelter Genauigkeit (Suffix d, von 4.94065645841246544e-324 bis 1.79769131486231570e+308)
  • Wahrheitswerte: true und false.
  • Zeichen: sind 16-Bit Unicodezeichen oder Escapes (\b, \t, \n, \r, \", \', \\ und \unnn) und werden in einfache Hochkommata eingeschlossen.
  • Zeichenketten: werden in doppelte Hochkommata eingeschlossen und dienen als Werte für Instanzen der Klasse String. Arrays-Zeichen sind keine Zeichenketten. Zeichenketten kann man mit dem + Operator verbinden.

Opratoren sind:

=	>	<	!	~	?	:
==	<=	>=	!=	&&	||	++	--
+	-	*	/	&	|	^	%	<<	>>	>>>
+=	-=	*=	/=	&=	|=	^=	%=	<<=	>>=	>>>=

2.5.3. Datentypen

Datentypen teilen sich in primitive Datentypen, Klassen, Interfaces und Arrays. Referencen sind "Zeiger" auf dynamisch allokierte Objekte (Instanzen und Arrays). Primitive Typen sind:

  • byte: 8-bit Ganzahl. (von -256 bis 255)
  • short: 16-bit Ganzahl (von -32768 bis 32767)
  • int: 32-bit Ganzahl (von -2147483648 bis 2147483647)
  • long: 64-bit Ganzahl (von -9223372036854775808 bis 9223372036854775807)
  • float: 32-bit IEE 754 gebrochene Zahl (von 1.40239846e-45f bis 3.40282347e+38f)
  • double: 64-bit IEE 754 gebrochene Zahl (von 4.94065645841246544e-324 bis 1.79769131486231570e+308).
  • char: 16-bit Unicode Zeichen
  • boolean: Wahrheitswert (true oder false)

Als Parameterwerte für Methoden kann man primitive Werte und Referenzen übergeben. Zahlen kann man in andere numerische Typen und Zeichen umwandeln und umgekehrt, aber nicht in Warheitswerte. Typumwandlungen, bei denen die Genauigkeit wächst (byte -> int -> long ->float) können implizit durchgeführt werden. In die andere Richtung müssen sie jedoch explizit angegeben werden. Alle primitiven Typen haben einen Standardanfangswert - 0 bzw. null bzw. '\u0000'. Zahlen kann man nicht in Adressen oder Referenzen umwandeln. Als Typumwandlungsoperator dient der (<Typname>) Operator.

Bei ganzahliger Division durch 0 wird eine ArithmeticException ausgelöst. Bei gebrochenen Zahlen entsteht bei der Division durch 0 Unendlich und es wird keine Exception ausgelöst. Negative und Positive 0 sind gleich (0.0 == -0.0).Instanzen und Arrays müssen immer durch den new Operator dynamisch allokiert werden. Variable, die Instanzen enthalten, sind immer Refrenzen. Arrayelemente dürfen Arrays, Interfaces, Instanzen oder primitive Typen sein. Als Indizes benutzt man ganze Zahlen.

2.5.4. Variablen

Variablen besitzen einen Typ (primitiv oder Referenz) und eine Speicheroption. Lokale Variablen werden auf dem Stack allokiert und beim Verlassen des Blocks freigegeben. Statische Variablen werden allokiert, wenn eine Instanz aus ihrer umschließenden Klasse angelegt wird. Mit dem Freigeben der letzten Instanz dieser Klasse wird auch die statische Variable freigegeben. Dynamische Variablen werden mit dem new Operator allokiert. Wird die letzten Referenz auf dieses Objekt freigegeben, werden sie automatisch freigegeben. Die Sichtbarkeit der Variablen ist durch die folgende Hierarchie festgelegt:

0.	Host's Packages
	1.	Quelldatei
		2.	Datentyp (Klasse oder Interface Deklaration)
			3.	Parameter der Methode
				4.	lokaler Block
					5.	for Befehl

Beim Auflösen einer Namensreferenz wird in dieser Hiearchie von unten nach oben gesucht. Der Zugriff auf Instanzvariablen wird folgendermaßen bestimmt:

  • public: öffentlich
  • protected: für die Methoden dieser Klasse und davon abgeleitete Klassen
  • private: nur für die Methoden dieser Klasse
  • ist nichts angegeben, so kann man auf diese Instanzvariable von allen Klassen in dieser Quelldatei (Package) zugreifen, nicht aber aus anderen Packages.

Variablen, die als final deklariert wurden, sind Konstanten.Ein import Befehl z.B. import java.util.Vector; macht eine Klasse oder ein Interface in diesem Package nach seinem letzten Komponenten bekannt. Danach kann man Felder dieser Klasse oder Interfaces entweder als Vector.foo() oder util.Vector.foo() oder java.util.Vector.foo() ansprechen. Wenn man eine andere Klasse nicht importiert hat, so muß man sie mit ihrem vollen Namen anprechen, z.B. java.applet.Applet. Man kann sowohl eine einzelne Klasse als auch alle Klassen aus einem Package importieren. Zum Beispiel:

import java.applet.Applet;	// Importiert die Klasse Applet
import java.applet.*;		// Importiert alle Klassen und Interfaces	
				// aus dem Package java.applet

Ohne einen Importbefehl kann man die Klassen nicht benutzen. Der Compiler gibt eine Fehlermeldung aus. Allerdings wird die Klasse java.lang immer implizit importiert.

2.5.5. Klassen und Interfaces

Eine Klassendefinition führt einen neuen Datentyp ein. Eine Klassendefinition hat die Form:

[<Doc-Komment>] [<Klassentyp>] class Klassenname
 	[extends <Oberklasse>]
 	[implements <Interfaces>]
 {	<Felder>};

Zum Beispiel:

/** Person */public class Person  {
	public String 		m_strVorname;
	public String 		m_strNachname;
};
/** Programmierer */
class Programmierer extends Person implements Arbeitnehmer {
	public float	m_fGehalt;
	public float	HatGehalt() { return m_fGehalt; }};

Klassentyp kann sein:

  • abstract: Eine Abstrakte Klasse kann abstrakte Methoden enthalten. Abstrakte Methoden werden in dieser oder einer abstrakten Oberklasse nur deklariert, aber nicht definiert. Eine Klasse, die abstrakte Methoden enthält, muß auch als abstrakt deklariert werden. Von einer abstrakten Klasse kann man keine Instanzen anlegen.
  • final: Von dieser Klasse kann man keine Unterklassen ableiten. Eine Klasse darf nicht gleichzeitig als final und abstrakt deklariert sein.
  • public: Öffentliche Klasse. Pro Quelldatei darf nur eine öffentliche Klasse oder ein Interface deklariert werden.

Eine Oberklasse kann eine beliebige andere Klasse sein. Wenn man keine Oberklasse angibt, so wird die Klasse von der Klasse Object abgeleitet. Es darf keine kreisförmige Ableitungslinien geben, d.h. wenn die Klasse A von B und B von C abgeleitet ist, so darf C nicht von A abgeleitet werden.

Man kann Referenzen zwischen einer Ober- und Unterklasse umdefinieren. Wenn die Klasse A eine Unterklasse von B ist, so kann man einen Referenz vom Typ A ohne explizite Redefinition als eine Referenz von Typ B zuweisen. In die andere Richtung muß man eine explizite Typumwandlung stattfinden. Zum Beispiel:

A a;
B b;
a = b;
b = (A)a;

Felder können Variablen- und Methodendeklarationen sein. Methodendefinitionen haben die Form:

[<Doc-Komment>] [<Methodentyp>] [<Rückgabetyp>] <Methodenname>
[throws <Exceptions>] ([<Parameterliste>])
{	<Methodenkörper>
}

Konstruktoren haben denselben Namen wie die Klasse, in der sie deklariert sind. Konstruktoren haben keinen Rückgabewert. Falls kein Konstruktor deklariert wird, so erhält die Klasse implizit einen Konstruktor (public und ohne Parameter). Instanzen werden mit dem Operator new angelegt. Java-Klassen haben keinen Destruktor, können aber eine finalize() Methode haben. Der Speicher von Instanzen wird vom Garbage-Collector freigegeben, wenn die Instanzen nicht mehr referenziert werden. Die Methode finalize() wird vom Garbage-Collector nur einmal aufgerufen. In dieser Methode können Betriebssystemressourcen (Graphics Contexc, Brushes, Pens, Dateideskriptoren usw.) freigegeben oder die Freigabe der Instanz verzögert werden.Die Freigabe der Instanz wird verzögert, indem eine Referenz auf diesen Instanz in einer Variable abgelegt wird.

Alle Exceptions, die in dieser Methode auftreten können und nicht vom Typ Error oder RunTimeException sind, müssen deklariert werden. Alle Exceptions müssen von Throwable abgeleitet sein.

Eine Methode darf keine lokale Variable definieren, die den gleichen Namen verwendet, wie einer ihrer Parameter. Überladene Methoden müssen unterschiedliche Paramaterlisten haben. Ein unterschiedlicher Rückgabetyp ist nicht aureichend. Mathematische Operatoren dürfen nicht überladen werden.

Die Zugriffsrechte auf Methoden werden durch die Schlüsselwörter public, private und protected festgelegt. Wird nichts angegeben, so sind die Methoden innerhalb des Package öffentlich. Als final deklarierte Methoden dürfen nicht überschrieben werden. Solche Methoden erlauben dem Kompiler, Optimierungen vorzunehmen (z.B. Ersetzen der Methodenaufrufe mit seinem Körper). Abstrakte Methoden haben keinen Methodenkörper und müssen in einer abgeleiteten Klasse implementiert sein. Als native deklarierte Methoden haben keine Methodenkörper (in Java) und müssen in eine anderen Programmiersprache (z.B. C) implementiert werden. Statische Methoden sind Klassenmethoden, d.h. sie können nur auf Klassen (statische) Variablen zugreifen und können vor dem Instanziieren aufgerufen werden. Das Schlüsselwort synchronised deklariert eine Methode oder umschließt einen Block und wird durch einen Monitor vor der gleichzeitigen Ausführung geschützt.

Instanzvariablen haben Zugriffsrechte (private, protected, public, "friendly"), einen Datentyp, Initialisatoren. Falls die Instanzvariablen nicht explizit initialisiert werden, setzt der Java-Interpreter sie je nach Typ auf 0, false, '\0' oder "". Java-Klassen können auch Initialisierungsblöcke enthalten. Das sind statische Codeblöcke, die zur Initialisierungszeit ausgeführt werden. Zum Beispiel:

class Test extends A { 	int		x = 2; 	float		f = 0.34; 	String		str
= "das ist ein " + "Test"; 	int		y; 	{ 			//statischer
Initialisierungsblock 		x = 4;		//Überschreibt die Anfangswerte. 		f =
3.67; 		y = "das ist ein".length(); 	} 	public Test(int x, float g,
String s) { 		super(s);		//Aufruf des Konstruktors der Basisklasse 		this.x =
x;		//hier muß man mit this.x die Instanzvariable 					//adressieren, weil
der Parameter auch x heißt. 		f = g;			//zum dritten Mal initialisieren
		y = 23; 	} };

In diesem Beispiel werden die Instanzvariablen insgesamt dreimal initialisiert. Zum ersten werden sie durch eine direkte Zuweisung initialisiert. Die Instanzvariable y hat keinen direkte Initialisator und wird deshalb mit 0 belegt. Anschließend wird der statische Initialisierungsblock ausgeführt. Es kann beliebig viele solche Initialisierungsblöcke geben und sie werden alle in der Reihenfolge ausgeführt, wie sie in den Klassendeklarationen vorkommen. Schließlich werden die Instanzvariablen auch in dem Konstruktor initialisiert. Hier ist auch zu sehen, wie man den Konstruktor der Basisklasse aufruft - super(<Argumente>); . Der Konstruktor der Basisklasse kann auch implizit aufgerufen werden, falls die Basisklasse einen parameterlose Konstruktor besitzt. In diesem Beispiel ist weiterhin zu sehen, wie Strings behandelt werden. Der Kompiler ersetzt zur Kompilezeit jede Zeichenkette durch eine Instanz der Klasse String. Da die Klasse String einen + Operator hat, kann man die Zeichenketten mit + verbinden. Außerden kann man für Zeichenketten gleich eine Methode der Klasse String aufrufen. Man könnte die String - Variablen auch folgendermaßen intialisieren:

String str = new String("das ist ein Test");

Das ist aber nich so effizient, denn in diesem Fall erzeugt der Kompiler aus der Zeichenkette einen String und übergibt diesen einem weiteren Konstruktor der Klasse String.

Parameternamen, die den gleichen Namen als ein Instanzvariable haben, verdecken diesen. Diese Instanzvariablen kann man dann mit this (oder super für Basiklasse) adressieren. Instanzvariablen und Methoden werden mit <Instanzname>.<Feldname> adressiert. Statische Varibalen und Methoden werden mit: <Klassenname>.<Feldname> adressiert.

Variablen können auch folgendermaßen deklariert sein:

  • volatile: Variable wird möglicherweise in einen Thread geändert, während ein anderer sie ausliest.
  • final: statische Variable, muß einen Initialisator haben.
  • transient: Diese Eigenschaft ist noch nicht vollständig implementiert. Falls es in der Zukunft OODBMS auf der Basis von Java gibt, so werden mit transient Variablen markiert, die nicht zum persistenten Teil der Objekte gehören, sondern zur Laufzeit ständig unterschiedliche werte besitzen und daher nicht in der DB gespeichert werden. Transiente Variablen dürfen nicht statisch oder final sein.

Die Programmiersprache Java unterstützt nur einfache Ableitungen. Java löst einige Probleme, die andere Programmiersprachen (z.B. C++) durch mehrfache Ableitung umgehen, mit Hilfe der Interfaces. Wenn eine nicht abstrakte Klasse ein Interface implementiert, so muß sie für alle Methoden des Interface eine Implementierung liefern. Abstrakte Klassen könne einige Methoden des Interface für ihre Unterklassen zur Implementierung zulassen. Interfaces haben folgende Form:

[<Interfacetyp>] interface <Interfacename>  { 	<Felder>};

Zum Beispiel:

public interface Arbeitnehmer { 	public float	HatGehalt(); };

Interfaces legen ein gemeinsames Teilverhalten für mehrere Klassen fest, die so nicht viel voneinander wissen müssen. So kann man z.B. für Arrayelemente ein gemeinsames Interface definieren, ohne alle Elementklassen von einer gemeinsamen abstrakten Oberklasse abzuleiten. Interfaces können private (default) oder public sein. Alle Methoden in Interfaces sind immer public und abstract und alle Variablen in Interfaces sind immer static, public und final. Methoden in Interfaces dürfen nicht synchronised, transient oder volatile sein. Interfaces verhalten sich beim Anlegen von Instanzvariablen genauso wie Klassen. Da der eigentliche Typ hierbei aber erst zur Laufzeit ermittelt wird, sind sie etwas langsamer.

Der Schlüsselwort this verweist auf diese Instanz und das Schlüsselwort super auf die Oberklasse. Wenn in einer Unterklasse eine gleichnamige Instanzvariable deklariert wird, so wird die Instanzvariable der Oberklasse nicht überschrieben, sondern nur unsichtbar gemacht. Man kann diese mit Hilfe der Schlüsselwortes super adressieren. Dasselbe gilt für Methoden.

2.5.6. Anweisungen

In der Programmiersprache Java dürfen Anweisungen Labels enthalten. Mittels Sprüngen kann man die Ausführung an solchen Labels fortsetzen. Zum Beispiel:

Marke1 : while(true) { 		while(true) { 			if(<Bedingung>)
				continue label1; 		} 	}

Der letzte Sprungbefehl springt aus dem inneren Block. Die speziellen Labels case <Bedingung>: und default dürfen nur innerhalb eines switch Blockes auftreten. Der continue Befehl kann nur Labels aktivieren, die auf Iterationsbefehle verweisen. Die Labels in einfachen Anweisungen können nur mit break und continue Befehlen innerhalb eines Blockes aktiviert werden. Blöcke können sowohl Anweisungen, als auch lokale Variablendeklarationen enthalten. Anweisungen werden mit einem Semikolon terminiert. Blöcke könne überall dort existieren, wo auch Anweisungen stehen.

2.5.6.1. Auswahlanweisungen

Auswahlanweisungen sind:

  • if ( <Bedingung> ) Anweisung
  • if ( <Bedingung> ) Anweisung else Anweisung
  • switch ( Anweisung ) {
    		case <Konstante Anweisung>: Anweisung
     		...
    		default:
     	}

Das Resultat der Anweisung im switch Befehl wird in int umgewandelt. Das Resultat der Bedingung in if Anweisungen ist vom Typ boolean.

2.5.6.2. Iterative Anweisungen

Iterationsanweisungen sind:

  • while ( <Bedingung> ) Anweisung
  • do Anweisung while ( <Bedingung> );
  • for ( <ForInit>;<Bedingung>;<ForIncr>) Anweisung

Im Initialisierungsteil der For-Anweisung <ForInit> darf man auch lokale Variablen deklarieren. Falls die Bedingung in der For-Anweisung fehlt so wird die Schleife nicht terminiert.

2.5.6.3. Sprunganweisungen

Sprunganweisunge sind:

  • break [<Labelname>];
  • continue [<Labelname>];
  • return [<Anweisung>];
  • throw [<Anweisung>];

Die Anweisungen break, continue und return führen vor dem Sprung noch die Anweisungen unter dem Label finally aus.

2.5.6.4. Kontrollanweisungen

Kontrollanweisungen sind:

  • synchronised ( <Anweisung 1> )
  • try <Block 1> finally <Block n>
  • try <Block 1> [catch ( <Argument>) <Block>]+ [finally <Block n>]

Die Anweisung 1 in der synchronised Anweisung muß eine Referenz auf ein Objekt oder Array liefern. Vor der Ausführung der Anweisung 2 wird ein Mutex auf dieses Objekt geholt und anschließen wieder freigegeben. Die try Anweisung führt immer zuerst den Block 1 aus. Falls dort eine Exception auftritt, wird ein passender Handler unter den catch Blöcken gesucht und anschließen noch, falls vorhanden, der finally Block ausgeführt. Das Argument für den catch Block muß vom Typ Exception sein.

Bei den Operatoren sind nur + für das Verbinden von Strings und >>> für ein vorzeichenloses Leftschift neu. Das Resultat von n>>>s ist gleich dem n>>s, falls n größer null ist, sonst aber (n>>s)+(2<<(k-s-1)), wobei k 32, falls n vom Typ int und 64, falls n vom Typ long ist.

2.5.7. Multitasking in Java

Die Programmiersprache Java unterstützt Multitasking mit speziellen Sprachelementen für die Erzeugung und Synchronisation von Threads. Threads sind kleinere Hintergrundprozesse (lightweight process), die meistens von einem Hauptprozeß erzeugt werden, um komplexere Aufgaben im Hintergrund zu bearbeiten und dadurch bessere Reaktionszeiten zu haben. Würde man alle Aufgaben in demselben Prozess bearbeiten, dann wird die ganze Anwendung für die Dauer der Berechnungen gesperrt. Man kann diese Aufgabe auch nicht abbrechen, denn die Anwendung nimmt keine Ereignisse entgegen, solange die Aufgabe nicht beendet ist. Verlagert man die komplexe Aufgaben aber in einem Hintergrundprozess, so ist die Hauptanwendung (also das Benutzerinterface) sofort wieder bereit, Benutzereingaben entgegenzunehmen.

In der Programmiersprache Java hat man zwei Möglichkeiten, Threads zu benutzen. Man kann seine Klasse von der Klasse Thread ableiten oder als Implementierung das Interface Runnable definieren. Beide Möglichkeiten haben ihre Vor- und Nachteile. Im allgemeinen: falls eine Klasse von einer anderen Klasse ableiten muß, zum Beispiel von der Klasse Applet, dann kann sie nur das Interface Runnable benutzen. Anderenfalls sollte sie von der Klasse Thread abgeleitet sein.

// //	SimpleThread.java //  class SimpleThread extends Thread {
	public SimpleThread(String name) { 		super(name); 	} 	public void run() {
		for(int i = 0; i < 10; i++) { 			System.out.println(i + " " +
getName()); 			try { 				sleep((int)Math.random() * 1000); 			}
catch(InterruptedException e) {} 		} 		System.out.println("DONE! " +
getName()); 	} }

Listing 1: Listing von SimpleThread.java. Quelle: JDK 1.0 beta2

// //	TwoThreadsTest.java //  class TwoThreadsTest { 	public static
void main(String args[]) { 		new SimpleThread("Jamaica").start();
		new SimpleThread("Fiji").start(); 	} }

Listing 2: Listing von TwoThreadsTest.java. Quelle: JDK 1.0 beta2

In diesem Beispiel wird eine Unterklasse von Thread - SimpleThread - definiert, die 10 Mal ihren Namen auf den Standardausgabestrom schreibt und dann eine zufällige Anzahl von Sekunden wartet. Durch den Aufruf der Methode sleep() erhält der andere Thread die Möglichkeit zum Laufen. Die Threads haben gleiche Prioritäten und würden sonst nicht abwechselnd aktiviert.

Die Benutzung von Runnable Interface wird in dem Kapitel "Ein einfaches Java-Applet" demonstriert.

Jeder Thread muß eine Methode run() haben, die den Code für den Hintergrundprozess enthält. Threads haben einen Zustand (runnable, not runnable, dead, new thread) und eine Priorität. Java's virtuelle Maschine implementiert ein einfaches prioritätsgetriebenes Scheduling. Zu jeder Zeit läuft der Thread mit der höchsten Priorität. Falls mehrere Threads mit gleicher Priorität gerade lauffähig sind, so wählt der Scheduler den ersten und läßt ihn laufen. Der Thread wird nicht abgerochen, um andere Threads mit gleicher Priorität laufen zu lassen, es sei denn, daß das Ziel-Betriebssystem eine solche Schedulingsstrategie implementiert. Alle Threads gehören zu Gruppen, die gemeinsame Eigenschaften haben. Threads können Daemons sein. Daemons sind Threads, die im Hintergrund mit einer niedrigeren Priorität laufen und Aufgaben auf Anfrage von anderen Threads erledigen.

JAVA Threads

Bild 4: Zustände der Java-Threads

Wenn ein Java-Thread angelegt wird, ist er in dem Zustand New Thread. Mit einem Aufruf der Methode start() wird der Thread in den Zustand Runnable überführt. Runnable Threads werden vom Scheduler ausgeführt, wenn CPU-Zeit frei ist. Ein Thread kann die Kontrolle über die CPU freiwillig mit der Methode yield() abgeben, um andere Threads mit gleicher Priorität laufen zu lassen. Der Thread kann jederzeit mit der Methode stop() angehalten werden. In diesem Zustand ist er nicht mehr lauffähig. Man kann aber seine Instanzvariablen lesen. Threads können zeitweilig mit der Methode suspend() angehalten und anschließend wieder mit der Methode resume() gestartet werden. Threads, die auf einen Monitor warten (Methode wait()), müssen ein Signal vom Monitor (Methode: notify()) erhalten, um wieder laufen zu können.

Die Methode isAlive() liefert true, wenn der Thread gestartet und noch nicht gestoppt wurde (Zustand runnable oder not runnable). Die Priorität eines Threads kann man mit Hilfe der Methode setPriority() setzen. Die Priorität muß zwischen MIN_PRIORITY und MAX_PRIORITY liegen (Konstanten der Klasse Thread). Die Methode isDaemon() liefert true, wenn der Thread ein Daemon-Thread ist. Um einen Daemon-Thread zu erzeugen, muß man die Methode setDaemon() mit dem Wert true aufrufen. Die run()-Methode der Daemon-Threads ist typischeweise eine ewige Warteschleife auf Anfragen von anderen Threads.

Für die Synchronisation von Threads bietet Java wiedereintrittsfähige Monitore.

// //	Producer.java //  class Producer extends Thread { 	private
CubbyHole	cubbyhole; 	private int number;  	public Producer(CubbyHole c, int
number) { 		cubbyhole = c; 		this.number = number; 	}  	public void run() { 	 
for(int i = 0; i < 10; i++) { 	    cubbyhole.put(i); 	    System.out.println("Producer
#" + this.number + " put: " + i); 	    try { 	     
sleep((int)(Math.random() * 100)); 	    } catch(InterruptedException e) {} 	  }
	} }

Listing 3: Listing von Producer.java. Quelle: JDK 1.0 beta2

// //	Consumer.java //  class Consumer extends Thread { 	private
CubbyHole	cubbyhole; 	private int number;  	public Consumer(CubbyHole c, int
number) { 		cubbyhole = c; 		this.number = number; 	}  	public void run() { 	 
int value = 0; 	  for(int i = 0; i < 10; i++) { 	   value = cubbyhole.get(i);
	   System.out.println("Consumer #" + this.number + " got: "
+ value); 	  } 	} }

Listing 4: Listing von Consumer.java. Quelle: JDK 1.0 beta2

// //	CubbyHole.java //  class CubbyHole { 	private int seq;
	private boolean available = false;  	public synchronised int get() {
		while(available == false) { 			try { 				wait(); 			}
catch(InterruptedException e) {} 		} 		available == false; 		return seq; 	} 
	public synchronised void put(int value) { 		seq = value; 		available = true;
		notify(); 	} }

Listing 5: Listing von CubbyHole.java. Quelle: JDK 1.0 beta2

// //	ProducerConsumerTest.java //  class ProducerConsumerTest {
	public static void main(String args[]) { 		CubbyHole c = new CubbyHole();
		Producer p1 = new Producer(c, 1); 		Consumer c1 = new Consumer(c, 1); 
		p1.start(); 		c1.start(); 	} }

Listing 6: Listing von ProducerConsumerTest.java. Quelle: JDK 1.0 beta2

In diesem Beispiel sieht man die Verwendung von Monitoren. Die Klasse Producer erzeugt 10 ganze Zahlen, schreibt sie in eine Puffer (CubbyHole) und wartet dann ein zufällige Zeit. In dieser Zeit wird der Consumer aktiv und holt sich die neueste Zahl. Die Klasse CubbyHole definiert die synchronisierten Methoden get() und put(). Java erzeugt für jede Instanz einer Klasse, die synchrosniserte Methoden oder Codeblöcke enthält, einen Monitor. Wenn ein Objekt eine solche Methode aufruft, sperrt es automatisch den Monitor und gibt ihn nach Verlassen der Methode wieder frei. Falls das Objekt in dieser Methode wait() aufruft, wird der Monitor ebenfalls freigegeben. Das Objekt sperrt den Monitor wieder, sobald es in den Zustand runnable zurückkehrt.

2.5.8. Wichtige Packages

Java hat selbst keine E/A-Routinen. Für Java gibt es einige vorgefertigte Bibliotheken (Packages). Zum Beispiel:

  • java.lang: Allgemeine Klassen für Java: Runnable, Boolean, System usw. Dieses Package wird als einziges immer implizit importiert.
  • java.util: Hilfsklassen: Date, Vector, Hashtable
  • java.io: E/A Klasse: File, InputStream, OutputStream
  • awt: Abstract Window Toolkit: Benutzerinterfaceklassen
  • net: Netzwerkspezifische Klassen
  • applet: enthält die Klassen Applet und AudioClip für Audioanwendungen.

3. Beispielprogramme

In Java kann man eigenständige Programme schreiben, die ohne die Hilfe eines Java-fähigen WWW-Browsers arbeiten oder aber Java-Applets, die nur als Teil einer WWW-Seite arbeiten. Außerdem kann man Protokollhandler enwickeln, die ein bestimmtes Protokoll wie ftp: oder http: implementieren. Bei Bedarf kann man auch einige Methoden einer Java-Klasse in einer anderen Sprache (z.B. C, C++) implementieren. Solche Methoden sind möglicherweise etwas schneller, aber da sie als Maschinencode eines bestimmten Zielsystems kompiliert werden, sind sie nicht mehr binärkompatibel zu anderen Systemen.

3.1. Ein einfaches Java-Programm

Eigenständige Java-Programme müssen die Methode main() überschreiben. Zum Beispiel:

// //	TestApp.java //  class TestApp { 	public static void
main(String args[]) { 		System.out.println("Test App!"); 	} }

Listing 7: Listing von TestApp.java. Quelle: JDK 1.0 beta2

Nach der Kompilierung wird daraus die Binärdatei TestApp.class erstellt, die man anschließend mit dem Java-Interpreter ausführen kann:

javac TestApp.java

java TestApp

3.2. Ein einfaches Java-Applet

Alle Applets sind von der Klasse Applet abgeleitet. Die wichtigsten Methoden eines Applets sind:

  • void init(): Initialisierung von Applet. Laden der WWW-Seite.
  • void start(): Aktivierung von Applet. Anzeigen der WWW-Seite.
  • void stop(): Deaktivierung von Applet. Verlassen der WWW-Seite.
  • void destroy(): Terminierung von Applet. Verlassen des Browsers.
  • void paint(Graphics): Zeichnet den Bereich, der dem Applet zugewiesen wurde.

Man muß nicht alle diese Methoden überschreiben. Hier ist ein einfaches Beispielapplet.

// //	TestApplet.java //  import java.awt.Graphics;	//graphische
Klassen import java.applet.Applet;	//Deklaration der Klasse Applet  public class
TestApplet extends Applet { 	public void init()  		{ resize(150, 25); } 	public
void paint(Graphics g) 		{ g.drawString("Ausgabe von Test Applet!",
50, 25); } }

Listing 8: Listing von TestApplet.java. Quelle: JDK 1.0 beta2

Diesen Quellcode kompiliert man mit den Java-Compiler (javac). Dazu gibt man auf der Kommandozeile den Befehl:

javac TestApplet.java

ein . Der Java-Compiler erzeugt die Datei TestApplet.class. Die neue Klasse muß jetzt in eine WWW-Seite eingebunden werden, zum Beispiel so:

<HTML>

<HEAD>

<TITLE> "Titel" </TITEL>

</HEAD>

<BODY>

"Das ist ein Applet!"

<APPLET CODE=TestApplet.class WIDTH=150 HEIGHT=25>

</BODY>

</HTML>

Listing 9: Listing von TestApplet.html. Quelle: JDK 1.0 beta2

Nun kann man die neue WWW-Seite in den Browser laden. Man sollte den Browser nicht aus dem Verzeichnis, in dem die WWW-Seiten gespeichert sind, aufrufen. Sonst kann man die Datei - nach einigen Programmänderungen - nicht erneut laden.

Damit die Applets quasiparallel ablaufen können und sich nicht gegenseitig blockieren, sollte man für längere Abläufe in Applets Hintergrundthreads benutzen. Dafür muß das Applet zusätzlich von der Klasse Runnable abgeleitet sein. Hier ein kleines Beispiel:

// // ThreadApplet.java //  import java.awt.*; import
java.applet.Applet;  public class ThreadApplet extends Applet implements
Runnable { 	Thread	testThread = null; 	int	count = 0; 	String	meldung = null; 
	public void run() { 		while(true) { 			sleep(100); 			count++; 			meldung = "Schleifenzähler:
" + count; 			repaint(); 		} 	}  	public void paint(Graphigc g) {
		g.clearRect(0,0,size().width-1, size().height-1); 		g.drawString(meldung, 5,
15); 	}  	public void init() { resize(500, 20); }  	public void start() {
		if(testThread == null) { 			testThread = new Thread(this, "Test Thread");
			testThread.start(); 		} 	}  	public void stop() { 		testThread.stop();
		testThread = null; 	} }

Listing 10: Listing von ThreadApplet.java. Quelle: c't 2/96

3.3. Einbinden von "Native-Methods"

"Native-Methods" sind Methoden einer Java-Klasse, die man in einer anderen Programmiersprache implementiert hat. So kann man Aufgaben lösen, die die Programmiersprache Java nicht unterstützt oder einfach schnellere Methoden für zeitkritische Programmeteile erzeugen. Solche Methoden sind natürlich nicht mehr plattformunabhängig.

Die JDK Version 1.0 beta2 unterstützt nur die Implementierung der "Native-Methods" in der Programmiersprache C. Eine "native methode" deklariert man in der Java-Klasse ohne eine Implementierung. Um die Methodendeklaration mit der Implementierung zu verbinden, muß man in einem statischen Initialisierungsblock mit Hilfe der Methode loadLibrary() der Klasse System eine DLL (oder shared Library unter UNIX) mit der Implementierung laden.

// //  HelloWorld.java //  class HelloWorld { 	public native void
displayHelloWorld(); //native Methode deklarieren  	static {
		System.loadLibrary("hello");	//DLL mit implementierung laden 	} 
	public static void main(String args[]) {	//Hauptprogramm 		displayHello(); 	} }

Listing 11: Listing von HelloWorld.java. Quelle: JDK 1.0 beta2

Diese Quelldatei kann man ganz normal (javac HelloWorld.java) kompilieren. Für die Implementierung in C muß man mit Hilfe des Programms javah aus der Java-Klasse eine Headerdatei und eine Stubs-Datei generieren.

javah HelloWorld		//erzeugt HelloWorld.h

javah -stubs HelloWorld //erzeugt HelloWorld.c

Das Programm javah generiert eine HelloWorld.h-Datei, die eine C-Struct enthält und eine externe Funktion deklariert. Dieses Struct hat die Aufbau der Java-Klasse und ermöglicht der C-Methode, auf die Instanzvariablen der Java-Klasse zuzugreifen. Die generierte Stub-Datei enthält den Rumpf der C - Funktion, die als Java-Methode aufgerufen wird. Aus dieser Datei erzeugt man die DLL.

// //	HelloWorld.c //  #include  #include "HelloWorld.h"
#include   void HelloWorld_displayHelloWorld(struct HHelloWorld *this) {
	printf("Hello World!\n"); 	return; }

Listing 12: Listing von HelloWorld.c. Quelle: JDK 1.0 beta2

Die Headerdatei StubPreamble.h enthält Deklarationen des internen Java-Laufzeitsystems für die C-Funktion. Die Headerdatei HelloWorld.h enthält die Deklaration der C-Struct, die der Java-Klasse entspricht. Ein Zeiger auf diese Struct wird der C - Funktion übergeben, damit sie auf die Instanzvariablen der Java-Klasse zugreifen kann.

Die kompilierte DLL muß in einem Verzeichnis liegen, das in der PATH Umgebungsvariable angegeben ist. Unter UNIX muß man die Umgebungsvariable LD_LIBRARY_PATH entsprechend setzen.

4. WWW-Scriptsprachen

Mit der Programmiersprache Java kann man kleine Applets für die WWW-Seiten erstellen. Java-Applets bleiben aber isoliert vom HTML-Dokument und voneinander. Um die Applets miteinander und mit dem HTML-Dokument zu verbinden, Tastatur-, Maus- und andere Ereignisse zu bearbeiten und möglichst viele Aufgaben schon auf der Clientseite zu erledigen, sind die Scriptsprachen vorgesehen. Scripts werden nicht in Bytecodes übersetzt, sondern direkt in die HTML-Dokumente eingebunden. Sie werden zur Laufzeit interpretiert. Diese Scripts können auf die Benutzereingaben reagieren, Berechnungen durchführen, Inhalte und Aussehen der HTML - Elemente ändern usw. Somit machen sie vieles, was vorher die CGI-Scripts auf Serverseite erledigt haben. Da jetzt nicht alle Benutzereingaben übers Netzwerk transportiert werden müssen, verringert sich die Netzbelastung und die Abarbeitung wird beschleunigt.

Sowohl Netscape als auch Microsoft haben angekündigt, solche Scriptsprachen zu entwickeln. Microsofts Scriptsprache soll Visual-Basic-Script heißen und auch Windows-Systemaufrufe durchführen können. Netscape hatte vorher eine eigene Scriptsprache namens LiveScript entwickelt. Nach einer Vereinbarung mit Sun wurde diese Sparche zu JavaScript umbenannt und ist jetzt in der neuesten Version des Netscape Browsers eingebaut. JavaScript ist noch nicht ganz fertig. Viele Sprachelemente sind entweder noch nicht implementiert oder nicht dokumentiert. Außerdem hat man viele weitere Änderungen an der Sprache angekündigt.

4.1. JavaScript

Grundlegende Sprachelemente des JavaScript stammen von Suns Java. JavaScript arbeitet mit den Inhalten der HTML-Dokumente. Die Elemente eines HTML-Dokuments werden als Objekte behandelt, die Methoden und Instanzvariablen (Properties) haben. JavaScript kennt nur feste Objekte, die der Benutzer nicht ändern kann. Sie sind in folgender Hierarchie angeordnet:

JavaScript

Bild 5: Objekthierarchie der Programmiersprache JavaScript

  • Window: ist der Bereich, in dem Netscape den Text darstellt, nicht aber das Netscape Fenster selbst. Ab Version 2.0 unterstützt der Netscape Browser mehrere Fenster (Frames). Die Methoden der Windows können Warnungen und sonstige Texte in einem kleinen Fenster anzeigen (alert) und Benutzer um eine Bestätigung bitten (confirm). Die Methode confirm liefert true oder false, je nach der Reaktion des Benutzers.
  • Location: hat Properties, die den URL der aktuellen WWW-Seite und seiner Komponenten (Protokoll, Host usw.) enthalten.
  • History: bietet den Zugriff auf die URLs der bisher gelesenen Seiten. Mit seinen Methoden kann man sich innerhalb dieser URLs bewegen.
  • Document: hat Methoden für die Textausgabe und viele Properties, die den Titel und andere Komponenten des Dokuments enthalten. Unter anderem hat es auch Arrays von Formularen, Links und Anchors.
  • Forms: sind die Inhalte der HTML-Dokumente. Sie haben folgende untergeordnete Elemente: Text Fields, Text Areas, Check Boxes, Radio Button, Selections, Buttons. Die Properties dieser Elemente enthalten die Namen und Inhalte (Text bei Textfeldern und boolesche Werte bei den Buttons). Man kann für die Elemente Ereignis-Handler definieren.
  • Links und Anchors: sind Verweise auf andere HTML-Dokumente oder Dateien. Links entstehen durch das HTML-Element href und Anchors durch das Element name.
  • Plug-Ins, Applets, Elements: sind in der Version 2.0 (beta 5) des Netscape Browsers noch nicht implementiert. Plug-Ins sind eine Schnittstelle für Fremdformate wie z.B. Postscript oder PDF. Verschiedene Firmen (z.B. Adobe) entwickeln zur Zeit solche Plug-Ins.

JavaScripts kann man mit dem Element namens script in eine HTML-Seite einbinden. Man kann keine neuen Objekte definieren, aber man kann Funktionen in dem HTML-Dokumentenkopf (head) definieren, die man später aufrufen will. Methoden der vordefinierten Objekte werden über die Namen der Objekt aufgerufen (z.B. document.write("Text") ). Der this - Zeiger zeigt auf das aktuelle Objekt. Properties sind wie öffentliche Instanzvariablen. sie werden einfach über deren Namen mit referenziert (z.B. document.title). Möglich ist auch die Array-Notation - document['title'] oder document[0], falls man den Index des Property kennt.

Die Formularelemente haben folgende Ereignis-Handler und Methoden:

Ereignis-Handler Methode Bedeutung
onBlur blur Verlassen des Feldes
onChange - Ändern des Feldinhaltes
onClick click Mausklick auf den Button
onFocus focus Aktivieren eines Textfeldes
onLoad - Ausführen von JavaScript-Code
onMouseOver - Mausbewegung über das Feld
onSelect select Auswählen eines Select-Feldes
onSubmit - Abschicken eines Formulars
onUnload - Ausführen von JavaScript-Code
- enable Erlauben der Benutzereingabe
- disable Verbieten der Benutzereingabe

Tabelle 1: Ereignis-Handler und Methoden der Formularelemente

Beipiel

Listing 13: einfaches JavaScript Beispiel. Quelle: iX 2/96

5. Programmierwerkzeuge

Um Javaprogramme anzuzeigen, benötigt man eine Java-Laufzeitumgebung. Für die Java-Applets ist ein Java-fähiger WWW-Browser nötig. Das sind im Moment folgende Browser:

  • HotJava: Kostenlos von Sun verfügbar. Läuft unter Solaris, Windows 95 und Windows NT. Kann aber nur JavaApplets der Alpha3 JDK ausführen.
  • Netscape 2.0b3: Preis etwa DM 149,-. Für Studenten und Hochschulangehörige kostenlos übers Internet zu beziehen. Läuft unter Windows 3.1, Windows 3.11, Windows 95, Windows NT, Linux, etc., Kann nur JavaApplets der Beta1 JDK ausführen und auch das nicht unter Windows 3.1 und Windows 3.11. Kann auch JavaScript (bzw. LiveScript). hat auch einen eigenen VRML Standard (WebFX).
  • Netscape 2.0b4: dito. Wird JavaApplets der Beta2 JDK ausführen können.
  • Oracle Powerbrowser: Kostenlos. Soll auch Java, JavaScript und Visual Basic Script Programme ausführen können. Im Moment noch nicht verfügbar.
  • Explorer 2.0: Kostenlose Update für Windows 95 und Windows NT Benutzer. Wird Java, Visual Basic Script, JavaScript (vielleicht) und VRML (vielleicht) können. Im Moment noch nicht verfügbar.
  • Java Maker 0.1: Einfache Test- und Programmierumgebung für Java-Applets. Durchsucht HTML-Dateien nach einem applet Tag und zeigt die Applets an. Man hat einen eingebauten Unicode-Editor und man kann aus dieser Umgebung auch den Java-Compiler aufrufen. Shareware von Choi, Hee Chang - http://net.info.samsung.co.kr./~hcchoi/.

Um JavaProgramme zu entwickeln, braucht man einen Unicode-fähigen Editor und das JDK Toolkit. Ein Unicode-Editor ist zum Beispiel Notepad von Windows NT. JDK kann man kostenlos über Internet beziehen. Im Moment sind JDKs für Windows 95, Windows Nt, Solaris und Mac OS verfügbar. Man muß sich zwischen den Versionen Alpha3, Beta1 und (die aktuelle) Beta2 entscheiden.

Das JDK enthält einen Compiler (javac), einen zeichenorientierten Debugger (JDB) und ein paar andere Tools. Die Dokumentation gibt es ebenfalls kostenlos übers Internet von Sun (http://java.sun.com). Im Moment ist es möglich, die Dokmentation als Postscript- oder HTML Format downzuloaden. Die Dateinamen sind jedoch länger als 13 Zeichen.

Als Einführung in die Java-Programmierung ist das Java Tutorial durchaus zu empfehlen. Die Sprachspezifikation ist mehr trocken gehalten.

Die erste Java-Entwicklungsumgebung kommt von Symantec (Espresso). Es handelt sich dabei im wesentlichen nur um die Einbindung des JDK von Sun in das Symantec C++-Projektmanagement.

Borland hat eine visuelle und leicht bedienbare Entwicklungsumgebung für Java (Latte) angekündigt. Latte soll Mitte des Jahres erscheinen.

Java-Klassenbrowser gibt es schon als Shareware.

6. Literaturhinweise

  • JavaTM Language Specification, Beta Daft of October 30, 1995, Sun Microsystems Computer Corporation, ftp://ftp.javasoft.com/docs oder als Druck von Sun.
  • Internet wird Kommunikationsplattform Nummer 1, Computer Reseller News 1/96
  • Java-Hardware. Computerwoche Nr. 6 vom 9. Februar 1996
  • HTML3 Standard, http://www.w3.org/pub/WWW/MarkUp/
  • Unterschiede zwischen Netscape Erweiterungen (NHTML) und HTML3, http://webreference.com/html3andns/summary.html
  • Holger Reif: "Netz ohne Angst, Sicherheitsrisiken des Internet", c't 9/95
  • JDK Dokumentation, ftp://ftp.javasoft.com/docs
  • James Gosling und Henry Gilton, "The Java Language Environment", ftp://ftp.javasoft.com/docs oder als Druck von Sun.
  • The Java Virtual Maschine Specification, ftp://ftp.javasoft.com/docs oder als Druck von Sun.
  • Back, Beier, Bergius, Majorzcyk, "Java für Entwickler", ITP-Verlag, erscheint im Frühjahr 1996.
  • David Bank: "The Java Saga", Wired 3.12, S.76
  • "JavaScript: neue Netscape-Möglichkeiten", Stefan Mintert, iX 2/96


abc Information GmbH, Berlin *** Phone: +49 700-ITBROKER ** Impressum ** Contact
Host: IP: 3.139.87.151 User: Date: December 22, 2024, 6:58 am Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)