objektorientierte programmierung in javawg/lehre/vorlesung-ss2009/... · vorlesung an der...
TRANSCRIPT
Objektorientierte Programmierungin Java
Vorlesung an der Fachhochschule KielVorlesung an der Fachhochschule KielSommersemester 2009
PD Dr. Wolfgang Goerigk
Dr. Wolfgang Goerigk
b+m Informatik AGRotenhofer Weg 20, 24109 [email protected]@informatik.uni-kiel.de
Organisatorisches
04340 – 404 14230160 – 474 3558
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 2
Organisatorisches
Labore: Freitag, (1) 8-10 und (2) 10-12
• Gebäude 12, Raum 2.70
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 3
• Teilnehmerlisten
• Laboreinteilung
• Zeiten und Räume
– Vorlesung: Montags 08:00 Uhr – 09:30 (Geb. 8, Hörsaal 4)
Organisatorisches
– Labor 1: Freitags 08:00 – 09:30 Uhr (Geb. 12, Raum 2.70)
– Labor 2: Freitags 10:00 – 11:30 Uhr (Geb. 12, Raum 2.70)
• Homepage:– http://www.informatik.uni-kiel.de/~wg/Lehre/Vorlesung-SS2009/oop-java-SS2009.html
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 4
• Einleitung und Begriffliches
• Grundbegriffe objektorientierter Programmierung
• Java als Programmiersprache (imperativ, objektorientiert)
• Objekte, Klassen, Methoden
• Packages und Dateien
Übersicht
• Packages und Dateien
• Beziehungen, Vererbung, Typen, Polymorphie
• Abstrakte Klassen, Schnittstellen
• GUI-Programmierung (SWT, Java Swing)
• Objektorientierte Analyse, Design
• Modellgetriebene Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 5
Literatur
• Java– David Flanagan: Java in a Nutshell.
5. Auflage, O‘Reilly, 2005 …
• Entwurfsmuster– E. Gamma et al. Entwurfsmuster. Addison-Wesley Verlag, 1996.– F. Buschmann et al. Pattern-orientierte Software-Architektur. Addison-
Wesley Verlag, 1998.Wesley Verlag, 1998.
• Modellgetriebene Softwareentwicklung:– Thomas Stahl, Markus Völter, Sven Efftinge, Arno Haase:
Modellgetriebene Softwareentwicklung – Techniken, Engineering, Management (2. aktualisierte und erweiterte Auflage). Dpunkt Verlag, Heidelberg, Mai 2007
weitere Literatur jeweils zu den einzelnen Kapitelnonline auch unter � http://www.informatik.uni-kiel.de/~wg/
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 6
Literatur (Internet, Java)
Dokumentationen und Spezifikationen– Java Development Kit (JDK) Documentation
http://java.sun.com/j2se/1.4.2/docs/index.html
– Java API Specificationhttp://java.sun.com/j2se/1.4.2/docs/api/index.html
– Java-Tutorialhttp://java.sun.com/docs/books/tutorial/
Weitere Bücher– Hubert Partl: Java-Einführung
http://www.boku.ac.at/javaeinf/
– K. Arnold, J. Gosling: The Java Programming Language. Addison Wesley, 2nd Edition, 1998.
– J. Gosling, B. Joy, G. Steele: The Java Language Specification. Addison-Wesley 1996. 2nd edition: 2000
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 7
Einleitung und Begriffliches
Einleitung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 8
Einleitung
Objektorientierte Programmierung (OOP)
Methode zur effizienten Software-Entwicklung für große Systeme wie z.B.
– industrielle Software– industrielle Software
– Forschungssoftware
OOP ist eine geeignete Methode zur Beherrschung von Software-Komplexität
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 9
Einleitung
Eigenschaften großer Software-Systeme:
• Viele Entwickler
• Lange Lebensdauer (Entwickler sind z.T. nicht mehr da)
• Große Komplexität• Große Komplexität
– Verständnis aller Details ist für „normalen“ Entwickler praktisch unmöglich
– Es gibt zu wenige Genies unter den Softwareentwicklern
– Wir brauchen eine Methode zum Umgang mit Komplexität
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 10
Einleitung
• Software-Komplexität ist inhärent und hat vor allem folgende Ursachen
– Komplexität des gegebenen Problems– Komplexität des gegebenen Problems
– Schwierigkeiten beim Management des Entwicklungsprozesses
– Software-Flexibilität
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 11
Einleitung und Begriffliches
• Programmiersprachen
– Sind formale Sprachen mit festgelegter Syntax und Semantik, die für Maschinen verständlich sind.
– Ermöglichen die formale Beschreibung vonProblemlösungsverfahren, die auf einem Computer oder Problemlösungsverfahren, die auf einem Computer oder Computersystemen ausführbar sind.
– Bilden die Basis zur Entwicklung von Software und Betriebssystemen.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 12
Einleitung und Begriffliches
• Syntax, Semantik, Pragmatik
– Eine Sprache besteht beinhaltet ein Alphabet (von Zeichen).
– Die Wörter einer Sprache werden durch (formale) Regeln – der Grammatik - gebildet.
– Die Grammatik für Programmiersprachen wird Syntax genannt.
– Die inhaltliche Bedeutung wird durch die Semantik ausgedrückt.
– Die Pragmatik einer Sprache beschreibt, wie die Konstrukte einer Sprache sinnvoll eingesetzt werden.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 13
Einleitung und Begriffliches
• Algorithmus
– Der klassische Algorithmusbegriff abstrahiert von Rechnern und Programmiersprachen.
– Ein Algorithmus ist eine Vorschrift zur Lösung einer Klasse gleichartiger Probleme, bestehend aus effektiv ausführbaren gleichartiger Probleme, bestehend aus effektiv ausführbaren Einzelschritten.
– Beispiele: Euklidischer Algorithmus, Such- und Sortieralgorithmen,
etc.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 14
Einleitung und Begriffliches
• Programme
– Um dem Rechner einen Algorithmus verständlich mitzuteilen, muss man diesen für ihn verständlich als Programm formulieren.
– Ein Programm ist in einer Programmiersprache verfasst und ist eine Folge von Arbeitsanweisungen für den Rechner.Folge von Arbeitsanweisungen für den Rechner.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 15
Einleitung und Begriffliches
• Programmiersprachen:– formale Beschreibung von Problemlösungsverfahren, die auf einem
Computer oder Computersystemen ausführbar sind.
– Bilden die Basis zur Entwicklung von Software und Betriebssystemen.
• Programmentwicklung erfordert im Allgemeinen mindestens ein zweistufiges Vorgehen:
– Entwurfsphase: Formulierung eines abstrakten Problemlösungsverfahrens in Form eines Algorithmus
– Codierungsphase: Transformation des Algorithmus in einProgramm; dabei Verwendung von Kontrollstrukturen undDatentypen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 16
Klassifikation von Programmiersprachen
• historisch nach Generationen
– 1. Generation – Maschinensprache – Befehle der Sprache
– entsprechen direkt dem von der Maschine ausführbaren Code, binäre Kodierung
– 2. Generation – Assemblersprachen, ähnlich Maschinensprachen, aber Einführung verständlicherer Bezeichner für Befehlstypen
– 3. Generation – prozedurale Sprachen, die kompiliert oder interpretiert werden, Programm als Anweisungsfolge
– 4. Generation – nicht-prozedurale Sprachen– 4. Generation – nicht-prozedurale Sprachen
• systematisch nach Programmierparadigmen (s. u.)
• nach zentralen Konzepten:– Anweisung → Funktion → Modul → Objekt → Framework,
– Entwurfsmuster, Component Ware
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 17
Programmierparadigmen
Programmierparadigmen beschreiben grundsätzliche Konzepte oder Problemlösungsstrategien die einer Sprache zugrunde liegen.
• Etwa 1970: strukturierte (prozedurale) Programmierung (Pascal, C)– Stepwise refinement: Problem wird in kleine, leichter lösbare Probleme zerlegt und die
Teillösungen werden zu einer Gesamtlösung zusammengesetzt (Top-Down-Ansatz)
– Für kleinere Probleme gut geeignet („Programmieren im Kleinen“)
– Weniger geeignet für größere Softwareprojekte– Weniger geeignet für größere Softwareprojekte
• Ab etwa 1980: Objektorientiertes Programmieren (Smalltalk, C++, Java, C#)– Entwicklung allgemein wiederverwendbarer und anpassbarer Softwarebibliotheken
– Entwurf und die Pflege größere Softwareprojekte
• Andere Beispiele für Programmierparadigmen:– Funktionale Programmierung (Lisp, Haskell), Lambda-Kalkül, seit 1958
– Deklarative Programmierung (Prolog). Meist zur Logikprogrammierung verwendet, ca. 1970
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 18
Einige höhere Programmiersprachen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 19
Entwicklung der Programmiersprachen
1950
1955
1960
1965
1970
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
1970
1975
1980
1985
1995
2000
20
Programmier-Vorkenntnisse
Maschinennahe SprachenAssembler
Imperative SprachenBasicPascalCAda, Modula 2
Objektorientierte Sprachen
SkriptsprachenPHPPerl / PythonVBScript / JavaScript
Shell-Programmierung (Unix)
Anwendungsspezifische SprachenCNC-Steuerungen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objektorientierte SprachenC++SmalltalkC#Java
Deklarative / Funktionale SprachenLispProlog
CNC-Steuerungen
PL/SQL
AutorensystemeMacromedia DirectorAdobe Flash
Keine
21
• Fragestellung:– Wie komme ich vom Problem zur Lösung?
• oder spezieller:
Phasen des Softwareentwicklungs-Prozesses
• oder spezieller:– Welche Phasen muss ich durchlaufen, um
vom Problem zum Programm zu kommen?
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 22
• Dokumentation beschreibt:– Welche generellen Leistungen soll das
System erbringen?
Phasen des Softwareentwicklungs-Prozesses
System erbringen?
– Was soll das System im Einzelnen leisten?
– Wie funktioniert das System?
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 23
Softwarelebenszyklus
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 24
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 25
Was ist das Problem, was soll die Anwendung leisten (Funktion, Dienst) ?
• Machbarkeitsstudie, technische, personelle, ökonomische Durchführbarkeit
• Anforderungsanalyse (requirements engineering)
Lebenszyklus: Analyse
• Anforderungsanalyse (requirements engineering)Identifikation und Dokumentation der exakten Anforderungen an das SystemResultat: Anforderungsspezifikation(requirements specification, Analyse-Modell)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 26
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 27
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 28
Wie soll das Problem gelöst, wie soll die Funktion erfüllt werden ?
• Systemarchitekturentwurf (architectural design), Aufbau in Module, Modulstruktur, Objekte und ihre Beziehungen (ER-Diagramme, UML-Diagramme)
Lebenszyklus: Entwurf (Design)
Diagramme)
• Feinentwurf der Modulspezifikationenauch Referenzimplementierungen der architekturbezogenen ModuleResultat: Designformale Spezifikation (auch Design-Modell)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 29
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 30
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 31
Produktion des Programmcodes (Quellcode)
• Programmieren der Module
• auch Generieren von Programmcode, Montieren von Komponenten, Instantiieren von Schemata (templates)
Lebenszyklus: Implementierung
Instantiieren von Schemata (templates)
Resultat: Implementierung, Programm
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 32
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 33
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 34
Produktion des Maschinencodes in der Anwendungsumgebung
• Kompilieren der Module, Binden, Laden
• Portieren auf die Zielplattform
• Einbetten in vorhandene Systemhardware oder –software
• Integration mit vorhandenen Komponenten
Lebenszyklus: Integration
• Resultat: Soft- und Hardware als softwarebasiertes System
– Implementierung in ablauffähigem Maschinencode
– Systemtest, Verifikation der Implementierung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 35
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 36
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 37
Auslieferung und Wartung des Produkts beim Kunden
• Integration des Systems in technische und/oder organisatorische Anwendungsumgebung beim Kunden
• Resultat: das eigentliche System
Lebenszyklus: Installation und Wartung
– Abnahmetests, Freigabe, Schulungen, Wartung ...
– Wartung: alle Maßnahmen und Änderungen am System nach dessen Erstauslieferung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 38
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 39
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 40
Phasen und Resultate objektorientiert
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 41
Entwicklungswerkzeuge
• TexteditorEin Texteditor ist ein Programm zum Erstellen, Lesen und Ändern von Dateien, die Texte aller Art (beispielsweise Quellprogramme) enthalten
• Entwicklungsumgebung (IDE)Eine Entwicklungsumgebung stellt Werkzeuge zur Verfügung, die für die Erstellung von Computerprogrammen benötigt werden.Hierzu zählen: Texteditor, Werkzeuge zur Übersetzung und Werkzeuge zur Fehlerbehebung.zur Fehlerbehebung.
• CompilerEin Compiler ist ein Übersetzungsprogramm, das ein in einer höheren Programmiersprache abgefasstes Quellprogramm in eine andere Sprache, z.B. Maschinensprache, übersetzt.
• Weitere EntwicklungssoftwareBinder, Lader, Interpreter, Debugger
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 42
Entwicklungswerkzeuge
• Modellierungswerkzeug (z.B. UML)Erstellen von (häufig graphischen) Modellen, z.B. für Anforderungsanalyse und Design. Anwendungsfälle, Prozesse (Abläufe), Klassendiagramme, Komponentendiagramme etc.
• TestwerkzeugeUnterstützung von Testprozessen, z.B. Unit-Tests, Integrationstests, Testautomation, Teststeuerung, Integrationstests, Testautomation, Teststeuerung, Testdokumentation
• BetriebsunterstützungSoftwaremonitore, Profiling, dynamische Lastverteilung, Fehlertoleranz und Ausfallsicherheit
• u.v.a.m.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 43
• Compiler:
Überführen des in einer höherenProgrammiersprache formuliertenProgramms (Algorithmus) in eine
Programmübersetzung: Compiler
Programms (Algorithmus) in eineandere Sprache, z.B. eineMaschinensprache
Phasen der Codeerzeugung:
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 44
Programmübersetzung: Compiler-Phasen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 45
Programmübersetzung: Binden und Laden
Binder und Lader:
• Zusammenfassen verschiedener Maschinencode-Fragmente (mit relativen Adressen) zu einem ausführbaren Programm (z.B. Code aus Bibliotheken und eigener Code)
• Umwandeln relativer in absolute Adressen und Laden des Programms an eine geeignete Stelle im Hauptspeicher an eine geeignete Stelle im Hauptspeicher
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 46
Programmausführung: Interpreter
• Ein Interpreter analysiert wie ein Compiler den Quelltext, führt aber keine vollständige Übersetzung in Maschinensprache durch, sondern führt das Programm aus
– Programmtext wird entweder unmittelbar ausgeführt oder
– in einen Zwischencode übersetzt, der den Programmtext – in einen Zwischencode übersetzt, der den Programmtext interpretiert.
• Beispiele
– Perl, Basic, Skriptsprachen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 47
Programmausführung von Java-Programmen:
• Compiler erzeugt Bytecode
– plattformunabhängiges Code-Format
– kann auch über das Netz transportiert werden
Java-Programm
Java-Compiler
Java-Bytecode
übersetzt
prog.java
prog.class
• JVM interpretiert Bytecode
– auf verschiedenen Plattformen (Windows, Linux, PDA, Handy, …)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
JVM1
JVM2
JVM3interpretiert
% java prog arg1 arg2 …
48
Grundbegriffe objektorientierter Programmierung
• Objektorientierte Programmierung
• Erste Java-Programme
• Java als Programmiersprache• Java als Programmiersprache
• Imperativ, objektorientiert
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 49
Objektorientierte Programmierung (OOP)
• Ziele
– Verkürzung der Entwicklungszeit
– Senkung der Fehlerrate (Verbesserung der Qualität)
– verbesserte Erweiterbarkeit und Anpassungsfähigkeit
• Hauptmerkmale
– Kapselung• genau definierte Schnittstellen
• Verbergen von Implementierungsdetails
– Vererbung• einfache Modifikation und Erweiterung von bereits vorhandenen Komponenten
– Nachrichtenaustausch und Polymorphie• gleichartige Funktionalität für verschiedene Datentypen
• Datentypabhängige Bedeutung von Operatoren und Funktionen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 50
Ein erstes Java-Programm und seine Bestandteile
public class HelloWorld {
public static void main(String[] args) {
Speaker sprecher;
sprecher = new Speaker();
sprecher.say("Hello, " + args[0]);
}
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
}
class Speaker {
public void say(String what) {
System.out.println(what);
}
}
51
Ein erstes Java-Programm und seine Bestandteile
• class– Definieren einer Klasse
• new– Anlegen eines Objektes
(Instanzierung einer Klasse)
• public– bestimmt die Sichtbarkeit
• main– sog. Klassenmethode (auch: statische Methode, static)
public class HelloWorld {
public static void main(String[] args) {
Speaker sprecher;
sprecher = new Speaker();
sprecher.say("Hello, " + args[0]);
}
}
class Speaker {
public void say(String what) {
System.out.println(what);
}
}
– sog. Klassenmethode (auch: statische Methode, static)
– benötigt keine Instanzierung der Klasse, um ausführbar zu sein
• Zugriff auf Methoden (und Attribute) fremder Objekte:– <Objekt>.<Methodenname> (<arg1>, …, <argn>)
– <Objekt>.<Attributname>
– Beispiele: sprecher.say("Hello, " + args[0]) oder System.out
Dateiname = Name der Hauptklasse: HelloWorld.java
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 52
Wir beschreiben die Programmbestandteile, indem wir angeben,
Ein erstes Java-Programm und seine Bestandteile
• welche Wörter (Bestandteile) zum Schreibenvon Java-Programmen existieren,
• wie sie zusammengesetzt werden können,Syntax
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• welche Bedeutung diese haben, und Semantik
• wie und wozu sie sinnvoll eingesetzt werden Pragmatik
53
Java-Programmbestandteile: eine kleine Übersicht
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 54
Die Programmiersprache Java: Der imperative Kern
• Der imperative Kern
• Ausdrücke, Anweisungen, Kontrollstrukturen• Ausdrücke, Anweisungen, Kontrollstrukturen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 55
Zeichensatz Quellcode– 16-Bit-Zeichensatz: Unicode
Bezeichner– Groß- und Kleinschreibung ist signifikant
– Erstes Zeichen muss Buchstabe, $ oder _ sein
Schlüsselwörter – sind reservierte Wörter und dürfen nicht für eigene Bezeichner verwendet werden
Grundlegende Sprachelemente
Operatoren– Zusammengesetzte Ausdrücke sind durch Operatoren verbunden.
Literale (Konstanten)– 12, -123.45, true, "string", ‘c‘
Kommentare– vom Compiler ignoriert, /* <comment> */ oder Zeilen, die mit // beginnen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 56
• Orientiert an C, einfache Variante von C++, imperativer Kern
• Einfache Datentypenbyte, short, int, long, boolean, char, float,
double
• Operatoren
Einfache Datentypen und Operatoren
•==, !=, <, <=, >, >=,
+, -, *, /
% (Modulo)++, -- (Autoinkrement, -Dekrement)&, | (bitweise UND, ODER auf Ganzzahlen)!, &&, ||, ^ (logisch auf boolschen Operanden)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 57
Einfache Datentypen und Standardwerte (default values)
• Einfache Datentypenbyte, short, int, long, boolean, char, float, double
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 58
Einfache Datentypen und initiale Werte
• Einfache Datentypenbyte, short, int, long, boolean, char, float, double
• Implizite TypumwandlungAuswertung eines Ausdrucks liefert Typ B, aber Typ A wird erwartet(implizite) Typanpassung wird versucht (entlang der Pfeile)
float g = 2 / 5; // g = 0.0, d.h. zuerst die Division
float h = 2 / 5.0; // h = 0.4
float j = 2F / 5; // j = 0.4
double float long int short byte
char
59Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Operatoren und ihre Präzedenzen
Prio. Beschreibung Bezeichnung
1 Primary (Ausdruck) Literale Methodenaufrufe
Arrayzugriffe new this
1 Pre/Postfix ++ -- + - (unär)
1 Unär ~ ! cast-Ausdrücke (Typ)
2 Multiplikativ * / %
3 Additiv + - (binär)
4 Shift << >> >>>
5 Relational < > <= >= instanceof
6 (Un)Gleichheit == !=
60Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
6 (Un)Gleichheit == !=
7 Und &
8 Exklusiv-Oder ^
9 Oder |
10 Logisches Und &&
11 Logisches Oder ||
12 Conditional ? :
13 Assignment =
14 Assignment-Op. *= /= %= += -= <<= >>= >>>= &= ^= |=
� Java ist auch eine Insel
Dokumentationen und Spezifikationen
– Java Development Kit (JDK) Documentation
– Java API Specification
– Java-Tutorial
Literatur (Internet, Java)
– Java-Tutorial
– Christian Ullenboom: Java ist auch eine Insel https://rz-static.uni-hohenheim.de/anw/programme/prg/java/tutorials/javainsel4/
61Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Beispiele für Ausdrücke
Deklarationen mit Initialisierung
int i = 10;
int j = 15;
Beispiele für Ausdrücke
62Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Beispiele für Ausdrücke
– i+j
– i++
– i & j
– i | j
Variablendeklarationen
[<Sichtbarkeit>] [static] <Typ>
<Name1> [= <Init1>]
[ , <Name2> [= <Init2>], … ]
Der imperative Kern
Beispiele:
int i = 10;
public static String Hello = “Hello World !“;
boolean flag = true;
int i, j=10,k, l=2*j;
63Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Zuweisungen
<Variable> = <Ausdruck>;
Beispiele:
Der imperative Kern
x = 1;
y = 2;
Zuweisungen sind auch Ausdrücke:
x = y = 1; entspricht x = (y = 1);
64Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Blöcke
Sequenzen von Anweisungen und Deklarationen in
{ … }
Beispiel
Imperativer Kern - Kontrollstrukturen
Beispiel
{ int i = 10;
i = 2*i;
int j;
j = i+i;
}
65Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Bedingte Anweisungen
Sequenzen von Anweisungen und Deklarationen in
if (<Bedingung>) {
<Konsequenz>
}
[ else {
Imperativer Kern - Kontrollstrukturen
[ else {
<Alternative>
} ]
Beispiel
if ( a < b ) { x = a; } else { x = b;}
66Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Endliche Fallunterscheidung (Switch)
switch (<Ausdruck>) {
case c1 : <Anweisung1>
.
.
Imperativer Kern - Kontrollstrukturen
.
.
cn : <Anweisungn>
[ default : <Anweisung> ]
}
Spezielle Anweisung: break;
67Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Endliche Fallunterscheidung (Switch)
Beispiel:
int x = 2, j;
switch (x) {
case 1: j=10;
case 2: j=20;
Imperativer Kern - Kontrollstrukturen
case 2: j=20;
case 3: { j=25;
break;
}
case 4: j=0;
default: j++;
}
68Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Imperativer Kern - Kontrollstrukturen
Schleifen (while, do, for)
while (<Bedingung>) { <Anweisungen> }
do
{ <Anweisungen> }
while (<Bedingung>)
69Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
while (<Bedingung>)
for (<Init>; [<Bedingung>;] <Abschluss>)
<Anweisungen>
Beispielfor (i=0; i<10; i++) { x = x+i; }
Imperativer Kern
Die Fakultät in Java
public class Fakultaet {
static int fac (int n) {
if (n==0)
return 1;
70Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
return 1;
else
return n*fac(n-1);
}
public static void main (String[] argv) {
System.out.println ( fac(6) );
}
}
Java als Programmiersprache
Objektorientierung (Klassen, Objekte, Methoden, Vererbung)
71Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objektorientierung (Klassen, Objekte, Methoden, Vererbung)
Java als Programmiersprache
Objektorientierung (Klassen, Objekte, Methoden, Vererbung)
72Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objektorientierung (Klassen, Objekte, Methoden, Vererbung)
Kapselung (engl. encapsulation)Vererbung (engl. inheritance, Struktursicht, Typsicht)Nachrichtenaustausch (engl. message passing)
Klassen sind Datentypen (zeigerreferenzierte Recordtypen)
– entsprechen etwa zeigerreferenzierten Records in Modula 2
– legen die Struktur (Instanzvariablen, erlaubte Operationen)ihrer Instanzen (Objekte) fest
– können Komponenten einer anderen Klasse erben
Klassen und Objekte
– können Komponenten einer anderen Klasse erben
– kapseln Funktionalität etwa durch Deklaration von Sichtbarkeiten
class Circle {
float x, y, r; // Mittelpunkt (x,y) und Radius
}
73Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objekte sind Daten (Instanzen einer Klasse)
– entsprechen etwa zeigerreferenzierten Records in Modula 2
– werden i.a. dynamisch erzeugt (zur Laufzeit) new Circle();
– Haben eine Identität (Unterschied zu Tabellen in Datenbanken)
Klassen und Objekte
class Circle {
float x, y, r; // Mittelpunkt (x,y) und Radius r
}
Circle c;
c = new Circle(); // erzeugt ein Objekt der Klasse Circle
// und weist es der Variablen c zu
74Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objekte sind Daten (zeigerreferenzierte Records)
Objekte (Instanzen)
0100
0104
0108
Speicher
0100
Circle
x = 0.0
y = 0.0
new Circle()erzeugt
75Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
0108
010C
0110
0114
0118
011C
0110
Circle
y = 0.0
r = 0.0
X = 0.0
Y = 0.0
Z = 0.0
nocheinmal new Circle()
Methoden entsprechen Prozeduren / Funktionen
– werden durch Nachrichten aufgerufen:
objekt.methodenname(arg1, …, argn)
entspricht (im Prinzip, beachte Methodenauswahl, late binding)
methodenname(objekt, arg , …, arg )
Methoden
methodenname(objekt, arg1, …, argn)
– Methoden heissen auch (Objekt)Methoden
– Statische Methoden (static) heissen auch Klassenmethoden
– Das Empfängerobjekt einer Nachricht (objekt) wird im Rumpf der Methode als this bezeichnet
76Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Methodendeklarationen (in Klassen)
[<Sichtbarkeit>] [static] <Typ> <Name>
(<Parameter>) { <Rumpf>}
Beispiel:
Methoden
public class Circle {
…public double umfang () {
return 2*3.14159 * this.r;
}
}
77Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
(Objekt-) Methoden
– werden durch Nachrichten aufgerufen:
– Beispiel:
c.x = 2.0;
Methodenaufruf (Nachricht)
c.x = 2.0;
c.y = 3.0;
c.r = 1.0;
double x = c.umfang();
78Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Instanzen von Klassen (Objekte) werden durch Konstruktoraufrufe erzeugt, z.B. durch
new Circle(2.0, 3.0, 1.0);
– Methoden, die keinen Resultattyp und denselben Namen haben wie die Klasse, sind Konstruktormethoden
Objekterzeugung (Konstruktoren)
– Beispiel:
public Circle ( float x, y, r ) {
this.x = x;
this.y = y;
this.r = r;
}
79Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objekte sind Daten (zeigerreferenzierte Records)
Objekte (Instanzen)
0100
0104
0108
Speicher
0100
Circle
float x = 2.0
float y = 3.0
new Circle(2.0,3.0,1.0)erzeugt
80Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
0108
010C
0110
0114
0118
011C
float y = 3.0
float r = 1.0
In Java sind zwei Methoden verschieden, wenn sie
• verschiedene Namen oder
• gleiche Namen und
verschiedene Signaturen haben, d.h. Anzahl, Reihenfolgeoder Typen der Parameter verschieden sind
Beispiel: (hier: Konstruktormethoden):
Überladung
Beispiel: (hier: Konstruktormethoden):
public Circle ( float r ) {
this.x = 0.0; this.y = 0.0; this.r = r; }
public Circle ( Circle c ) {
this.x = c.x; this.y = c.y; this.r = c.r; }
81Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
In Java sind zwei Methoden gleich, wenn sie
• den gleichen Namen und
• die gleiche Signatur haben, d.h. Anzahl, Reihenfolgeund Typen der Parameter gleich sind
Beispiel: (hier: Konstruktormethoden):
Überladung
public double umfang () {
return 2 * Math.PI * r;
}
public double umfang () {
return Math.PI * ((r + s) * 3 / 2
- Math.sqrt(r * s));
82Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
– Statische Methoden sind gewöhnliche Funktionen oderProzeduren (Schlüsselwort static)
– Statische Instanzvariablen sind globale Variablen. Sind sie zusätzlich final deklariert, wirken sie wie Konstanten
– Beispiele:
Statische Komponenten
public static int fac ( int n ) { … }
public final static double PI = 3.14159;
83Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public class Circle {
static int num_circles = 0;
float x,y,r;
public Circle (float x, float y, float z) {
this.x = x; this.y = y; this.r = z;
num_circles++ // zählt Anzahl der Instanziierungen
}
Statische Variablen (Beispiel)
}
public Circle () {
this (0.0, 0.0, 1.0);
}
}
Zugriff auf statische Variablen (Klassenvariablen):
Circle.num_circles
84Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class B extends A {
…
}
Vererbung
A
B
– B erweitert (spezialisiert) A
– B heisst Subklasse von A, A heisst Superklasse von B
– Klasse B erbt alle Komponenten (Attribute, Methoden) von A
– jedes B ist auch ein A, B ist Subtyp von A
85Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class B extends A {
…
}
Vererbung (Struktursicht, Typsicht)
A
B
Struktursicht:B erbt alle Komponenten (Attribute, Methoden) von A
Typsicht:B ist Subtyp von A, jedes B ist auch ein A
86Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class B extends A {
…
}
Vererbung (Typsicht, Typ-/Subtyp-Beziehung)
A
B
– jedes B ist auch ein A, B ist Subtyp von A
– überall dort, wo Instanzen des Typs A erwartet werden, dürfen auch Instanzen des Typs B auftauchen
87Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public class GraphicCircle extends Circle {
Color fill, outline;
public void draw (Graphics g) {
g.setColor(outline);
g.drawOval(x-r, y-r, 2*r, 2*r);
Vererbung - Beispiel
g.drawOval(x-r, y-r, 2*r, 2*r);
g.setColor(fill);
g.fillOval(x-r, y-r, 2*r, 2*r);
}
}
– Beteiligte Packages: java.awt.Color, java.awt.Graphics
88Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Die Methoden drawOval(…) und fillOval(…) in Java 1.5 erwarten Integer-Argumente (Anzahl Pixel) anstatt float.
Objekte sind Daten (zeigerreferenzierte Records)
Klasse GraphicsCircle erbt die Komponenten von Circle
Objekte (Instanzen), Vererbung von Attributen
0100
0104
Speicher
0100
GraphicsCircle
float x = 0.0
new GraphicsCircle()
erzeugt
89Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
0104
0108
010C
0110
0114
0118
011C
0100
Color fill =
float x = 0.0
float y = 0.0
float r = 0.0
Color outline =
public class Circle
extends Ellipse {
double r;
public double umfang () {
return 2 * Math.PI * r;
}
Vererbung – Überdecken von Attributen
}
}
– Kreise haben sowohl ein double rals auch das float r aus Ellipse
90Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objekte sind Daten (zeigerreferenzierte Records)
Klasse Circle erbt alle Komponenten von Ellipse
Objekte (Instanzen), Überdecken von Attributen
0100
0104
Speicher
0100
Circle
float x = 0.0
new Circle()erzeugt
91Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
0104
0108
010C
0110
0114
0118
011C
float r2 = 0.0
float x = 0.0
float y = 0.0
float r = 0.0
double r = 0.0
public class Ellipse {
float x, y, r, r2;
public double umfang () {
return Math.PI
* ((this.r + this.r2) * 3 / 2
Vererbung – Überschreiben von Methoden
- Math.sqrt(this.r * this.r2));
}
}
– Dynamische Bindung (late binding)
– xxx.umfang() für Instanzen von Ellipse
– xxx.umfang() für Instanzen von Circle
92Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public class Ellipse {
float x, y, r, r2;
public double umfang () {
return Math.PI
* ((r + r2) * 3 / 2
Vererbung – Überschreiben von Methoden
- Math.sqrt(r * r2));
}
}
– Dynamische Bindung (late binding)
– xxx.umfang() für Instanzen von Ellipse
– xxx.umfang() für Instanzen von Circle
93Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public class Circle extends Ellipse {
double r;
public double umfang () {
return 2 * Math.PI * r;
}
Vererbung – Überschreiben von Methoden
}
– Dynamische Bindung (late binding)
– xxx.umfang() für Instanzen von Ellipse
– xxx.umfang() für Instanzen von Circle
94Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public double umfang () {
return Math.PI * ((r + s) * 3 / 2
- Math.sqrt(r * s));
public double umfang () {
return 2 * Math.PI * r;
}
Vererbung – Dynamische Bindung (late binding)
Ellipse e = new Ellipse();
Circle c = new Circle();
… e.umfang() …
… c.umfang() …
95Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Der Typ des Nachrichtenempfängers
entscheidet, welche Methode aufgerufen
wird.
Vererbung – Dynamische Bindung (late binding)
!
Ellipse e = new Ellipse();
Circle c = new Circle();
… e.umfang() …
… c.umfang() …
96Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class B extends A {
…
}
Vererbung (Typ-Subtyp-Beziehung)
A
B
– jedes B ist auch ein A, B ist Subtyp von A
– überall, wo ein A erwartet wird, darf auch ein B auftauchen
97Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class Circle extends Ellipse {
…
}
Vererbung (Typ-Subtyp-Beziehung)
– jeder Kreis ist auch eine Ellipse,Circle ist Subtyp von Ellipse
– überall, wo eine Ellipse erwartet wird, darf auch ein Kreis auftauchen
98Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Ellipse e;
Circle c;
if (das_Wetter_ist_schoen())
e = new Ellipse();
else
e = new Circle();
Vererbung – Dynamische Bindung (late binding)
e = new Circle();
… e.umfang() …
99Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
!Methodenauswahl zur Laufzeitparametrischer Polymorphismus
class Circle extends Ellipse {
…
}
Vererbung (Typsicht)
(nur) Intuition :
U Universum aller Objekte, Ellipse Menge von Objekten, die gewisse Merkmale ihrer Instanzen verlangt (x, y, r, r2, …)
Also: Ellipse ⊆ U (alle Ellipsen sind Objekte)
Analog: Circle ⊆ U.Circle verlangt mehr Merkmale (double r) als Ellipse, ist also eine kleinere Menge von Instanzen, also Circle ⊆ Ellipse
100Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Welche Komponenten hat eine Klasse ?
Attribute (Instanzvariablen)
– alle Attribute der Superklasse (und damit aller Superklassen)
– alle eigenen (lokalen) Attribute
Vererbung (Struktursicht, Finalisieren von Klassen)
– alle eigenen (lokalen) Attribute
Methoden
– alle Methoden der Superklasse, die nicht durch eine gleiche lokale Methode (Name und Signatur) überschrieben werden
– alle lokalen Methoden
101Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Begriffliches zu Methoden
public void draw (Graphics g, Dummy z) {
MethodennameFormale Parameter
SignaturResultattyp
102Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public void draw (Graphics g, Dummy z) {
g.drawRect((int)x, (int)y, width, height);
}
Methodenrumpf
Parameterliste + Methodenrumpf = erweiterter Methodenrumpf
Vererbung (Struktursicht, Finalisieren von Klassen)
public class GraphicalElement {
Color fill, outline;
public void draw (Graphics g) {
System.out.println("cannot draw");
}
}
public class Rectangle extends GraphicalElement {
103Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
float x,y;
int width, height;
public boolean isQuadrat () {
return width == height;
}
}
Vererbung (Struktursicht, Finalisieren von Klassen)
public class GraphicalElement {
Color fill, outline;
public void draw (Graphics g) {
System.out.println("cannot draw");
}
}
public class Rectangle {
104Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Color fill, outline;
float x,y;
int width, height;
public boolean isQuadrat () {
return width == height;
}
public void draw (Graphics g) {
System.out.println("cannot draw");
}
}
Vererbung (Struktursicht, Finalisieren von Klassen)
public class Rectangle {
Color fill, outline;
float x,y;
int width, height;
public boolean isQuadrat () {
return width == height;
}
public void draw (Graphics g) {
System.out.println("cannot draw");
105Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
System.out.println("cannot draw");
}
}
public class GraphicRectangle
extends Rectangle {
public void draw (Graphics g) {
g.drawRect((int)x, (int)y,
width, height);
}
}
Vererbung (Struktursicht, Finalisieren von Klassen)
public class Rectangle {
Color fill, outline;
float x,y;
int width, height;
public boolean isQuadrat () {
return width == height;
}
public void draw (Graphics g) {
System.out.println("cannot draw");
}
}
106Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public class GraphicRectangle {
Color fill, outline;
float x,y;
int width, height;
public boolean isQuadrat () {
return width == height;
}
public void draw (Graphics g) {
g.drawRect((int)x, (int)y, width, height);
}
}
Welche Komponenten hat eine Klasse ?
Attribute (Instanzvariablen)
– alle Attribute der Superklasse (und damit aller Superklassen)
– alle eigenen (lokalen) Attribute
Vererbung (Struktursicht, Finalisieren von Klassen)
– alle eigenen (lokalen) Attribute
Methoden
– alle Methoden der Superklasse, die nicht durch eine gleiche lokale Methode (Name und Signatur) überschrieben werden
– alle lokalen Methoden
107Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Vererbung (Struktursicht, Finalisieren von Klassen)
108Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Abstrakte Klassen und Schnittstellen
Abstrakte Klassen
• Definieren Typen (nicht instanziierbare Klassen)
• Können Methoden- und Attributdefinitionen enthalten
• Methoden können abstrakt definiert werden (Methoden ohne Rumpf)
• Klassen können von abstrakten Klassen erben (Einfachvererbung)
109Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Klassen können von abstrakten Klassen erben (Einfachvererbung)
Schnittstellen (Interfaces)
• Definieren Typen
• Enthalten keine Attribute und nur Namen und Signaturen der enthaltenen Methoden
• Können von Klassen implementiert werden (Implementierungsvererbung, mehrfache Vererbung)
Abstrakte Klassen und Schnittstellen
Klassen und abstrakte Klassen
• werden vererbt (einfache Vererbung)
110Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Schnittstellen (Interfaces)
• werden implementiert (mehrfache Implementierungsvererbung)
Abstrakte Klassen und Schnittstellen
Abstrakte Klassen
public abstract class GrElement {
…
public abstract void m ( … );
…
111Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
…
}
• Definieren Typen und nicht instanziierbare Klassen
• Können Methoden- und Attributdefinitionen enthalten
• Methoden können abstrakt definiert werden (Methoden ohne Rumpf)
Vererbung von abstrakten Methoden
Wenn wir von einer Klasse abstrakte Methoden erben, so haben wir zwei Möglichkeiten:
1. Wir überschreiben alle abstrakten Methoden und implementieren sie. Dann kann die erbende Klasse instanziiert werden
112Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
2. Wir überschreiben mindestens eine abstrakte Methode nicht, so dass sie als abstrakte Methode vererbt wird. Das bedeutet, mindestens eine abstrakte Methode bleibt und die Klasse muss wiederum abstrakt sein.
Abstrakte Klassen dürfen abstrakte Methoden enthalten, instanziierbare Klassen nicht.
Abstrakte Klassen (Beispiel)
Abstrakte Klassen
public abstract class GrElement {
int x,y;
Color fill, outline;
public abstract void draw (Graphics g);
}
public class GrCircle extends GrElement {
int r;
public void draw (Graphics g) {
Abstrakte Methode
Abstrakte Klasse, nicht instanziierbar, aber gemeinsamer Supertyp von GrCircle und GrRectangle
113Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public void draw (Graphics g) {
g.drawOval(x-r, y-r, 2*r, 2*r);
}
}
public class GrRectangle extends GrElement {
int width, height;
public void draw (Graphics g) {
g.drawRect(x-width/2, y-height/2, width, height);
}
InstanziierbareSubklassen
Schnittstellen (Interfaces)
Schnittstellen
public interface DrawableElement {
public void draw ( … );
…
}
extends implements
114Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Definieren Typen
• Enthalten nur Namen und Signaturen von Methoden
• Können von Klassen implementiert werden (implements)
• Instanziierbare implementierende Klassen müssen ALLE Methoden der Schnittstelle implementieren
Schnittstellen (Interfaces)
Schnittstellen
public interface DrawableElement {
public void draw ( … );
…
}
extends implements
115Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Definieren Sichten (Rollen) von Objekten der implementierenden Klassen
• Objekte können mehrere Rollen haben (mehrere Schnittstellen implementieren
Schnittstellen (Beispiel)
Schnittstellen
public interface DrawableElement {
public void draw (Graphics g);
}
public class GrCircle implements DrawableElement {
int x, y, r;
Color fill, outline;
public void draw (Graphics g) {
Interface-Methode
Interface, keine Instanzen, aber gemeinsamer Supertyp
116Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
public void draw (Graphics g) {
g.drawOval(x-r, y-r, 2*r, 2*r);
}
}
public class GrRectangle implements DrawableElement {
int x, y, width, height;
Color fill, outline;
public void draw (Graphics g) {
g.drawRect(x-width/2, y-height/2, width, height);
}
Instanziierbareimplementierende Klassen
Schnittstellen und abstrakte Klassen (Beispiel)
Schnittstellen und abstrakte Klassen
public interface DrawableElement {
public void draw (Graphics g);
}
public abstract class GrElement {
int x, y;
Color fill, outline
}
Interface-Methode
Interface, keine Instanzen, aber gemeinsamer Supertyp
Abstrakte Superklasse, nicht instanziierbar, aber auch gemeinsamer Supertyp
117Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
}
public class GrCircle extends GrElement
implements DrawableElement {
int r;
public void draw (Graphics g) {
g.drawOval(x-r, y-r, 2*r, 2*r);
}
}
Instanziierbareimplementierende (Sub-)Klassen
Interessante Systemschnittstellen (aus java.awt.event)
ActionListenerAdjustmentListenerAWTEventListenerComponentListenerContainerListenerFocusListenerHierarchyBoundsListenerHierarchyListener
MouseListenerMouseMotionListenerMouseWheelListenerTextListenerWindowFocusListenerWindowListenerWindowStateListener
118Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
HierarchyListenerInputMethodListenerItemListenerKeyListener
Interessante Systemschnittstellen (z.B. MouseListener)
void mouseClicked(MouseEvent e)
Invoked when the mouse button has been clicked (pressed and released) on a component.
void mousePressed(MouseEvent e)
Invoked when a mouse button has been pressed on a component.
void mouseReleased(MouseEvent e)
119Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
void mouseReleased(MouseEvent e)
Invoked when a mouse button has been released on a component.
void mouseEntered(MouseEvent e)
Invoked when the mouse enters a component.
void mouseExited(MouseEvent e)
Invoked when the mouse exits a component.
Interessante Systemschnittstellen (z.B. MouseMotionListener)
void mouseDragged(MouseEvent e)
Invoked when a mouse button is pressed on a component and then dragged.
void mouseMoved(MouseEvent e)
120Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
void mouseMoved(MouseEvent e)
Invoked when the mouse cursor has been moved onto a component but no buttons have been pushed.
Beispiel: Scribble
public class Scribble extends Applet
implements MouseListener, MouseMotionListener {
private int last_x, last_y;
public void mouseClicked(MouseEvent ev) {}
public void mouseReleased(MouseEvent ev) {}
public void mouseEntered(MouseEvent ev) {}
public void mouseExited(MouseEvent ev) {}
public void mouseMoved(MouseEvent ev) {}
public void mousePressed (MouseEvent ev) {
last_x = ev.getX();
last_y = ev.getY();
}
121Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
}
public void mouseDragged (MouseEvent ev) {
int x = ev.getX();
int y = ev.getY();
this.getGraphics().drawLine (last_x, last_y, x, y);
last_x = x;
last_y = y;
}
public void start () {
addMouseListener (this);
addMouseMotionListener (this);
}
}
• Man unterscheidet– Modifikatoren für Klassen
– Modifikatoren für Attribute
– Modifikatoren für Methoden
• Funktion von Modifikatoren
Modifikatoren
– Sichtbarkeit und Zugriffsmöglichkeiten (Klassen, Methoden,
Attribute: public, protected, private)
– Kennzeichnung als abstrakt (abstract)
– Steuerung der Vererbbarkeit (final)
– Klassen- vs. Instanzbezug (static)
122Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Modifikatoren für Klassen
Modifikator Bedeutung
keiner (package) Klasse ist nur aus demselben Package sichtbar und erreichbar (ggf. aus dem Default-Package).
public Klasse ist von überall erreichbar.
abstract Klasse ist abstrakt, d.h. kann nur geerbt, aber nicht instanziert werden.
123Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
nicht instanziert werden.
final Klasse ist final, d.h. kann nicht vererbt werden. Es dürfen keine Subklassen gebildet werden.
Modifikatoren für Variablen
Modifikator Bedeutung
keiner (package) Variable ist nur innerhalb der eigenen Klasse und des Package erreichbar, zu dem sie gehört.
public Variable ist überall dort erreichbar, wo auch die Klasse erreichbar ist, zu der sie gehört.
private Variable ist nur innerhalb der eigenen Klasse erreichbar.
protected Variable ist nur innerhalb der eigenen Klasse und des
124Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
protected Variable ist nur innerhalb der eigenen Klasse und des Package erreichbar, zu dem sie gehört. Unterklassen können ebenfalls zugreifen.
final Wert der Variable ist nicht veränderbar (Konstante).
transient Inhalt der Variablen wird bei Serialisierung ignoriert (da sie flüchtig ist).
static Variable ist eine Klassenvariable, Klassenbezug
Modifikatoren für Methoden
Modifikator Bedeutung
keiner (package) Methode ist nur innerhalb der eigenen Klasse und des Package erreichbar, zu dem sie gehört.
public Methode ist von überall erreichbar.
private Methode ist nur innerhalb der eigenen Klasse erreichbar.
protected Methode ist nur innerhalb der eigenen Klasse und des Package erreichbar, zu dem sie gehört. Unterklassen können ebenfalls zugreifen.
125Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
können ebenfalls zugreifen.
abstract Methode besitzt keinen Rumpf. Dieser mussvon einer Unterklasse implementiert werden. Klasse muss ebenfalls als abstrakte Klasse definiert werden.
final Methode kann von Unterklassen nicht überschriebenwerden.
native Methode ist in einer anderen Programmierspracherealisiert. Wie bei abstract kein Methodenrumpf.
static Methode ist eine Klassenmethode, kein Instanzbezug
Client-Server-Anwendungen
• Webanwendungen (HTML-Oberflächen für Clients)• Thin Client• Smart Client• Rich Client
Client-Server-Anwendungen
Graphische Benutzeroberfläche,Unterschiedlich ausgeprägte lokale
• Rich Client• Fat Client
126Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Unterschiedlich ausgeprägte lokale Verarbeitung
Programmierung graphischer Benutzeroberflächen
Ereignisorientierung, Model-View-Control• Aktionen lösen Ereignisse aus (Control)• Ereignisse führen zur Verarbeitung der
eingegebenen Daten (Model)• Ergebnisse werden in der GUI sichtbar
gemacht (View)
127Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Typische Aktionen:
• Ein Button (Knopf) wird gedrückt• Ein Text wird in ein Textfeld eingegeben• Eine Checkbox wird angewählt• …
Graphical User Interfaces (GUIs)
Programmierung graphischer Benutzeroberflächen
• AWT (Abstract Windowing Toolkit) java.awt.*
• SWT (Standard Widget Toolkit)• Swing (Widget Toolkit, Java) javax.swing.*
128Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Swing-Dialogelemente (Beispiele)
129Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Einige Swing-Dialogelemente
JLabel
JTextField
JTextFieldnicht editierbar
JDialog
JFrame
130Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
JButtonTypischerweise sind Buttons (Knöpfe) als ActionListener registriert
Swing-Dialogelemente (Beispiele)
…
getContentPane().setLayout(null);
setPreferredSize(new java.awt.Dimension(267, 231));
setTitle("Mehrwertsteuer");
setResizable(false);
getContentPane().setBackground(
new java.awt.Color(230,230,255));
this.setFont(new java.awt.Font("Arial",0,9));
{
Nettobetrag = new JLabel();
getContentPane().add(Nettobetrag,
131Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
getContentPane().add(Nettobetrag,
new AnchorConstraint(113, 329, 238, 75,
AnchorConstraint.ANCHOR_REL,
AnchorConstraint.ANCHOR_REL,
AnchorConstraint.ANCHOR_REL,
AnchorConstraint.ANCHOR_REL));
Nettobetrag.setText("Nettobetrag");
Nettobetrag.setBounds(20, 22, 112, 25);
}
…
Swing-Dialogelemente (Beispiele)
…
{
Berechnen = new JButton();
AnchorLayout BerechnenLayout = new AnchorLayout();
Berechnen.setLayout(BerechnenLayout);
getContentPane().add(Berechnen,
new AnchorConstraint(766, 472, 871, 75,
AnchorConstraint.ANCHOR_REL,
AnchorConstraint.ANCHOR_REL,
AnchorConstraint.ANCHOR_REL,
AnchorConstraint.ANCHOR_REL));
132Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
AnchorConstraint.ANCHOR_REL));
Berechnen.setText("Berechnen");
Berechnen.setPreferredSize(
new java.awt.Dimension(108, 21));
Berechnen.setBounds(20, 152, 108, 21);
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Swing-Dialogelemente (Beispiele)
Programmierung der GUI:• Graphischer Editor
Programmierung der fachlichen Berechnungen:• Manuell
133Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Interessante Systemschnittstellen (aus java.awt.event)
ActionListenerAdjustmentListenerAWTEventListenerComponentListenerContainerListenerFocusListenerHierarchyBoundsListenerHierarchyListener
MouseListenerMouseMotionListenerMouseWheelListenerTextListenerWindowFocusListenerWindowListenerWindowStateListener
134Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
HierarchyListenerInputMethodListenerItemListenerKeyListener
Interessante Systemschnittstellen (aus java.awt.event)
ActionListenerActionListener
Interface aus java.awt.event
Zu implementierende Methoden:
135Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
void actionPerformed(ActionEvent e)
Invoked when an action occurs.
Typische actions:
• Ein Button (Knopf) wird gedrückt• Ein Text wird in ein Textfeld eingegeben• Eine Checkbox wird angewählt• …
Swing-Dialogelemente (Beispiele)
Programmierung der GUI:• Graphischer Editor
Programmierung der fachlichen Berechnungen:• Manuell
136Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Klassenschachtelung: Anonyme innere Klassen
Allgemein:
new KlasseOderSchnittstelle()
{ /* Eigenschaften der inneren Klasse */ }
137Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
entspricht
class Anonymous extends Klasse { … }
oder
class Anonymous implements Schnittstelle { … }
Klassenschachtelung: Anonyme innere Klassen
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
}
);
}
entspricht
138Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class Anonymous implements ActionsListener {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
}
BerechnenBerechnen.addActionListener(new Anonymous());
Swing-Dialogelemente (Beispiele)
Programmierung der GUI:• Graphischer Editor
Programmierung der fachlichen Berechnungen:• Manuell
139Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Eclipse GUI-Editoren
140Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
http://wiki.computerwoche.de/doku.php/programmierung/gui-builder_fuer_eclipse
Donnerstag, 16.07.2009
09:00 – 11:00 Uhr (2 Zeitstunden)
Hörsaal 1
Klausur – Termin und Ort
141Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Als die drei wesentlichen Merkmale der objektorientierten Programmierung werden Kapselung, Vererbung (Polymorphie) und Nachrichtenaustausch (message passing) bezeichnet. Charakterisieren Sie diese Merkmale und geben Sie jeweils ein Beispiel:
1. Inwiefern kapseln Klassendefinitionen Daten und Funktionen? Welche Modifikatorenkönnen für Attribute und Methoden in Klassen verwendet werden, um die Sichtbarkeit zu erlauben oder einzuschränken (Information Hiding)?
Klausur – Beispiele für Klausuraufgaben
erlauben oder einzuschränken (Information Hiding)?
2. Erklären Sie, wie sich die Vererbung (in Java extends) zwischen Subklasse und Superklasse auf die Struktur der Subklasse auswirkt. Was bedeutet es, dass die Subklasse auch Subtyp
der Superklasse ist?
3. Erklären Sie, wie Objekte (Instanzen von Klassen) Nachrichten austauschen. Was bezeichnet man als Nachricht? Wie reagiert ein Objekt auf das Senden einer Nachricht?
142Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Betrachten Sie die folgenden drei Klassendiagramme bzw. die entsprechenden Java-Klassen- und Schnittstellendefinitionen. Vererbungsbeziehungen (extends) sind durchgezogen, Implementierungsbeziehungen (implements) sind gestrichelt gezeichnet.
Klausur – Beispiele für Klausuraufgaben
• Welche der drei Diagramme beschreiben gültige (erlaubte) Vererbungs- bzw. Implementierungsbeziehungen in Java?
• Falls Fehler vorhanden sind, markieren Sie diese in den Diagrammen deutlich. Beschreiben Sie für jeden Fehler die Fehlerart
143Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class A {
int i = 1;
int m1() { return i; }
}
class B extends A {
int i = 2;
int m2() { return i; }
}
public class Test {
public static void main(String[] args) {
A x = new B();
Klausur – Beispiele für Klausuraufgaben
A x = new B();
System.out.println(x.m1());
System.out.println(x.m2());
}
}
Erläutern Sie im Detail die Zeile “A x = new B();“
1. Was ist x? Welchen Typ hat x? Welchen Wert erhält x?
2. Ist die Initialisierung von x mit dem Wert von new B() erlaubt? Begründund
3. Welche Instanzvariablen und Methoden hat die Klasse A? Welche die Klasse B?
4. Ist der Aufruf x.m2() in der dritten Zeile der main-Methode erlaubt? Begründen Sie Ihre Antwort.
144Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Gegeben sei folgende Problemstellung: Sie entwickeln eine Verwaltungssoftware für einen Waschsalon und wollen zunächst die objektorientierte Modellierung durchführen. Folgende Informationen liegen Ihnen vor:
1. Ein Waschsalon verfügt über verschiedene Geräte, darunter Waschmaschinen und Trockner. Die Geräte haben jeweils einen Betriebszustand, verfügen über mehrere Programme und können die Restlaufzeit angeben.
2. Waschmaschinen haben einen Wasch- und Weichspülmittelbehälter, dessen Füllstand ausgelesen werden kann. Trockner haben eine Knitterschutzfunktion, die aktiviert und deaktiviert werden kann.
Klausur – Beispiele für Klausuraufgaben
deaktiviert werden kann.
3. Unter den Kunden des Waschsalons gibt es Abonnenten, deren Wasch- und Trockenvorgänge über ein Abonnement abgebucht werden. Die Abonnenten verfügen über eine Kundenkarte, mit der sie die Geräte steuern können.
Entwerfen Sie in Java geeignete Klassen bzw. Schnittstellen für die obige Aufgabe. Die Klassen sollen entsprechende Attribute und Methoden enthalten.
145Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
class A {
public void sayA() { System.out.println(“A“); }}
class B {
public void sayB() { System.out.println(“B“); }}
class C {
public void sayC() { System.out.println(“C“); }
public class D {
Klausur – Beispiele für Klausuraufgaben
public static void wasBinIch (ABoderC x) {
x.wasBinIch();
}
}
Ergänzen Sie das Programm um eine Schnittstelle ABoderC und die nötigen weiteren Methoden, so dass jedes x auf die Nachricht wasBinIch() im Rumpf der Methode wasBinIch der Klasse D mit seinem richtigen Klassennamen antwortet,
also As mit “A“, Bs mit “B“ und Cs mit “C“.
146Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Gegeben seien die folgenden Ausschnitte aus zwei Java-Dateien B.java und A.java
Klausur – Beispiele für Klausuraufgaben
1. package usedemo;
2. import demo.A;3.4. public class B extends A {5.6. private int att1 = 5;7.8. public void hello() {9. System.out.println("B");10. System.out.println(att1);11. System.out.println(att2);12. System.out.println(att3);13. System.out.println(att4);
1. package demo;2. public class A {3.4. private int att1 = 1;5. int att2 = 2;6. protected int att3 = 3;7. public int att4 = 4;8.9. public void hello(){10. System.out.println("A");11. System.out.println(att1);12. System.out.println(att2);13. System.out.println(att3);14. System.out.println(att4);
1. Beim Übersetzen wird der Compiler zunächst einen oder mehrere Fehler anzeigen. Wo? Geben Sie Dateinamen und Zeilennummer und ein Begründung an.
2. Gehen Sie nun davon aus, dass alle fehlerhaften Zeilen auskommentiert sind, und geben Sie die Ausgabe der Aufrufe
new A().hello();new B().hello();
147Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
12. System.out.println(att3);13. System.out.println(att4);14. }}
13. System.out.println(att3);14. System.out.println(att4);15. }}
Aufbau graphischer Benutzeroberflächen
Benutzerschnittstellen und Ereignisverarbeitung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 148
• statische Sicht auf die Benutzerschnittstelle:
– Aufbauelemente der Benutzerschnittstellenprogrammierung
• Fensterklassen
• Controls
• Steuerung visueller Eigenschaften (Styles, Ränder, Fraben etc.)
– Layout und Anordnung von Elementen
Aufbau graphischer Benutzeroberflächen
– Layout und Anordnung von Elementen
• dynamische Sicht
– Interaktion mit der Benutzerschnittstelle
– Verarbeiten von Ereignissen (Events)
– Benutzerschnittstelle als „Scharnier“ zwischen Benutzer und „dahinter“ liegender Systemfunktionalität
149Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Aufbauelemente / Bestandteile (statische Sicht):– Fensterobjekte (Instanzen verschiedener vorgegebener und abgeleiteter
Fensterklassen)
– Controls, mit denen interagiert wird (Controls im Abstract Window Toolkit, Controls in Swing/Java Foundation Classes, Steuerelementbibliotheken weiterer Anbieter, selbst entwickelte Controls)
• Unterscheidung der Dialogelemente in– Container: können andere Controls enthalten (Behälter, z. B.
Aufbau graphischer Benutzeroberflächen
– Container: können andere Controls enthalten (Behälter, z. B.
– die Fensterklassen) und
– einfache Steuerelemente, die keine weiteren Controls enthalten können (Button, Canvas, TextField etc.)
• Anordnung und Layout von Steuerelementen– Steuerung durch absolute Angaben (Größe, Position) oder
– durch Verwenden sog. LayoutManager, die jeweils für einen bestimmten Container die Anordnung der in ihm enthaltenen Steuerelemente regeln
150Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Graphical User Interface (GUI)
– intensive Anwendung der objektorientierten Programmierung
– Nutzung der Java-Klassenbibliotheken
• standardmäßig zwei verwendbare Klassenbibliotheken
Oberflächenprogrammierung in Java
– Abstract Window Toolkit (AWT, java.awt und Unterpakete)
– Java Foundation Classes (JFC, javax.swing und Unterpakete)
• auch Swing-Bibliothek genannt (import javax.swing…)
• baut auf AWT auf
• seit Java 1.2 Standard
151Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Vorteile– deutlich vereinfachte Fensterprogrammierung gegenüber AWT
– plattformunabhängige Erscheinungsform (pluggable-look-andfeel, PLAF) von Java-Programmen
– bei Bedarf umschaltbar auf plattformabhängigen Look-and-Feel
Java Foundation Classes (Swing)
• vorgefertige Klassen und Methoden für Dialoge, z.B.– File öffnen, speichern: JFileChooser()
– Warnungen und Fehlermeldungen: OptionPane.showMessageDialog()
152Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Übersicht über Pakete im Java AWT (einfaches GUI Toolkit)
java.awt Abstract Window Toolkit(Benutzerschnittstellenprogrammierung)
java.awt.datatransfer Datenübertragung zwischen Anwendungenüber die Zwischenablage (clipboard)
java.awt.dnd Funktionalität für die Unterstützung von drag &drop-Operationen
java.awt.event Ereignisprogrammierung (Ereignisklassen,Lauscherklassen, Adapterklassen)
153Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Lauscherklassen, Adapterklassen)
java.awt.peer Klassen, die die Schnittstelle zwischen denAWT-Klassen und der aktuellen graphischenBenutzerschnittstelle (z. B. MS-Windows, OSFMotif etc.) bilden
java.awt.print Hilfsklassen für die Druckausgabe von AWT Komponenten
Übersicht über Pakete in Java Swing
javax.swing Benutzerschnittstellenkomponenten von Swing/Java Foundation Classes
javax.swing.border Klassen für die Generierung von Rändern umSwing-Komponenten
javax.swing.colochooser Farbwahlkomponente und Farbauswahlmodelle
javax.swing.event Zusatzklassen für die Ereignisverarbeitung in Swing
javax.swing.filechooser Dateiauswahlkomponente und Dateifilter für Swing
154Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
javax.swing.filechooser Dateiauswahlkomponente und Dateifilter für Swing
javax.swing.plaf pluggable-look-and-feel (plaf), modifizierbares Benutzerschnittstellendesign
javax.swing.table Tabellenkomponente von Swing
javax.swing.tree Baumdarstellungskomponente von Swing
javax.swing.undo Funktionalität für die Implementierung von UNDO-fähigen Komponenten in Swing
Übersicht über Pakete in Java Swing Cont…
javax.swing.text Hilfsklassen für den Aufbau von Texteditoren mit Swing
javax.swing.text.html Klassen für den Aufbau von HTMLEditoren
javax.swing.text.html.parser Einfacher HTML-Parser mit Hilfsklassen wie Element, Entity und DTD
javax.swing.text.rtf Klassen für den Aufbau von RTF-Editoren(rich text format)
155Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Komponentenarchitektur von Java GUIs
javax.beans Komponentenentwicklung (Java Beans)
javax.beans.beancontext Beschreibung eines bean context, d.h. eines Behälters für Java Beans
Die Klassenhierarchie des Paktes java.awt sieht zwei grundlegende Klassen vor, die die gemeinsame Basisfunktionalität der GUI-Elemente enthalten
– java.awt.Component
Wurzelklasse aller GUI-Komponenten (auch der Java Swing-Klassen)
Component und Container
Wurzelklasse aller GUI-Komponenten (auch der Java Swing-Klassen)
– java.awt. Container
Wurzelklasse der Containertypen
156Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Component enthält z. B. alle erforderlichen Methoden für die Manipulation des visuellen Erscheinungsbildes einer Komponente
– setForeground
– setBackground
– getFont
– setFont
– ...
Component und Container
• Container enthält Methoden zur Identifikation und Hinzunahme von Komponenten (z.B. in die Darstellungsfläche eines Applets oder eines Fensters einer GUI). Steuerung der Layouteigenschften.
– countComponents
– Add
– Remove
– getLayout
– setLayout
– ...
157Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Normales Fenster:– JFrame
• Menüleiste:– JMenuBar
• Menüelement:– JMenuItem
• Bedienelemente:
Wichtige GUI-Elemente der Swing-Bibliothek
– JButton: Knopf
– JCheckBox: Auswahl
– JLabel: nicht editierbares (einzeiliges) Textfeld
– JTextField: editierbares (einzeiliges) Textfeld
– JTextArea: editierbarer (mehrzeiliger) Textbereich
– JScrollBar
– JList
• Klasse zur Zusammenfassung von Bedienelementen– JPanel
158Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Anordnung der Bedienelemente (Beispiele)
• BorderLayout:
• FlowLayout (GUI-Objekte werden nebeneinander angeordnet)
Layouts
• FlowLayout (GUI-Objekte werden nebeneinander angeordnet)
• GridLayout (alle Bereiche gleich groß!)
• CardLayout
159Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Objektorientierung– GUI-Elemente als Felder einer Klasse
– Spezialisierung (Subklassen) von GUI-Elementklassen, z.B. spezielle Fenster, spezielle Controls
• Strukturierung– durch Container und Components
Implementierung von Benutzerschnittstellen (statisch)
– durch Container und Components
– Container können Komponenten und auch Container enthalten
160Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Benutzeraktionen in der GUI lösen Ereignisse (Events) aus
• Grundprinzip notification-based event delegation
– ein Ereignis wird nur der Komponente zugeführt (delegiert), die für dieses Ereignis als sog. Lauschobjekt (Listener) registriert ist
• Ereignisquellen erzeugen Ereignisse (z. B. durch Benutzeraktionen)
• Lauschobjekte (Listener) bekommen Ereignisobjekte zugeführt und verarbeiten sie
Implementierung von Benutzerschnittstellen (dynamisch)
verarbeiten sie
• Eine zentrale System Event Queue
– überwacht die Benutzerschnittstelle und fängt Ereignisse ab
– verteilt die Ereignisse an die registrierten Ereignislauscher (Event-Listener)
161Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Benutzeraktionen generieren Events
• wenn für das gegebene Event ein Listener („Lauscher“, Event-Handler) vorhanden ist, wird der Event-Handler aufgerufen
• Zu den Events gehören u.a.:– Mausbewegung,
– Tastendruck (Keyboard/Maus),
– Scrolling, etc.
Ereignisauslösung und -verarbeitung
Verarbeitung (z.B.)
• Benutzer klickt auf Schaltfläche (Ereignisquelle)
• Event-Objekt wird erzeugt und in die zentrale Event-Queue eingestellt
• Event-Objekt wird dem zugehörigen (registrierten) Listener zugestellt (Aufruf der Event-Handler-Methode, Ereignisbearbeitung)
162Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Auswertung von Events mittels des Listener-Konzepts (Implementierung von Schnittstellen mit Event-Handlern)
– java.awt.event
Ereignisverarbeitung
• Anwendung des Interface-Konzepts
• z.B. java.awt.event.ActionListener stellt Schnittstelle zur Auswertung einer Action bereit
• z.B. Mausklick auf bestimmtes Bedienelement:– public abstract void actionPerformed(ActionEvent e);
163Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Einfache Ereignisse wie Mausbewegung oder Tastendruck:– Component � ComponentEvent
FocusEvent, KeyEvent, MouseEvent, MouseMotionEvent, …
– Dialog, Frame � WindowEvent
• Interaktionen– Button � ActionEvent
Ereignistypen (Beispiele)
– Button � ActionEvent
– MenuItem � ActionEvent
– List � ActionEvent, ItemEvent
– Choice � ItemEvent
– CheckBox � ItemEvent
– CheckboxMenuItem � ItemEvent
– ScrollBar � AdjustmentEvent
164Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Beispiel: Scribble (Wdh.)
public class Scribble extends Applet
implements MouseListener, MouseMotionListener {
private int last_x, last_y;
public void mouseClicked(MouseEvent ev) {}
public void mouseReleased(MouseEvent ev) {}
public void mouseEntered(MouseEvent ev) {}
public void mouseExited(MouseEvent ev) {}
public void mouseMoved(MouseEvent ev) {}
public void mousePressed (MouseEvent ev) {
last_x = ev.getX();
last_y = ev.getY();
}
165Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
}
public void mouseDragged (MouseEvent ev) {
int x = ev.getX();
int y = ev.getY();
this.getGraphics().drawLine (last_x, last_y, x, y);
last_x = x;
last_y = y;
}
public void start () {
addMouseListener (this);
addMouseMotionListener (this);
}
}
• Problem:– GUI-Elemente müssen als Listener für verschiedene Ereignisse registiert werden
– Interface-Konzept erfordert Implementierung aller Interface-Methoden (meist mit leerem Rumpf)
• Adapterklassen
Adapterklassen
• Adapterklassen– definieren die Schnittstellenmethoden bereits mit leerem Rumpf
– Eine Subklasse eines Adapters muss nur die benötigten Methoden implementieren
– Realisierung des Adapters oft als anonymes Objekt / anonyme Klasse (GUI-Builder)
166Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Schnittstelle WindowListener
Ereignismethoden:void windowActivated(WindowEvent e)
void windowClosed(WindowEvent e)
void windowClosing(WindowEvent e)
Adapterklassen (Beispiel)
Adapterklasse
public abstract class WindowAdapter
extends Object
implements WindowListener,
WindowStateListener,
WindowFocusListener {
void windowActivated(WindowEvent e){}void windowClosing(WindowEvent e)
void windowDeactivated(WindowEvent e)
void windowDeiconified(WindowEvent e)
void windowIconified(WindowEvent e)
void windowOpened(WindowEvent e)
167Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
void windowActivated(WindowEvent e){}
void windowClosed(WindowEvent e) {}
void windowClosing(WindowEvent e) {}
void windowDeactivated(WindowEvent e) {}
void windowDeiconified(WindowEvent e) {}
void windowIconified(WindowEvent e) {}
void windowOpened(WindowEvent e) {}
…
}
• Anwendungsbereich– Komplexe GUI-Applikationen
• Aufteilen in logische Einzelkomponenten (Objekte)– Datenmodell (model)
– Ansicht (view)
– Steuerung (control)
• Zweck– Trennung des Anwendungsobjekts (model) von der Art seiner Repräsentation (view)
Model-View-Control (MVC)
– Trennung des Anwendungsobjekts (model) von der Art seiner Repräsentation (view) beim Benutzer und der Weise, in der es von ihm beeinflusst wird (controller)
168Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• Model an View: Realisierung über Observer– Views registrieren sich beim Observable (addObserver)
– Observable hält eine Liste der Referenzen der registrierten Observer
– Observer werden immer dann benachrichtigt (update), wenn sich Werte im
Model geändert haben
– Observer implementiert hierzu das Interface Observer: abstract void update(...)
Model-View-Control (Kommunikation der Objekte)
abstract void update(...)
• View an Controller: Realisierung über Action Listener– Aktive Objekte im View werden beim Controller registriert
– Controller hält eine Liste der Referenzen der registrierten GUI-Objekte
– Wenn von einem GUI-Objekt eine Aktion ausgeht, wird der Controller benachrichtigt (actionPerformed)
– Controller implementiert hierzu das Interface ActionListener:abstract void actionPerformed(...)
169Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Registrieren der Observer beim Observable
170Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Registrieren der Observer beim Observable
171Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)