Java FH Merseburg WS 04/05 0. Einführung Java ist eine objektorientierte Programmiersprache, die von Sun Microsystems entwickelt wurde. Die nach dem Vorbild C++ modellierte JavaSprache wurde mit dem Ziel entwickelt, kompakt, einfach und auf alle Plattformen und Betriebssysteme portierbar zu sein, sowohl was den Quelltext als auch die Binärebene anbelangt. Damit sind Java-Programme, dies können Applets oder auch Anwendungen sein, auf jeder beliebigen Maschine lauffähig, auf der die virtuelle Java-Maschine (JVM) installiert ist. Java wird meist in einem Atemzug mit dem World Wide Web erwähnt, und Browser wie der Netscape Navigator und der Microsoft Internet Explorer gelten als »Java-fähig«. Das bedeutet, dass der fragliche Browser Java-Programme, die sogenannten Applets, auf das System des Benutzers laden und ausführen kann. Ein Applet ist ein dynamisches, interaktives Programm, das aus dem World Wide Web in einen Web-Browser heruntergeladen werden kann und in einer HTML-Webseite abläuft. Applets erscheinen auf einer Web Page mehr oder weniger wie Grafiken, sind im Gegensatz zu Grafiken aber dynamisch und interaktiv. Applets können genutzt werden, um Animationen, Abbildungen, Spiele, Formulare, die sofort auf die Eingabe des Benutzers reagieren, und andere interaktive Effekte auf einer Web Page zusammen mit Text und Grafiken zu erstellen. Java ist jedoch nicht nur eine Programmiersprache für die Appletentwicklung, sondern eine ausgereifte Programmiersprache, mit der alle möglichen Aufgaben ausgeführt und die gleiche Art von Problemen gelöst werden können wie mit anderen Programmiersprachen, z.B. C oder C++. Eine Java – Applikation ist ein Anwendungsprogramm, für deren Ausführung kein Browser erforderlich ist. Das können allgemeine Programme sein, wie sie auf jedem Computer vorhanden sind. Geschichte Java wurde von Sun Microsystems 1991 im Rahmen der Entwicklung von Software für PDAs (Personal Digital Assistent) und Verbraucherelektronikgeräte wie Fernseher, Videorecorder, Toaster und andere Haushaltsgeräte entwickelt. Damals wurde mit Java das Ziel verfolgt, eine Sprache zu entwickeln, die kompakt, schnell, effizient und leicht auf vielfältige Hardware-Systeme portierbar ist. Keine der damals verfügbaren Sprachen erfüllte diese Anforderungen, denn der jeweilige Code musste für jeden in Frage kommenden Chip neu kompiliert werden, und diese waren größtenteils sehr spezifisch und wurden außerdem häufig aktualisiert. Die PDAs waren damals ein Flop (obwohl sie momentan ein Comeback haben) und der Markt für Elektrogeräte nutzte die neue Sprache nie wirklich. 579863115 Seite 1 von 8 Java FH Merseburg WS 04/05 Das Java-Team entdeckte jedoch, dass das Design der Sprache ideal für einen anderen Zweck geeignet war: die Programmierung für das Internet. Seit etwa 1993 fand das World Wide Web weite Verbreitung, mit seinen unzähligen Plattformen und Betriebssystemen, und es brauchte dringend eine plattformunabhängige Sprache. Gleichzeitig entstand eine universelle Programmiersprache zur Entwicklung von Programmen, die bedienungsfreundlich und auf verschiedene Plattformen portierbar sind. Bei Sun wurde die Java-Sprache (unter dem Namen »Oak«) in verschiedenen Projekten benutzt, erhielt aber bis zur Verknüpfung mit HotJava nicht viel Aufmerksamkeit im kommerziellen Bereich. HotJava ist ein experimenteller WWW-Browser, der 1994 (innerhalb weniger Monate) zum Herunterladen und Ausführen von Applets entwickelt wurde. HotJava stieß zwar auf positive Resonanz seitens der Web-Gemeinde, jedoch setzte sich Java erst durch, als die Fähigkeit zur Abarbeitung von Applets in den Netscape Navigator integriert wurden. Java hat derart an Bedeutung gewonnen, daß Sun unter der Bezeichnung »JavaSoft« einen eigenen Geschäftsbereich gründete. Eigenschaften von Java Java White Papers www.java.sun.com/docs/white/ Plattformunabhängigkeit Plattformunabhängigkeit bedeutet, daß ein Programm auf jedem beliebigen Computersystem ausgeführt werden kann. Java-Programme laufen auf jedem System, auf dem eine virtuelle Java-Maschine installiert ist. Java ist sowohl auf der Quell- als auch der Binärebene plattformunabhängig. Auf der Quellebene haben Javas primitive Datentypen konsistente Größen für alle Entwicklungsplattformen. Die in Java enthaltene umfangreiche Klassenbibliothek vereinfacht das Schreiben von Code, der von einer Plattform auf eine andere verlagert werden kann. Plattformunabhängigkeit auf der Quellebene bedeutet, dass Java-Quelldateien von einem System auf ein anderes überführen, auf diesem kompilieren und dort ausgeführt werden kann. Java-Binärdateien sind ebenfalls plattformunabhängig und laufen auf verschiedenen Plattformen (sofern eine virtuelle Java-Maschine vorhanden ist) ohne Notwendigkeit, den Quellcode neu kompilieren zu müssen. Objektorientierung Objektorientierte Programmierung (OOP) ist eine Technik, zur Entwicklung flexibler, modularer Programme sowie zur Gewährleistung der Wiederverwendung des Codes. Javas objektorientierte Konzepte haben viel von C++, der Sprache, auf der Java basiert, aber auch von anderen OO - Sprachen geerbt. Java umfasst eine umfangreiche Klassenbibliothek, die grundlegende Datentypen, Systemeinund –ausgabefähigkeiten, Bibliotheken für Netzfunktionen, Internet-Protokolle und Funktionen für Benutzeroberflächen sowie andere Utilities bietet. Da diese in Java geschrieben wurden, sind sie ebenfalls auf alle Plattformen portierbar. Verteilung 579863115 Seite 2 von 8 Java FH Merseburg WS 04/05 Java verfügt über eine umfangreiche Bibliothek von Routinen für TCP/IPProtokolle wie HTTP und FTP. Java Anwendungen können über das Netz auf entfernte Objekte zugreifen, als wären sie lokal vorhanden. Servlets und Java Server Pages machen die serverseitige Verarbeitung sehr effizient. leichte Erlernbarkeit Die Sprache sollte kompakt, einfach und damit leicht zu schreiben, zu kompilieren, zu debuggen und vor allem leichter zu lernen sein. Eine »kompakte« Sprache bedeutet, daß sie robuster ist, weil das potentielle Risiko, beim Programmieren schwer abzugrenzende Fehler zu machen, geringer ist. Java wurde nach C und C++ modelliert. Ein Großteil der Syntax und der objektorientierten Struktur wurde von C++ entlehnt. Jedoch wurden die komplexeren Teile dieser Sprachen absichtlich aus Java ausgeschlossen. Dadurch ist die Sprache einfacher, ohne dass Leistung geopfert wurde. In Java gibt es z.B. keine Pointer (Zeiger) und auch keine Pointer-Arithmetik. Strings (Zeichenketten) und Arrays sind in Java echte Objekte. Die Speicherverwaltung erfolgt automatisch. Robustheit Komplexe Features aus C/C++, die schwierig zu handhaben waren, wurden weggelassen (siehe Unterschiede zu C/C++) Sprachkonzept (Vergleich mit C/C++) Merkmal C++ Java Methoden / Funktionen auch klassenlose Funktionen möglich Globale Funktionen werden immer lokal zu einer Klasse definiert Klassenmethoden (benötigen kein Objekt zur Ausführung und haben keinen Zugriff auf die Instanzmerkmale eines Objektes) Blöcke {}; {} Booleanwerte können als Integer ausgewertet werden nur true oder false möglich Neue Datentypen Arrays Typedef neue Klasse definieren Zeiger Echte Arrays Strings Array of char Instanz der Klasse STRING Pointer Vorhanden Nicht implementiert Casting Automatisch Manuell Speicherhandlin g Manuell Automatisch (Carbage Collection) Strukturen und Unions Vorhanden Nicht implementiert Mehrfachvererb Möglich Interfaces 579863115 Seite 3 von 8 Java FH Merseburg WS 04/05 ung Sicherheit Durch die Virtuelle Maschine werden sicherheitsrelevante Prüfungen des Bytecodes vorgenommen (Bytecode – Verifyer). Ebenso können Java – Programme nicht auf das lokale Dateisystem zugreifen, keine Verbindung zu anderen Rechnern im Netz aufbauen oder andere Programme starten. Multithread - Fähigkeit Java Programme können in einzelne Prozesse (Threads) unterteilt werden, die unabhängig voneinander laufen. Dafür sind in Java Methoden der InterprozessKommunikation und der Synchronisation enthalten. Die Virtuelle Maschine Beim Kompilieren eines in C oder einer anderen gängigen Sprache geschriebenen Programms übersetzt der Compiler normalerweise das Programm in Maschinencode oder Prozessoranweisungen. Diese Anweisungen oder Instruktionen passen spezifisch zum Prozessor eines Rechners. Die Java-Entwicklungsumgebung umfasst zwei Teile: einen Java-Compiler und einen Java-Interpreter. Der Compiler erzeugt keinen Maschinencode, sondern sogenannten Bytecode. Bytecodes sind Instruktionen, die aussehen wie Maschinencode, die aber nicht spezifisch an einen bestimmten Prozessor gebunden sind. Ein Java-Programm wird in einem sogenannten »Bytecode-Interpreter« ausgeführt, der seinerseits das Java-Programm ausführt. Der BytecodeInterpreter von Java wird auch virtuelle Java-Maschine (JVM) oder JavaLaufzeit-Interpreter genannt. 579863115 Seite 4 von 8 Java FH Merseburg WS 04/05 Was sind die Vorteile des Bytecode-Prinzips und der VM ??? ... Welche Nachteile hat dieses Prinzip ? ... Entwicklungsumgebungen Um in Java programmieren zu können, benötigt man eine JavaEntwicklungsumgebung. Das Java Developer Kit (JDK) stellt eine solche dar. Es enthält Werkzeuge zum Kompilieren und Testen von Java - Applets und Anwendungen. Die Versionen von Java oder Java API, wie es gewöhnlich genannt wird, entsprechen den Versionen des Java Developer's Kit von Sun. JDK 1.0.x Fehlende Funktionalitäten Sicherheitsprobleme JDK 1.1.x Java Archive (JAR) Unterstützung des Public Key Verschlüsselungsverfahrens Erweiterungen des AWT (Druckeranbindung, Font-Unterstützung etc.) Verbesserte Ereignisbehandlung Java Beans Klasse für mathematische Berechnungen SQL-Zugriff auf DB Java Native Interface (JNI) J2SDK 1.2 Erweiterung der Sicherheitsschnittstelle (Signierung von JAR – Dateien) Erweiterte AWT-Funktionalitäten (JFC – Java 2D, UI-Components, Swing etc.) Erweiterung des RMI-Konzeptes Object Serialization (Objektinhalte in einem Stream) 579863115 Seite 5 von 8 Java FH Merseburg WS 04/05 Interface Definition Language (IDL) Java Servlets / JSP Verbesserte Audio-Unterstützung (MIDI, WAVAIF, AU) J2SDK 1.3 Inkrementelle Verbesserungen zu 1.2 -> Performanceverbesserung J2SDK 1.4 Reguläre Ausdrücke für Pattern Matching Neues E/A – Konzept (skalierbare E/A Operationen für Sockets und Files) Neue Deployment Facilities (Web Start Support, DOM (Level2) und SAX Support) Encoder/Decoder für Zeichenkonvertierungen Verbesserungen im Filehandling (locking, memory mapping) JDBC 3.0 Java Crytography Extension (JCE) / Java Secure Socket Extension (JSSE) J2SDK 1.5 Generics - vergleichbar mit Templates, wie in C++ bekannt ist, Enumerations - Aufzählungstypen Java Compiler API - Zugriff auf den Java-Compiler Autoboxing - Konvertieren eines primitiven Typs (z.B. boolean, int, short) in die entsprechende Wrapper-Klasse (Boolean, Integer, Short) wird durch Compiler realisiert Statische Imports - statische Methoden und Konstanten können direkt importiert und ohne vorangestellte Typangabe genutzt werden Neue I/O APIs - Schwierigkeiten in Verbindung mit dem Socket-API bzw. fehlenden Schnittstellen sowie die nicht mehr ausreichende java.io.FileKlasse führten zur Überarbeitung von IO-Features der Java-Plattform. Einfachere Loops - Vereinfachung des Java-Codes wird durch eine erweiterte Semantik für Loops definiert und dadurch der Quellcode auf die notwendigen Teile reduziert Monitoring und Management Specification der Java Virtual Machine – bisher fehlen (vor allem Remote) Möglichkeiten zum Laden und Unladen von Klassen, zum Ermitteln des Speicherverbrauchs, des HotSpot-Status usw. Ziel ist es, eine Schnittstelle zu schaffen, welche auch zur Laufzeit der Anwendung (im Gegensatz zu den jetzigen APIs) genutzt werden kann. Die JDK-Versionen sind aufwärtskompatibel. JDK Tools (Auswahl): java Java Interpreter javac Java Compiler javadoc javap Dissassembler appletviewer jar Java Archive Tool jdb Java Debugger javakey (1.1) Digital Signing Tool updateAWT Steigerung der Performanz Native Thread Support (Verteilung auf mehrere Prozessoren - Solaris) Weniger Speicherverbrauch Schnellere Speicherallokation und Garbage Collection Native Library 579863115 Seite 6 von 8 Java FH Merseburg WS 04/05 Integrierte Just-in-Time (JIT) Compiler Darüber hinaus gibt es verschiedene integrierte Java-Entwicklungsumgebungen (IDE), die auf unterschiedlichen Versionen des JDK aufbauen. Beispiele sind: Forte von Sun, Visual J++ von Microsoft !!! --> .net und C# JBuilder von Borland/Inprise Visual Age von IBM Eclipse Die Entwicklungsumgebungen können in der Regel das jeweils aktuelle JDK einbinden. Die meisten Entwicklungsumgebungen sind sogenannte »Two-Way-Tools«, die den visuellen Programmentwurf und den Quellcode synchronisieren. Alle Änderungen am visuellen Entwurf gehen automatisch auch in den Quellcode ein. Alle Änderungen des Quellcodes, die die visuelle Oberfläche betreffen, werden auch unmittelbar im visuellen Entwurf berücksichtigt. Diese Synchronisierung ermöglicht eine schnelle, effiziente und einfache Programmentwicklung (RAD – Rapid Application Programming). Gegenwärtige Entwicklungen J2SDK 1.5 Microsoft und „pure Java“/C# J2EE Ein Beispielprogramm: class Motorrad { String Marke; String Farbe; boolean Motorstatus; void start() { if (Motorstatus == true) System.out.println("Der Motor laeuft bereits."); else { Motorstatus = true; System.out.println("Der Motor ist jetzt an."); } } void Eigenschaften() { System.out.println("Das Motorrad ist eine " + Marke + “Farbe ”+ color + "."); if (Motorstatus == true) System.out.println("Der Motor ist an."); else System.out.println("Der Motor ist aus."); } public static void main (String args[]) { Motorrad m = new Motorrad(); m.Marke = "Yamaha RZ350"; m.Farbe = "Gelb"; 579863115 Seite 7 von 8 Java FH Merseburg WS 04/05 System.out.println("Aufruf Eigenschaften..."); m.Eigenschaften(); System.out.println("Start des Motors..."); m.start(); System.out.println("Aufruf Eigenschaften..."); m.Eigenschaften(); System.out.println("Start des Motors..."); m.start(); } } *** 579863115 Seite 8 von 8