Kurzeinführung in Java für C++-Programmierer

Werbung
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
Herunterladen