IV ERS ITÄT U L M · C UR · S CI E NDO ANDO · U N Kurzeinführung in Java für C++-Programmierer DO CENDO · Johannes Mayer Universität Ulm Abteilung Angewandte Informationsverarbeitung c J OHANNES M AYER , SAI, U NIVERSITÄT U LM , JANUAR 2002 1 WAS IST EIGENTLICH JAVA ? ➜ Eine südostasiatische Insel ➜ Ein (US-amerikanischer) umgangssprachlicher Ausdruck für starken, heißen Kaffee ➜ Eine Programmiersprache von Sun Microsystems Inc. WAS IST EIGENTLICH J AVA ? 2 L ITERATUR ➀ David Flanagan: Java Examples in a Nutshell, zweite Ausgabe, O’Reilly, 2000. (Viele Beispiele zu allen möglichen Bereichen – sehr zu emfehlen.) ➁ Patrick Niemeyer, Jonathan Knudsen: Learning Java, O’Reilly, 2000. (Einführung in Java mit Beispielen gespickt) ➂ David Flanagan: Java in a Nutshell, dritte Augabe, O’Reilly, 1999. (Nur, um sich einen vollständigen Überblick über die Sprache Java zu verschaffen bzw. nachzuschlagen.) ➃ David Flanagan: Java Foundation Classes in a Nutshell, O’Reilly, 1999. (Analog zum vorigen Buch – nur jetzt für AWT, Swing und Java 2D.) L ITERATUR ➄ Mario Jeckle: Skript zur Vorlesung Java, WS 2000/2001. (Auf der Seite erhältlich.) 3 W EBSEITEN / C OMPILER ➜ Alles rund um Java gibt’s auf der Java-Homepage von Sun Microsystems: ➜ Download des Java 2 SDK 1.3.1: (Version 1.3.1 ist die momentan stabile Version; Version 1.4 steht als Release Candidate zur Verfügung) ➜ Online-Handbücher und Tutorials zu Java: ➜ Online-Dokumentation der API des Java 2 SDK 1.3.1: ➜ Java 2 SDK 1.3 von IBM: (schneller JIT – für Linux und Windows, nicht aber für Solaris) ➜ Sun’s Forte for Java: ➜ BlueJ: ➜ Borland JBuilder 6 Personal: W EBSEITEN / C OMPILER 4 G ESCHICHTLICHES 1990 ➜ Mike Sheridan ist Initiator des Green Teams bei Sun Microsystems 1991 ➜ James Gosling beginnt seine Arbeit am Interpreter „Oak“ (später in „Java“ umbenannt) ➜ Patrick Naughton arbeitet am „Aspen“ Grafik-System 1994 ➜ Van Hoff implementiert einen Java-Compiler in Java (Gosling implementierte den Compiler in C) 1995 ➜ Sun kündigt Java auf der SunWorld an – Download im Internet JDK’s: 1996 v 1.0, 1997 v 1.1, 1998 v 1.2, 2000 v 1.3, 2002 v 1.4 G ESCHICHTLICHES 5 A LLGEMEINES ➜ Java ist rein objektorientierte Programmiersprache und nicht hybrid wie etwa C++ ➜ Entstanden (im Wesentlichen) aus C++ und Oberon ➜ Große Ähnlichkeit zu C/C++ ➜ Überschaubare Anzahl von Sprachmitteln – im Gegensatz zu C++ ➜ Plattformunabhängig (wegen Interpretation von Bytecode) ➜ Sauberes Modulkonzept (wie in Oberon) ➜ Keine „richtigen“ Zeiger (d. h. keine Zeigerumwandlungen und keine Zeigerarithmetik – wie in Oberon) ➜ Automatische Speicherverwaltung A LLGEMEINES 6 A LLER A NFANG IST LEICHT ! " " ➜ Java kennt nur Klassen – eine rein objektorientierte Sprache ➜ Minimales Programm muss also in Klasse eingebettet sein #$ #$ wird von dem Standardausgabe-Stream aufgerufen (rein objektorientiert!) ➜ Methode -Klasse heißen als Startpunkt für die Programmausführung – wie in ➜ Methode C/C++ ➜ Datei sollte so wie die enthaltene % & ' ' ' A LLER A NFANG IST LEICHT 7 VON DER Q UELLE BIS ZUR AUSFÜHRUNG Java−Quelle (Hello.java) Java−Bytecode (Hello.class) Java−Compiler (javac) Just−In−Time−Compiler (JIT) Java−Virtual−Machine (java) ➜ Java-Quellcode wird vom Compiler in maschinenunabhängigen Java-Bytecode übersetzt (Plattformunabhängigkeit) ➜ Java-Bytecode wird von virtueller Maschine (JVM) interpretiert ➜ Evtl. übersetzt ein – in die JVM integrierter – Just-In-Time-Compiler (JIT) Methoden vor ihrer ersten Ausführung ( Performance vergleichbar zu C/C++) VON DER Q UELLE BIS ZUR AUSFÜHRUNG 8 C OMPILATION UND AUSFÜHRUNG die Klassendatei erzeugt aus keine ausführbare Datei, sondern enthält Java-Bytecode ➜ ➜ Compiler ➜ JVM wird mittels aufgerufen ➜ Klassenname angeben beim Aufruf der JVM und nicht den Namen der Klassendatei C OMPILATION UND AUSFÜHRUNG 9 T YPISCHE A NFÄNGERFEHLER signalisiert, dass es keine Klasse mit gibt ➜ Exception dem Namen " #$ ➜ JVM sucht in einer auszuführenden Klasse eine öffentliche statische Methode 10 T YPISCHE A NFÄNGERFEHLER ➜ Tippfehler bei der Eingabe des Klassennamens P RIMITIVE DATENTYPEN Name des Typs Art des Typs Speicherplatzbedarf byte vorzeichenbehaftete ganze Zahl 1 Byte short vorzeichenbehaftete ganze Zahl 2 Bytes int vorzeichenbehaftete ganze Zahl 4 Bytes long vorzeichenbehaftete ganze Zahl 8 Bytes float reelle Zahl 4 Bytes double reelle Zahl 8 Bytes boolean boolescher Wert 1 Byte char Unicode-Zeichen 2 Bytes ➜ Genau spezifizierte Größe aller primitiven Datentypen – auf allen in C/C++) Plattformen (im Gegensatz zu P RIMITIVE DATENTYPEN ➜ kann nicht von/in andere Typen konvertiert werden 11 KOMMANDOZEILEN -A RGUMENTE ! ! ! " " #$ 12 KOMMANDOZEILEN -A RGUMENTE ➜ Parameter von enthält die Kommandozeilen-Argumente (im Gegensatz zu C/C++ steht das erste Argument bei Index 0) % ➜ ist der Array-Typ mit String-Elementen ➜ Im Gegensatz zu C/C++ kann man in Java die Länge eines Arrays bestimmen % ➜ ist eine Standard-Java-Klasse ➜ Mit dem Operator kann man Strings konkatenieren ➜ Zahlen werden im String-Kontext automatisch in Strings konvertiert KOMMANDOZEILEN -A RGUMENTE 13 S TRINGS ! ! ! ! ! ! ! ! ! ! ! " " 14 S TRINGS ist eine Standard-Java-Klasse für Strings % ➜ konstruiert bereits ein String-Objekt ( also ineffizient, da zwei String-Objekte konstruiert werden!) % $ # ➜ ist ➜ Strings sind nicht veränderbar ( S TRINGS keine Kopie nötig!) 15 A RRAYS ! ! ! ! ! " " ! " ! ! " " 16 A RRAYS , sind Klassen ➜ Array-Typen, wie z. B. ist dieses Programm noch ➜ Wegen der Annahme sehr fehleranfällig K LASSEN UND O BJEKTE % % bzw. ➜ Mit und kennen gelernt haben wir schon spezielle Klassen , % , ➜ Wir haben schon selbst Klassen geschrieben ( ) sind alle Klassen (zumindest indirekt) ➜ Von der Oberklasse abgeleitet – entweder explizit oder implizit ➜ Bei Klassen gibt es „nur“ einfache Vererbung – somit ist die Vererbungshierarchie in Java ein Baum für alle Klassen ➜ Alles was zur Klasse gehört, muss in der Klasse stehen (im Gegensatz zu Implementierungen und Initialisierungen außerhalb von Klassen wie bei C++) ➜ Objekte, d. h. Instanzen einer Klasse werden mit dem angewandt auf einen Konstruktor erzeugt -Operator ➜ Java besitzt eine automatische Speicherverwaltung, daher keinen -Operator K LASSEN UND O BJEKTE 17 R EFERENZEN ➜ Variablen vom Typ einer Klasse heißen Referenzen ➜ Referenzen sind ähnlich den Zeigern von Oberon Unterschiede zu C/C++: ➜ Keine Dereferenzierung notwendig und möglich in C/C++ ➜ Kein allgemeiner Zeigertyp wie etwa ➜ Keine Typumwandlungen von Referenzen erlaubt ➜ Keine Zeigerarithmetik möglich ➜ Keine Referenzen auf primitive Datentypen ➜ Referenzen haben per Voreinstellung den Wert ➜ Implizit erfolgt kein Aufruf eines Konstruktors (wie bei den Variablen vom Typ einer Klasse in C++) R EFERENZEN 18 B EISPIEL : F IGUREN ! " ➜ Klasse ist abstrakt, wenn sie mindestens eine abstrakte, d. h. mit dem Schlüsselwort deklarierte und nicht implementierte Methode besitzt ➜ Standardmäßig erfolgt dynamische Bindung bei allen (Objekt-)Methoden in Java (was bei C++ durch das Schlüsselwort explizit gefordert werden muss) ( Schlüsselwort ) ist keine Oberklasse angegeben, ➜ Bei der Definition der Klasse also ist sie implizit von Object abgeleitet ➜ Fehlt ein Konstruktor, so wir ein -Konstruktor ohne Parameter hinzugefügt, der als einzige Anweisung ebenfalls den parameterlosen Konstruktor der Oberklasse aufruft B EISPIEL : F IGUREN 19 ! ! " ! " ! ! " " 20 B EISPIEL : F IGUREN ist von ➜ abgeleitet # $ ➜ Konstruktor enthält als erste Zeile nicht den Aufruf eines wird als erste Zeile eingefügt Konstruktors der Oberklasse #$ ➜ ist Referenz auf das Objekt selbst ➜ Sichtbarkeit eines jeden Klassenelements wird durch die Angabe von etc. getrennt voneinander festgelegt ➜ Polymorphie: Einer Referenz können auch Objekte einer abgeleiteten Klasse zugewiesen werden B EISPIEL : F IGUREN 21 T YPENTEST UND T YPZUSICHERUNG ! " ! ! ! " ! " ! ! ! ! " " " 22 T YPENTEST UND T YPZUSICHERUNG ➜ Mit dem Operator kann man überprüfen, ob ein Objekt einen bestimmten Typ besitzt ➜ Durch den (...)-Operator kann dann schließlich zugesichert werden, dass es sich um ein Objekt vom angegebenen Typ handelt ➜ Typzusicherung schlägt fehl, falls das Objekt nicht vom angegebenen ) Typ ist ( ➜ Typzusicherung ist keine Typumwandlung T YPENTEST UND T YPZUSICHERUNG 23 AUSNAHMEN ! ! ! " ! " " 24 AUSNAHMEN ➜ Zugriff auf Array-Elemente außerhalb des erlaubten Bereichs führt in & Java automatisch zu einer Ausnahme ) ( ➜ Ausnahmen sind in Java mit Objekten vom Typ parametrisiert ➜ Wird eine Ausnahme nicht abgefangen, so führt dies zu einem „Stack-Trace“, also der Ausgabe aller zur Zeit aktiven Methoden, und i. A. zum Abbruch des Programms ( nützlich bei der Fehlersuche) ➜ Erzeugen einer Ausnahme geht wie folgt: $ # ➜ Abfangen einer Ausnahme geht wie in C++: # $ & & AUSNAHMEN 25 E IN -/AUSGABE – S TREAMS , R EADER UND W RITER ! ! ! ! " ! ! " " ! 26 E IN -/AUSGABE – S TREAMS , R EADER UND W RITER konkrete Klasse zum Lesen aus einer Datei konkrete Klasse zum Lesen aus einem String % ➜ führt Pufferung ein und ermöglicht somit das Lesen von ganzen Zeilen ➜ ( ➜ ist abstrakte Klasse zum zeichenweisen Lesen Unicode-Zeichen!) ➜ ➜ Klassen zur Ein- und Ausgabe im Paket % ist abstrakte Klasse zum byteweisen Lesen % ➜ ➜ für komplizierteres Parsen der Eingabe ➜ Analog dazu gibt es für die Ausgabe die abstrakten Klassen , sowie die konkreten Klassen , , etc. und % % % und % , % ➜ sind Beispiele & & & ➜ Geprüpfte Ausnahmen müssen entweder abgefangen oder bei der Methodendeklaration angegeben werden E IN -/AUSGABE – S TREAMS , R EADER UND W RITER 27 S CHNITTSTELLEN ! ! " ➜ Eine Schnittstelle deklariert eine Menge von öffentlichen Methoden und Variablen, die eine implementierende Klasse besitzen muss (vgl. Definitions-Modul in Oberon) ➜ Keine Implementierung einer Methode in der Schnittstelle möglich ➜ Mehrfachvererbung im Zusammenhang mit Schnittstellen möglich: ➜ Schnittstelle kann von mehreren Schnittstellen erben ➜ Klasse kann mehrere Schnittstellen implementieren ➜ Schnittstellen sind genauso Typen wie es Klassen sind ➜ Ideales „Information Hiding“ S CHNITTSTELLEN 28 ! ! ! ! " ! " ! " ! ! ! ! " " 29 S CHNITTSTELLEN % die Schnittstelle ➜ Außerdem implementiert % besitzt implizit die Oberklasse ➜ ➜ Zusweisung eines Student-Objekts also an Referenzen vom Typ , und möglich % ➜ Typmehrfachvererbung also möglich S CHNITTSTELLEN 30 M ODULKONZEPT ! ! ! ! ! " " 31 M ODULKONZEPT ! " " ! ! " " ! ! " " 32 M ODULKONZEPT ➜ Klassen und Schnittstellen sind die Module in Java ➜ Anordnung von Klassen und Schnittstellen in Unterverzeichnissen Paketname am Anfang mit angeben möglich (Pakete) ➜ Relativer Pfad vom jeweiligen Hauptverzeichnis entspricht (nach Ersetzung von „/“ durch „.“) dem Paketnamen ➜ Alle Klassen, Schnittstellen, Methoden und Variablen ohne eines der , und sind genau für alle Schlüsselworte Klassen und Schnittstellen aus dem selben Paket sichtbar (Paket-Sichtbarkeit) ➜ Import von Klassen und Schnittstellen aus anderen Paketen mittels M ODULKONZEPT 33 PARAMETERÜBERGABE ! ! " " ! " ! ! ! ! " " 34 PARAMETERÜBERGABE ➜ Nur „Call by Value“ möglich in Java ➜ Objektzustand kann sich aber ändern, die Referenz nicht ➜ Simulation von „Call by Reference“: Variablen-Parameter in eine Klasse „verpacken“ ➜ Wie in C++ gibt es in Java auch innere Klassen und zusätzlich auch innere Schnittstellen ( direkt zu einer Klasse gehörig) oder auch nicht ➜ Innere Klassen können sein ➜ Bruch der Kapselung durch innere Klassen PARAMETERÜBERGABE 35 V ERGLEICH VON O BJEKTEN ! " ! ! ! " ! ! ! ! " " 36 V ERGLEICH VON O BJEKTEN # für alle Objekte funktionieren soll, ist der Parameter ( Typentest und Typzusicherung) $ V ERGLEICH VON O BJEKTEN # ➜ Weil vom Typ $ ist eine von definierte Methode, die standardmäßig (wenn keine eigene Implementierung vorhanden ist) die Referenzen vergleicht ➜ bei und referenzieren unterschiedliche Objekte, also liefert der erste Vergleich ➜ ➜ Mit dem Operator werden nur die Referenzen verglichen Referenzen auf verschiedene Objekte immer ungleich 37 $ # ! " ! ! ! " " 38 V ERGLEICH VON O BJEKTEN größer gleich und kleiner, ➜ Sonst: bei unvergleichbarem Objekt ➜ Evtl. ➜ Im Paket (vom dem alle Klassen und Schnittstellen ohne verfügbar sind) gibt es die Schnittstelle , expliziten die nur folgende Methodendeklaration enthält: ! ! ! ! ! ! ! " " ! ! ! ! " ! " " 39 V ERGLEICH VON O BJEKTEN ➜ generische Sortieralgorithmen sind auf diese Art möglich (Java kennt momentan noch keine Templates – im Gegensatz zu C++) ➜ Bei Zuweisungen von Referenzen wird nicht das Objekt, sondern nur die Referenz (also der „Zeiger“) kopiert ➜ Ein Array ist ein Objekt – daher ist die Vertauschung der Elemente trotz „Call by Value“ möglich V ERGLEICH VON O BJEKTEN 40 KOPIEN VON O BJEKTEN ERZEUGEN ! ! " ! ! ! ! ! " " ! " " ! ! ! " " 41 KOPIEN VON O BJEKTEN ERZEUGEN ➜ Zuweisung von Referenzen erzeugt noch keine Kopie von erzeugt eine byteweise Kopie mit ➜ Methode demselben dynamischen Typ ( keinen Konstruktor verwenden) #$ ➜ Bei Aggregation werden nur die Referenzen und nicht die Objekte bei überschreiben) einer byteweisen Kopie dupliziert ( #$ #$ % und löst eine aus, wenn die Schnittstelle ist aber ➜ nicht implementiert wird aus dem – automatisch importierten – ➜ Die Schnittstelle enthält keine Methodendeklaration („Marker Interface“) Paket KOPIEN VON O BJEKTEN ERZEUGEN 42 S TRINGREPRÄSENTATION ! ! ! " ! " ! ! " " 43 S TRINGREPRÄSENTATION % #$ wird die Methode ➜ Von geerbt ➜ Referenz im Stringkontext führt zur Anwendung der Methode % #$ % #$ , um die Form der Ausgabe zu ➜ Überschreiben der Methode bestimmen ➜ Interessant für Fehlersuche S TRINGREPRÄSENTATION 44 T HREADS ! " ! " ! " " ! " ! " ! " " ! ! ! " " 45 T HREADS ➜ Threads sind leichtgewichtige Prozesse, d. h. ➜ Threads teilen sich den Adressraum ➜ Laufen „parallel“ (keine explizite Kooperation wie etwa bei Koroutinen in Oberon) ➜ Thread-Ausführung wird mit der Methode Ausführung der Methode des Threads #$ gestartet #$ $ # schlafender Thread kann durch eine unterbrochen werden ➜ Mittels ➜ Beide Threads sind Beispiele für Objekte anonymer Klassen T HREADS 46 S YNCHRONISATION VON T HREADS ! ! ! ! " ! " ! ! " ! " " ! 47 S YNCHRONISATION VON T HREADS ! ! ! ! " ! " " ! ! ! " " 48 S YNCHRONISATION VON T HREADS ➜ Java stellt Sprachmittel zur Synchronisation von Threads bereit -Anweisungsblöcke, bei denen dasselbe zu ➜ Zwei synchronisierende Objekt angegeben ist, können nie gleichzeitig aktiv sein (gegenseitiger Ausschluss bzw. „Mutual Exclusion“) & ➜ Zusätzlich zu -Anweisungsblöcken kann auch eine Methode mit dem Schlüsselwort synchronized deklariert werden implizites Einschließen aller Aufrufe dieser Methode in einen -Block parametrisiert mit dem Objekt, auf dem die Methode ausgeführt werden soll & & ➜ Bei mehr als einer zu synchronisierenden Resource kann es zu Verklemmungen kommen („Deadlocks“) ➜ Alle in anonymen Klassen von außerhalb verwendeten Variablen müssen mit Hilfe des Schlüsselwortes final als konstant deklariert werden (Referenz ist konstant, Objektzustand, d. h. die Werte seiner Variablen, nicht) S YNCHRONISATION VON T HREADS 49 C ONTAINER -K LASSEN DES JAVA -API ! ! ! ! ! ! ! ! ! ! ! ! " " 50 C ONTAINER -K LASSEN DES J AVA -API ist eine Container-Klasse aus der Java Bibliothek, die dynamisch wachsende Arrays implementiert ➜ #$ ) , da Java keine % ➜ Stacks: ➜ Queues bzw. doppelt verkettete Listen: besitzen den Typ ➜ Elemente von Templates kennt ➜ Verwendung auch als Liste möglich (z. B. Methode ➜ Assoziative Arrays: % ➜ Mengen: C ONTAINER -K LASSEN DES J AVA -API 51 GUI-P ROGRAMMIERUNG MIT JAVA -S WING ! ! ! ! ! " " ! ! ! ! ! " " 52 GUI-P ROGRAMMIERUNG MIT J AVA -S WING ➜ Java-GUI-Programme auf Turing ausführen (wegen der installierten JDK-Version) ➜ Swing und AWT sind die GUI-Bibliotheken der Java Foundation Classes (Swing ist aktueller!) ➜ ist ein Fenster ➜ Reaktion auf Schließen des Fensters durch Installation eines eigenen ’s # $ ) mittels #$ anzeigen #$ setzen oder benötigte Größe % ➜ Entweder Größe mittels ) ermitteln lassen ( ➜ Hinzufügen eines Textfeldes ( # $ GUI-P ROGRAMMIERUNG MIT J AVA -S WING ➜ Schließlich Fenster mittels 53 Z USAMMENFASSUNG : C++ VS . JAVA C++ Java übersetzt interpretiert (evtl. JIT) plattformabhängig plattformunabhängig hybrid objektorientiert echt objektorientiert schnelle Ausführung mit gutem JIT nur etwa ein Drittel langsamer (anwendungsabhängig) Präprozessor echtes Modulkonzept Templates noch nicht – für Java SDK 1.5 geplant Mehrfachvererbung bei Klassen – Z USAMMENFASSUNG : C++ VS . J AVA 54 C++ Java – Schnittstellen und dadurch volles „Information Hiding“ und Typ-Mehrfachvererbung unsichere Zeiger typsichere Zeiger leicht Speicherlecks möglich automatische Speicherverwaltung Überladen von Operatoren – – anonyme Klassen – große Standardbibliothek – Persistenz integriert – Threads mit Synchronisation Z USAMMENFASSUNG : C++ VS . J AVA 55 C++ Java – „Reflection“ – automatische erzeugte HTMLDokumentation (javadoc) Z USAMMENFASSUNG : C++ VS . J AVA 56