Kurzeinführung in Java für C++- · PDF fileLITERATUR David Flanagan: Java Examples...

Preview:

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

Recommended