Upload
vanthien
View
213
Download
1
Embed Size (px)
Citation preview
Kurzeinführung in Javafür C++-Programmierer
UN
IVERS ITÄT ULM
· SC
IEN
DO
· DOCENDO · CU
RA
ND
O ·
Johannes MayerUniversität Ulm
Abteilung Angewandte Informationsverarbeitung
� � � ��� � � � �� � � �� � � � �� � � � ��c� JOHANNES MAYER, SAI, UNIVERSITÄT ULM, 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 JAVA? 2
LITERATUR
➀ 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.)
➄ Mario Jeckle: Skript zur Vorlesung Java, WS 2000/2001.(Auf der Seite � � � � ��� �� �� � � � erhältlich.)
LITERATUR 3
WEBSEITEN / COMPILER
➜ Alles rund um Java gibt’s auf der Java-Homepage von SunMicrosystems: � � � � � � � ��� � � � � � �� � �
➜ Download des Java 2 SDK 1.3.1: � � � � � � � ��� � � � � � � � � � �� �� �� � � �
(Version 1.3.1 ist die momentan stabile Version; Version 1.4 steht alsRelease 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: � � � � � � � � � � � � � �� � �� � � � � �� � � �
➜ Borland JBuilder 6 Personal: � � � � � � � � � � � � � � �� � � � � � � � � � � � � � �
➜ BlueJ: � � � � � � � � � � � � � � � �� � � �
WEBSEITEN / COMPILER 4
GESCHICHTLICHES
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
GESCHICHTLICHES 5
ALLGEMEINES
➜ Java ist rein objektorientierte Programmiersprache und nicht hybrid wieetwa 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 keineZeigerarithmetik – wie in Oberon)
➜ Automatische Speicherverwaltung
ALLGEMEINES 6
ALLER ANFANG � � � IST LEICHT� �� � � � ��� �
�� � � � �� � � � � �� � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � �� � � � �� � � � �� � � � �� � �� � � � � � � � � � !
"
"
➜ Java kennt nur Klassen – eine rein objektorientierte Sprache
➜ Minimales Programm muss also in Klasse eingebettet sein
➜ Datei sollte so wie die enthaltene � � �� � -Klasse heißen
➜ Methode � � � #$ als Startpunkt für die Programmausführung – wie in
C/C++
➜ Methode � �� � � #$ wird von dem Standardausgabe-Stream
% & � � � � �� � aufgerufen (rein objektorientiert!)
ALLER ANFANG ' ' ' IST LEICHT 7
VON DER QUELLE BIS ZUR AUSFÜHRUNG
Java−Quelle(Hello.java)
(java)Java−Virtual−MachineJava−Compiler
(javac)
Just−In−Time−Compiler(JIT)
Java−Bytecode(Hello.class)
➜ Java-Quellcode wird vom Compiler in maschinenunabhängigenJava-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 QUELLE BIS ZUR AUSFÜHRUNG 8
COMPILATION UND AUSFÜHRUNG
�� � � � � � ��� � � � �� � � � �� �
➜ Compiler ��� � � � erzeugt aus � � � � � � � � � � die Klassendatei � � � � � � � �� � �
➜ � � � � � � � �� � � keine ausführbare Datei, sondern enthält Java-Bytecode
�� � � � � � ��� � � �� � �
� �� � � � � � � �
�� � � � � �
➜ JVM wird mittels ��� � � aufgerufen
➜ Klassenname angeben beim Aufruf der JVM und nicht den Namen derKlassendatei
COMPILATION UND AUSFÜHRUNG 9
TYPISCHE ANFÄNGERFEHLER�� � � � � � ��� � � �� �
�� � � � � � � �� �� � �� � � � � �� �
��� � �� � � � �� �� � � � �� �� � �� � � � � � � � � � �� �
�� � � � � �
➜ Tippfehler bei der Eingabe des Klassennamens
➜ Exception � � �� � � � � � � �� � � � � signalisiert, dass es keine Klasse mitdem Namen � � � � gibt
�� � � � � � �� � � � � � � �� �
�� � � � �� � � � � � � � �
"�� � � � � � ��� � � � � � � � �� �
�� � � � � � ��� � � � � �
�� � � � � � � �� �� � �� � � � � �� �
��� � �� � � � �� � � � �� � �� � � � � � � � � � � ��
�� � � � � �
➜ JVM sucht in einer auszuführenden Klasse eine öffentliche statischeMethode � � � #$
TYPISCHE ANFÄNGERFEHLER 10
PRIMITIVE 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
Plattformen (im Gegensatz zu� � in C/C++)
➜ � � � �� � kann nicht von/in andere Typen konvertiert werden
PRIMITIVE DATENTYPEN 11
KOMMANDOZEILEN-ARGUMENTE� � �� � � � � � � �� �
�� � � � �� � � � � � �� � � � � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � �� � � � � ! � � � � � � �� � � � �� ! �� � �
� � �� � � � �� � � � �� � � � �� � � �� � � � � � � � � � � � � � � � � � � � � !
"
"�� � � � � � ��� � � � � �� � � � � � � ��� �
�� � � � � � ��� � � � �� � � � � � � � � � � � � �� � � �� � � ��
� � �� � � � � � � � � � � � � �� �
� � �� � � � � � � �� �
� � �� � � � � � � � ��
�� � � � � �
➜ Parameter� � � � von � � � #$ enthält die Kommandozeilen-Argumente(im Gegensatz zu C/C++ steht das erste Argument bei Index 0)
KOMMANDOZEILEN-ARGUMENTE 12
➜ % � �� � � � ist der Array-Typ mit String-Elementen
➜ Im Gegensatz zu C/C++ kann man in Java die Länge eines Arraysbestimmen
➜ % � �� � ist eine Standard-Java-Klasse
➜ Mit dem Operator � kann man Strings konkatenieren
➜ Zahlen werden im String-Kontext automatisch in Strings konvertiert
KOMMANDOZEILEN-ARGUMENTE 13
STRINGS� � � �� � � � �� �
�� � � � �� � � � � � � �� � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � �� �� � � � � � �� � �� � � � � � �� ��� � � � � �
� � � �� � � � � � � � � � � � � � � � � � � � � � ! � � � �� �� � � � � � � � � �� � �� � � �� � !
� � �� � � � �� � � � �� � � � �� � � � � � � � � � �� � � � �� � � � !
� � �� � � � �� � � � �� � � � �� � � � � �� � � � � � � � �� � � � � � � � � !
� � �� � � � �� � � � �� � � � �� �� � �� � � �� � � � � � � � � �� � �� �� �� � � � � � � !
� � �� � � � �� � � � �� � � � �� �� � �� � � �� � � � � � � � �� � �� �� � �� �� �� � � � � � � !
� � �� � � � �� � � � �� � � � �� � � �� �� � �� � � � � � � �� �� � �� � � � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � � � � � � � � � � � � � � � � �� � � � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � � � � � � �� �� � � � � � � � �� �� � � � � � � � � � !
�� � � � � �� � � � �� � � � � � � � � � � � � � � � �
� � �� � � � �� � � � �� � � � �� � � � �� � � � �� � � � � � �� � � !
�� � �� � �� � � � �� � � � �� � � � �� � � � �� � � � �� � � � � � � � �� � � !
"
"
STRINGS 14
�� � � � � � ��� � � � � �� � �
� � � � � � � �
� � � � �� � � � �
�� � �� � � �� � � � �
�� � �� � � �� � � � � � �
� � �� �� � �� � � � � � � � � � � � �
� � � � � � � � � � � � � � � � � � � �� � � �
� � � � � � � � � �� �� � � � � � � � � � � � � � � � � � �
� � � �� � � � �� � � � � � � � ��
�� � � � � �
➜ % � �� � ist eine Standard-Java-Klasse für Strings
➜ � � � � � � konstruiert bereits ein String-Objekt ( � � % � �� � # � � � � � � $ ist
also ineffizient, da zwei String-Objekte konstruiert werden!)
➜ Strings sind nicht veränderbar (� keine Kopie nötig!)
STRINGS 15
ARRAYS� � � � � � � ��� �
�� � � � �� � � � � � �� � � �
� � � � �� � � � � �� � �� � � � � �� � � � � � �� � �� � �
�� � � � � � � � � �� � �� �� � � � �� � ! � � � � �� � � �� �� � � � � � � � � � � � � �
� � � � �� � � � � ! � � � �� � � � �� ! � � � �
� � � � � � � � � � � � � ! � � � � � � � � � � � � � � � �
� � � � � � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
�� � � � � � � � � �� � � � � � � � � " ! � � �� �� � � � � � � � � � � � � �
�� � � � � � � � �� � � � � � � � � � � " !
�� � � � � � � � � �� � � !
"
"
➜ Wegen der Annahme � �� � � � � � � �� � � � ist dieses Programm nochsehr fehleranfällig
➜ Array-Typen, wie z. B.� � � � , sind Klassen
ARRAYS 16
KLASSEN UND OBJEKTE
➜ Mit % � �� � und� � � � bzw. % � �� � � � haben wir schon spezielle Klassen
kennen gelernt
➜ Wir haben schon selbst Klassen geschrieben ( � � � � � � , % � �� � � , � � � )
➜ Von der Oberklasse � � � � � � sind alle Klassen (zumindest indirekt)
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 Gegensatzzu Implementierungen und Initialisierungen außerhalb von Klassen wie
bei C++)
➜ Objekte, d. h. Instanzen einer Klasse werden mit dem � � -Operator
angewandt auf einen Konstruktor erzeugt
➜ Java besitzt eine automatische Speicherverwaltung, daher keinen
� � �� � � -Operator
KLASSEN UND OBJEKTE 17
REFERENZEN
➜ Variablen vom Typ einer Klasse heißen Referenzen
➜ Referenzen sind ähnlich den Zeigern von OberonUnterschiede zu C/C++:➜ Keine Dereferenzierung notwendig und möglich➜ Kein allgemeiner Zeigertyp wie etwa � � � � in C/C++➜ 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++)
REFERENZEN 18
BEISPIEL: FIGUREN� � �� � � � ��� �
�� � � � � �� � � � � �� � � � � � �� � � �
� � � � � �� � � �� � �� � � � � �� � � !
"
➜ Klasse ist abstrakt, wenn sie mindestens eine abstrakte, d. h. mit demSchlüsselwort� � � � � � � � deklarierte und nicht implementierte Methodebesitzt
➜ Standardmäßig erfolgt dynamische Bindung bei allen(Objekt-)Methoden in Java (was bei C++ durch das Schlüsselwort
�� � � � � explizit gefordert werden muss) (� Schlüsselwort� � � � )
➜ Bei der Definition der Klasse �� � � � ist keine Oberklasse angegeben,also ist sie implizit von Object abgeleitet
➜ Fehlt ein Konstruktor, so wir ein � � �� � -Konstruktor ohne Parameterhinzugefügt, der als einzige Anweisung ebenfalls den parameterlosenKonstruktor der Oberklasse aufruft
BEISPIEL: FIGUREN 19
� � � �� � � ��� �
�� � � � �� � � � � � � �� � �� � � � � � � � �� � � �
� � � � � � �� � � � !
� � � � � � � �� � � � �� � � � � �
�� � � � � � � !
"� � � � � �� � � � � �� � � �
� � � � � � � � � � � �� �� � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � �� � � � � � � � � � � �� � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � �� � � � � � � �� � � � � � �� � �� � � � !
"
"�� � � � � � ��� � � � � �� �
� � � � �� � � � � � � �� � � � � � � � � � � � � � �
�� � � � � �
BEISPIEL: FIGUREN 20
➜ � � � �� ist von �� � � � abgeleitet
➜ Konstruktor enthält als erste Zeile nicht den Aufruf � � � � # � � �$ einesKonstruktors der Oberklasse� � � � � #$ wird als erste Zeile eingefügt
➜ � �� � 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
BEISPIEL: FIGUREN 21
TYPENTEST UND TYPZUSICHERUNG� � � � � � � � � � �� �
�� � � � �� � � � � � �� � � � � � �� � � � � � � � �� � � �
� � � � � � �� � � � � !
� � � � � � � � � � � � � � � �� � � � � � �� � � � � �� � � �� � � ! �� � � � � ! "
� � � � � �� � � � � �� � � �
� � � � � � � � !
"� � � � � �� � � � � � � � � � � � � �
� � � � � � � � � � �� � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � �� � � � � � � � � � � � � � � � � � � � � � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � �� � � � � � � �� � � � � � �� � �� � � � !
�� �� �� �� � � � � �� � � � � � � � � � � �
� � � � � � � � � � � � � � �� � � � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � � !
"
"
"
TYPENTEST UND TYPZUSICHERUNG 22
�� � � � � � ��� � � � �� � � � � �
� � � � �� � � � � � � �� � � � � � �
� � � � � � � � � � � �� � � � � � � � � �
�� � � � � �
➜ Mit dem Operator� � � � �� � � kann man überprüfen, ob ein Objekteinen 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
TYPENTEST UND TYPZUSICHERUNG 23
AUSNAHMEN � �� � � � � � � � ��� �
�� � � � �� � � � � �� � � � � � � �
� � � � � �� � � � � � � � � � � � � � �� � � �� � � � � � � � � �
� � � � �� � � � � ! � � � � � � � �� � � � �� ! �� � � � � � � � � � � � � � � � � � � ��
� � �� � � � �� � � � �� � � � �� � � �� � � � � � � � � � � � � � � � � � � � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � � �� � � � � !
"
"�� � � � � � ��� � � �� � � � � � �
�� � � � � � � �� �� � �� � � � � �� �
��� � �� � � � � � � � � � �� � �� �� � �� � �� � � � �� � � � � � � � �
� � � �� � � � � � � � � � � � � � � � �� � � � � � � � �� � � �
� � � �� � � � � � � � � � �� � � �� � � � � � � � �� � � � �
�� � � � � �
➜ Zugriff auf Array-Elemente außerhalb des erlaubten Bereichs führt in
AUSNAHMEN 24
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, undi. 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
EIN-/AUSGABE – STREAMS, READER UND WRITER�� �� � � ��� �
� � � � � �� � � � � � � !
�� � � � �� � � � �� � � �
� � � � �� � � � � � � � � �� � � � �� � � � �� � �� � � � � � � �� � � � � � � �
�� � � � � � � � �� � � � � � � � � �� � � � � � � � �� � � � � �� � !
� � � �� � � �� � � � � � �� � �� � � � !
� � �� � � � �� � � � �� � � � �� � �� � � � � � �� � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �� � � � � � � �� � � � � � � �
� �� � �� � � � �� � � �� � � � �� �� �� � � �� � � � � !
� �� � �� � � � � � �� � � �� � � � �� � � � � � �� � �� � � � � � �� � � � � �� � � � � � !
"
"�� � � � � � ��� � �� � �
� �� � � � � � � � ��� � � � � � � !
� �� � � � � � � � �� � ��
�� � � � � �
EIN-/AUSGABE – STREAMS, READER UND WRITER 26
➜ Klassen zur Ein- und Ausgabe im Paket ��� � � �� �
➜ � � � � � � ist abstrakte Klasse zum zeichenweisen Lesen(� Unicode-Zeichen!)
➜ � � � � � � � � � � � � � führt Pufferung ein und ermöglicht somit das Lesen
von ganzen Zeilen
➜ �� �� � � � � � � konkrete Klasse zum Lesen aus einer Datei
➜ % � �� � � � � � � � konkrete Klasse zum Lesen aus einem String
➜ � � � % � � � � � ist abstrakte Klasse zum byteweisen Lesen
➜ % � � � � � � � � � � � � � für komplizierteres Parsen der Eingabe
➜ Analog dazu gibt es für die Ausgabe die abstrakten Klassen � �� � � � und
� � � � % � � � � � , sowie die konkreten Klassen � � � � � � � � �� � � � ,
�� �� � �� � � � , % � �� � � �� � � � etc.
➜ % & � � � � �� � , % & � � � � �� � � und % & � � � � �� sind Beispiele
➜ Geprüpfte Ausnahmen müssen entweder abgefangen oder bei derMethodendeklaration angegeben werden
EIN-/AUSGABE – STREAMS, READER UND WRITER 27
SCHNITTSTELLEN� � � � � � � � �� �
�� � � � �� � � � � � � � � � � � � � � �
� � � � � � � �� � � � � � � � � � � !
� � � � � � � � � � � � � � �� � � �� � � � � � � !
"
➜ 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“
SCHNITTSTELLEN 28
� � � � � � � � �� �
�� � � � �� � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � � � �� � � � � � � � !
� � � � � � � � �� � � � � � !
� � � � � � � � � � � �� � � �� � � � � � � �� � � � � � � � � �
�� � � �� � � � � � � � � !
�� � � � � � � � � � � � � � � � � !
"� � � � � � � �� � � � � � � � � � � �
� � � � � � � � � � !
"� � � � � � � � � � � � � � �� � � �� � � � � � � �
�� � � �� � � � � � � � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � � � � � � � � � � � � � � � �� � � � � � � � �� � � � � � � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � � � � � � � � � � � � � � � � !
� � � � � � � � � �� � � �� � � � � �� � !
� � �� � � � �� � � � �� � � � �� � � � � � � � � � � � � � � � � � � � !
"
"
SCHNITTSTELLEN 29
�� � � � � � ��� � � � � � � � �
� � � � � � � � � � � � �� � � �
� � � � � � � �� � � � � �
�� � � � � �
➜ % � � � � besitzt implizit die Oberklasse � � ��� � �
➜ Außerdem implementiert % � � � � die Schnittstelle � � � � � � �
➜ Zusweisung eines Student-Objekts also an Referenzen vom Typ
% � � � � , � � ��� � � und � � � � � � � möglich
➜ Typmehrfachvererbung also möglich
SCHNITTSTELLEN 30
MODULKONZEPT�� � � � � � � �
� � ��� � � � �� � � � ��
�� � � � � � � � � � �� �
� � ��� � � � ��
�� � � � � � � � � � �� � � � �� �
� � ��� �
�� � � � � �
�� � � � � � �� � � � ��� �
� � � � � � � �� �� ! � � � � � � � � � � � � � � � � �� � � � � � � � � � �
� � � � � � � �� �� � �� � � ! � � � � � � � � � � � � � � � � � � � � �� �� � �� � � � � � � � � � �
�� � � � �� � � � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � � � � � !
� � � � � � � � � !
� � � � � � � � � !
"
"
MODULKONZEPT 31
�� � � � � � �� � � � ��� �
�� � � � �� � � � � �
� � � � �� � � � � � � � � � � � � � � �
� � �� � � � �� � � � �� � � � �� � �� � � � � � � �� � !
"
"�� � � � � � �� � � � �� � � � ��� �
� � � � � � � � �� !
�� � � � �� � � � � �
� � � � �� � � � � � � � � � � � � � � �
� � �� � � � �� � � � �� � � � �� � �� � � � � � � � � � !
"
"�� � � � � � �� � � � �� � � � �� � � � ��� �
� � � � � � � � �� �� � �� !
�� � � � �� � � � � �
� � � � �� � � � � � � � � � � � � � � �
� � �� � � � �� � � � �� � � � �� � �� � � � � � � � � � !
"
"�� � � � � �
MODULKONZEPT 32
�� � � � � � ��� � � � � ��� �
�� � � � � � ��� � �
� �� � � � � � � �
� �� � � � � � � �
� �� � � � � � � �
�� � � � � �
➜ Klassen und Schnittstellen sind die Module in Java
➜ Anordnung von Klassen und Schnittstellen in Unterverzeichnissenmöglich (Pakete)� Paketname am Anfang mit � � � � � � � � � � angeben
➜ Relativer Pfad vom jeweiligen Hauptverzeichnis entspricht (nachErsetzung von „/“ durch „.“) dem Paketnamen
➜ Alle Klassen, Schnittstellen, Methoden und Variablen ohne eines derSchlüsselworte � � �� � , � � � � � � � � � und � �� � � � � sind genau für alleKlassen und Schnittstellen aus dem selben Paket sichtbar(Paket-Sichtbarkeit)
➜ Import von Klassen und Schnittstellen aus anderen Paketen mittels
� � � � � � � � �
MODULKONZEPT 33
PARAMETERÜBERGABE� � � � � � � �� � �� �
�� � � � �� � � � � � � � � � � �� �
� � � � � �� � � � � �� � � � � � � � � �� � �
� � � � �� � � � � � !
� � � � � � � � � �� � � �� � � � � � � �
�� � � � � � � � � � � � � !
"
"� � � � �� � � � � � � � � � � � � � � � � � � � �� � � � �
� � � � � � � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � �� � � � � � � � � � � � �� � � � � !
� � �� � � � �� � � � �� � � � �� � � � � � �� � � � � � � � � � � � � !
� � � � � � � � � !
� � �� � � � �� � � � �� � � � �� � � � � � � �� � � � � � � � � � � � � � !
"
"
PARAMETERÜBERGABE 34
�� � � � � � ��� � � � � � � � � ��
� � � � � �� � � � �
� � � � � � �� � � � � �
�� � � � � �
➜ 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 auchinnere Schnittstellen (� direkt zu einer Klasse gehörig)
➜ Innere Klassen können � � � �� � oder auch nicht � � � �� � sein
➜ Bruch der Kapselung durch innere Klassen
PARAMETERÜBERGABE 35
VERGLEICH VON OBJEKTEN� �� � � � ��� �
�� � � � �� � � � � �� � � �
� � � � � �� � � � � � !
� � � � � �� � � � �� � � � � � � � �� � � � � � � � � � � � � ! "
� � � � � �� �� � � �� � � � � � � � � � � � �
�� � � �� �� � � � � �� � �� � � �
� � � � � � � � � � � � � � � �� � � � � � � � � � � !
�� � �� � � � � � � � � � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� �� � � � � � � � � � �� � � � � !
� �� � � � � � � � � � �� � � � � !
�� � � � � � � � � � � � � � � � � � �� � � � � �� � � � � � � �
� � �� � � � �� � � � �� � � � �� � �� � � � � � � � � � � � � � � � �� � � � � � �� � � !
�� � � � � � �� � � � � � � � �
� � �� � � � �� � � � �� � � � �� � � � � � � � � �� � � � � � �� � � !
"
"
VERGLEICH VON OBJEKTEN 36
�� � � � � � ��� � � �� � �
� � � � � � � � �� � � � � � ��
�� � � � � �
➜ Mit dem Operator � � werden nur die Referenzen verglichen� bei
Referenzen auf verschiedene Objekte immer ungleich
➜ � � und� referenzieren unterschiedliche Objekte, also liefert der erste
Vergleich� � � ��
➜ � � � � � # � � �$ ist eine von � � � � � � definierte Methode, die
standardmäßig (wenn keine eigene Implementierung vorhanden ist) dieReferenzen vergleicht
➜ Weil� � � � � # � � �$ für alle Objekte funktionieren soll, ist der Parameter
vom Typ � � ��� � � (� Typentest und Typzusicherung)
VERGLEICH VON OBJEKTEN 37
➜ Im Paket ��� � � � �� � (vom dem alle Klassen und Schnittstellen ohneexpliziten� � � � � � verfügbar sind) gibt es die Schnittstelle � � � � � � � �� ,
die nur folgende Methodendeklaration enthält:
� � �� � � � �� � � � � � � � # � � � � � � � $
� � � � � � � �� �
�� � � � �� � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � � �� � � � � � !
� � � � � � � � � � � �� � � � � � � � �� � � � � � � � � � � � � ! "
� � � � �� � � � � � � �� � � � � � �� � � �
� � � � � � � � �� � � � � � � � !
� � � � � � � � � � � � � � � � � !
"
"
➜ Evtl. �� � � � � � � � �� � �� � bei unvergleichbarem Objekt
➜ Sonst: � � kleiner,� � gleich und � � größer
VERGLEICH VON OBJEKTEN 38
� � � � � �� �
�� � � � �� � � � � � � � �
� � � � �� � � � � � � � � � � � �� � � � � � � � � � � � �
� � � � �� � � � � ! � � � �� � � � �� � � ! �� � �
� � � � �� � � � �� � ! � � � �� � � � �� ! � � � �
�� �� � � � � � � � � � �� � �� � � � � � � � �
� � � � � � � � � � � � � � � !
� � � � � � � � � !
� � � � � � � !
"
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � � � � �� � � � � � � � � � � � � � � � �
� � � � � � � � � � � � �
� � � � � � � � � � � � �
� � � � � � � � � � �
" !
� � � � �� � !
� � � � �� � � � � ! � � � �� � � � �� ! � � � �
� � �� � � � �� � � � �� � � � �� � �� � � � � � � � � � �� � � � � � �� � � � � � � � � � � !
"
"
VERGLEICH VON OBJEKTEN 39
�� � � � � � ��� � � � � �
� � � � � �
� � � � �
� � � � � �
�� � � � � �
➜ 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 nurdie Referenz (also der „Zeiger“) kopiert
➜ Ein Array ist ein Objekt – daher ist die Vertauschung der Elemente trotz„Call by Value“ möglich
VERGLEICH VON OBJEKTEN 40
KOPIEN VON OBJEKTEN ERZEUGEN� � � � � � ��� �
�� � � � �� � � � � � � � � � � � � � � � � � � � � � �� � � �
� � � � � �� � � !
� � � � � �� � �� � !
� � � � � � � � � � �� � � � �� � � � � � � �� � � � � � � ! �� � � �� � � ! "
� � � � � � � �� �� � � � � � �
� � � �� � � � � � � �� � � � � � �� � � � �� � � � � � ! � � � � �� � �� � � � �� �� � � � �
� �� � � �� � �� � � � �� � � � � � !
� � � � � � � !
"�� � �� �� � � � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � ! "
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � � � � � � � � � � � � � � � � �� � � � � � � � " � !
� � � � � � � � � ! � � � �� � � � � � � � � � � �� � � � � � � � �� � � � � � �
� � � �� � � � � � � � �� � � � � � ! � � � � � �� � � � � � � � � � � �� � � � � �
"
"
KOPIEN VON OBJEKTEN ERZEUGEN 41
➜ Zuweisung von Referenzen erzeugt noch keine Kopie
➜ Methode � � � � # $ von � � � � � � erzeugt eine byteweise Kopie mit
demselben dynamischen Typ (� keinen Konstruktor verwenden)
➜ Bei Aggregation werden nur die Referenzen und nicht die Objekte beieiner byteweisen Kopie dupliziert (� � � � � #$ überschreiben)
➜ � � � � #$ ist aber � � � � � � � � � und löst eine
� � � � � � % � � � � � � � � � �� � �� � aus, wenn die Schnittstelle � � � � � ��
nicht implementiert wird
➜ Die Schnittstelle � � � � � �� aus dem – automatisch importierten –Paket ��� � � � �� � enthält keine Methodendeklaration („Marker Interface“)
KOPIEN VON OBJEKTEN ERZEUGEN 42
STRINGREPRÄSENTATION� � � � �� � �� �
�� � � � �� � � � � � � � �� �
� � � � � � �� � � � � � � � !
� � � � � � � � �� � � �� � � � � � � �� � � � � � �
�� � � � � � � � � !
�� � � � � � � � � !
"� � � � � � � �� � � � � � � �� � � � �
� � � � � � � � � � � � � � � � � � � !
"� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � �� � � � � � � � � � �� � � � � � � � � !
� � �� � � � �� � � � �� � � � � � � !
"
"�� � � � � � ��� � � � � � ��
� � � � � � �
�� � � � � �
STRINGREPRÄSENTATION 43
➜ Von � � ��� � � wird die Methode � � % � �� � #$ geerbt
➜ Referenz im Stringkontext führt zur Anwendung der Methode
� � % � �� � #$
➜ Überschreiben der Methode � � % � �� � #$ , um die Form der Ausgabe zubestimmen
➜ Interessant für Fehlersuche
STRINGREPRÄSENTATION 44
THREADS� � � �� � � � �� �
�� � � � �� � � � � � � �� � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � �� � � � � � � � � � � �� � � � �
�� � � � � � � �� � � � �
� � �� � � � � � � � � �� � � � �� � � � � � � � � � � !
� � � � � � � �� � � �� � � � � � � � ! "
�� � �� � �� � � � �� � � � �� � � � � � � � � � "
� � �� � � � � � � � � �� � � � �� � � � � � � � � � !
"
" !� � � �� � � � � � � � � � � �� � � � �
�� � � � � � � �� � � � �
� � � � � � � �� � � �� � � � � � � ! "
�� � �� � �� � � � �� � � � �� � � � � � � � � � "
� � �� � � � � � � � � �� � � � �� � � � � � �� � � � � �� � !
"
" !� � � �� � � � � � ! � � � �� � � � � � !
"
"
THREADS 45
�� � � � � � ��� � � � � �� � �
� � � � � � � �
� � � � � �� � � � � �
� � � � � � �
�� � � � � �
➜ 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 � � � � � #$ gestartet
� Ausführung der Methode � # $ des Threads
➜ Mittels � � � � � � � � �� � � # � � �$ schlafender Thread kann durch eine
� � � � � � � � �� � �� � �� � unterbrochen werden
➜ Beide Threads sind Beispiele für Objekte anonymer Klassen
THREADS 46
SYNCHRONISATION VON THREADS� � � �� � � � � ��� �
�� � � � �� � � � � � � �� � � � �
� � � � �� � � �� � � � � ! � � � � � � �� �� � � � �� �� � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� �� � � � � � �� � � � � � � � � � � � �� � � � � � ! � � � � � �� � � � � � � � �� � � �
� � � �� � � � � � � � � � � �� � � � �
�� � � � � � � �� � � � �
� � �� � � � � � � � � �� � � � �� � � � � � � � � � � !
� � � �� � � � � � � � � � � �
� � �� � � � � � � � � �� � � � �� � � � � � � � � � � �� � � �� � � � � � � � �� � � !
� � � �� � � � � !
� � � � � � � �� � � �� � � � � � � � � ! "
�� � �� � �� � � � �� � � � �� � � � � � � � � � "
� � �� � � � � � � � � �� � � � �� � � � � � � � � � �� � � �� � � � � � � � �� � � !
"� � �� � � � � � � � � �� � � � �� � � � � � � � � � !
"
" !� � � �� � � � � � � � � � � �� � � � �
�� � � � � � � �� � � � �
SYNCHRONISATION VON THREADS 47
� � �� � � � � � � � � �� � � � �� � � � � � � � � � � !
� � � �� � � � � � � � � � � �
� � �� � � � � � � � � �� � � � �� � � � � � � � � � � �� � � �� � � � � � � � �� � � !
� � � �� � � � � !
� � �� � � � � � � � � �� � � � �� � � � � � � � � � �� � � �� � � � � � � � �� � � !
"� � �� � � � � � � � � �� � � � �� � � � � � � � � � !
"
" !� � � �� � � � � � !
� � � �� � � � � � !
"
"�� � � � � � ��� � � � � �� � � �
� � � � � � � �
� � � � � � � � � � �� � � �� � � � � � � � ��
� � � � � � � �
� � � � � � � � � �� � � �� � � � � � � � ��
� � � � � � �
� � � � � � � � � � �� � � �� � � � � � � � ��
� � � � � � � � � �� � � �� � � � � � � � ��
� � � � � � �
�� � � � � �
SYNCHRONISATION VON THREADS 48
➜ Java stellt Sprachmittel zur Synchronisation von Threads bereit
➜ Zwei � & � � � � � � � � -Anweisungsblöcke, bei denen dasselbe zu
synchronisierende Objekt angegeben ist, können nie gleichzeitig aktivsein (gegenseitiger Ausschluss bzw. „Mutual Exclusion“)
➜ Zusätzlich zu � & � � � � � � � � -Anweisungsblöcken kann auch eineMethode 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 zuVerklemmungen kommen („Deadlocks“)
➜ Alle in anonymen Klassen von außerhalb verwendeten Variablenmüssen mit Hilfe des Schlüsselwortes final als konstant deklariert
werden (Referenz ist konstant, Objektzustand, d. h. die Werte seinerVariablen, nicht)
SYNCHRONISATION VON THREADS 49
CONTAINER-KLASSEN DES JAVA-API � � � � � � � � ��� �
� � � � � �� � �� � �� � � !
�� � � � �� � � � � � � �� � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � �� � � � � � � � � � � � � � � ! � � � � � � � � �� � � � � � � � � � � �
� �� �� � � � ! � � � � � � � � � � � � � � � � � � � � �
�� � � �� � � � � � � � � � � � ! � � � � � � � � � � � � � � � � �
�� � � �� � �� � � � � � � � � � � � !
� � � � � � � � � �� � �� �� � � � � � � � � � � � � � � � � � �� � � � �� � �
� � � � �� � � � � ! � � � � � � � � � ! � � � �
� � �� � � � �� � � � �� � � � �� � � � � � � �� � � �� � � � � � � � � � � !
� � � � � � � � � ! � � � � � � � � � � � � � � � � � �
� � � � � � � � � � � � � � �� � � �� � � � � � � � � � �� � � � �� � � �� � � � � �
� � � � �� � � � � � � � � � �� � � � � � � � � ! � �� � � � �� � � � ! �
� � �� � � � �� � � � �� � � � �� �� � � � � � � � � � �� � � �� � � � �� �� � � � � !
"
"
CONTAINER-KLASSEN DES JAVA-API 50
� � � � ��� � � � � �� � �
� � � � � � � � � � � � �
� � � � � �� � � � � � � � � �
�� � � � � � � � � �� � � � � � � � � �
�� � � � � �
➜ � � � � � � ist eine Container-Klasse aus der Java Bibliothek, die
dynamisch wachsende Arrays implementiert
➜ Verwendung auch als Liste möglich (z. B. Methode� � � #$ )
➜ Elemente von � � � � � � besitzen den Typ � � ��� � � , da Java keine
Templates kennt
➜ Queues bzw. doppelt verkettete Listen: �� � � � �� � �
➜ Stacks: % � � � � �
➜ Assoziative Arrays: � � � �� � �
➜ Mengen: � � � � %� �
CONTAINER-KLASSEN DES JAVA-API 51
GUI-PROGRAMMIERUNG MIT JAVA-SWING� � � � ��� �
� � � � � �� � � � � � �� � � � !
� � � � � �� � �� � � � � !
� � � � � �� � �� � � � � � � � � � !
�� � � � �� � � � � � � �
� � � � �� � � � � � � � � � �� �� � � �� � �� � � � � � �
� � � � � � � � � � � � � � � � � � � � � �� � � � �� � � � �� ��� � � � � � � !
� � � � � �� � � � �� � � � � �� � � � � �� � � � �� � � � � � � � � � � � �
�� � � � � � � � �� � � � � � � � �� � � � �� � � � � � � � � � �
� � �� � � � �� �� � � � !
"
" � !
� � � � � � � � � � � � � � � � � � � � � � �� � � �� � � � � �� �� � �� � � � � � � � � � � !
� � � � � � � � � � � � � � � � � � � � ! � � � � � � � � � � � � � � � � � � � � � � � !
� � � � � � � � � � � � � � � �� �� � � !
"
"
GUI-PROGRAMMIERUNG MIT JAVA-SWING 52
➜ 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
➜ Hinzufügen eines Textfeldes ( � � � � � � ) mittels� � � # � � �$
➜ Entweder Größe mittels �� � %� � � # $ setzen oder benötigte Größeermitteln lassen ( � � � � #$ )
➜ Schließlich Fenster mittels �� � �� �� � �� # � � �$ anzeigen
GUI-PROGRAMMIERUNG MIT JAVA-SWING 53
ZUSAMMENFASSUNG: 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 Drit-tel langsamer (anwendungsab-hängig)
Präprozessor echtes Modulkonzept
Templates noch nicht – für Java SDK 1.5geplant
Mehrfachvererbung bei Klas-sen
–
ZUSAMMENFASSUNG: C++ VS. JAVA 54
C++ Java
– Schnittstellen und dadurchvolles „Information Hiding“ undTyp-Mehrfachvererbung
unsichere Zeiger typsichere Zeiger
leicht Speicherlecks möglich automatische Speicherverwal-tung
Überladen von Operatoren –
– anonyme Klassen
– große Standardbibliothek
– Persistenz integriert
– Threads mit Synchronisation
ZUSAMMENFASSUNG: C++ VS. JAVA 55
C++ Java
– „Reflection“
– automatische erzeugte HTML-Dokumentation (javadoc)
ZUSAMMENFASSUNG: C++ VS. JAVA 56