|
|
|
Java Einführung in die Programmiersprache1. EinführungIn 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. InternetInternet 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:
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 HTTPWWW 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-BrowserDer 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. HotJavaWä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. 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:
HotJava enthält auch eingebaute Sicherheitsmechanismen die fehlerhafte oder virenverseuchte Java-Programme aufhalten, bevor sie ihr System angreifen. 1.4. ZukunftsperspektivenInternet 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.
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 JavaDie 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. 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. EntstehungsgeschichteEs 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 ProgrammiersprachenJava 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: 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 ProtokollenEinige 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:
2.5. SprachsyntaxIn 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. ProgrammaufbauJava-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:
2.5.2. Lexikalische ElementeJava-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:
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.
Opratoren sind: = > < ! ~ ? : == <= >= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>= >>>= 2.5.3. DatentypenDatentypen teilen sich in primitive Datentypen, Klassen, Interfaces und Arrays. Referencen sind "Zeiger" auf dynamisch allokierte Objekte (Instanzen und Arrays). Primitive Typen sind:
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. VariablenVariablen 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:
Variablen, die als final deklariert wurden, sind Konstanten.Ein
import Befehl z.B. 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 InterfacesEine 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:
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:
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:
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:
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:
Zum Beispiel:
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. AnweisungenIn der Programmiersprache Java dürfen Anweisungen Labels enthalten. Mittels Sprüngen kann man die Ausführung an solchen Labels fortsetzen. Zum Beispiel:
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. AuswahlanweisungenAuswahlanweisungen sind:
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 AnweisungenIterationsanweisungen sind:
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. SprunganweisungenSprunganweisunge sind:
Die Anweisungen break, continue und return führen vor dem Sprung noch die Anweisungen unter dem Label finally aus. 2.5.6.4. KontrollanweisungenKontrollanweisungen sind:
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 JavaDie 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.
Listing 1: Listing von SimpleThread.java. Quelle: JDK 1.0 beta2
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. 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.
Listing 3: Listing von Producer.java. Quelle: JDK 1.0 beta2
Listing 4: Listing von Consumer.java. Quelle: JDK 1.0 beta2
Listing 5: Listing von CubbyHole.java. Quelle: JDK 1.0 beta2
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 PackagesJava hat selbst keine E/A-Routinen. Für Java gibt es einige vorgefertigte Bibliotheken (Packages). Zum Beispiel:
3. BeispielprogrammeIn 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-ProgrammEigenständige Java-Programme müssen die Methode main() überschreiben. Zum Beispiel:
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:
java TestApp
3.2. Ein einfaches Java-AppletAlle Applets sind von der Klasse Applet abgeleitet. Die wichtigsten Methoden eines Applets sind:
Man muß nicht alle diese Methoden überschreiben. Hier ist ein einfaches Beispielapplet.
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:
ein . Der Java-Compiler erzeugt die Datei TestApplet.class. Die neue Klasse muß jetzt in eine WWW-Seite eingebunden werden, zum Beispiel so:
<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:
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.
Listing 11: Listing von HelloWorld.java. Quelle: JDK 1.0 beta2 Diese Quelldatei kann man ganz normal
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.
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-ScriptsprachenMit 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. JavaScriptGrundlegende 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: Bild 5: Objekthierarchie der Programmiersprache JavaScript
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:
Tabelle 1: Ereignis-Handler und Methoden der Formularelemente Listing 13: einfaches JavaScript Beispiel. Quelle: iX 2/96
5. ProgrammierwerkzeugeUm 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:
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
|
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) |