Objektorientierte Programmierung in Java

Werbung
Organisatorisches
Dr. Wolfgang Goerigk
Objektorientierte Programmierung
in Java
b+m Informatik AG
Rotenhofer Weg 20, 24109 Melsdorf
[email protected]
[email protected]
Vorlesung an der Fachhochschule Kiel
Sommersemester 2009
04340 – 404 1423
0160 – 474 3558
PD Dr. Wolfgang Goerigk
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
2
Organisatorisches
Organisatorisches
Labore: Freitag, (1) 8-10 und (2) 10-12
• Gebäude 12, Raum 2.70
•
Teilnehmerlisten
•
Laboreinteilung
•
Zeiten und Räume
–
–
–
•
Homepage:
–
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
3
Vorlesung: Montags 08:00 Uhr – 09:30 (Geb. 8, Hörsaal 4)
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)
http://www.informatik.uni-kiel.de/~wg/Lehre/Vorlesung-SS2009/oop-java-SS2009.html
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
4
Übersicht
•
•
•
•
•
•
•
•
•
•
Literatur
• Java
Einleitung und Begriffliches
Grundbegriffe objektorientierter Programmierung
Java als Programmiersprache (imperativ, objektorientiert)
Objekte, Klassen, Methoden
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)
– 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. AddisonWesley 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 Kapiteln
online auch unter http://www.informatik.uni-kiel.de/~wg/
5
Literatur (Internet, Java)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
6
Einleitung
Dokumentationen und Spezifikationen
– Java Development Kit (JDK) Documentation
http://java.sun.com/j2se/1.4.2/docs/index.html
– Java API Specification
http://java.sun.com/j2se/1.4.2/docs/api/index.html
– Java-Tutorial
http://java.sun.com/docs/books/tutorial/
Einleitung und Begriffliches
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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
8
Einleitung
Einleitung
Objektorientierte Programmierung (OOP)
Eigenschaften großer Software-Systeme:
Methode zur effizienten Software-Entwicklung für große
Systeme wie z.B.
• Viele Entwickler
• Lange Lebensdauer (Entwickler sind z.T. nicht mehr da)
• Große Komplexität
– industrielle Software
– Forschungssoftware
– 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
OOP ist eine geeignete Methode zur Beherrschung von
Software-Komplexität
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
9
Einleitung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
10
Einleitung und Begriffliches
• Programmiersprachen
• Software-Komplexität ist inhärent und hat vor allem
folgende Ursachen
– Sind formale Sprachen mit festgelegter Syntax und Semantik, die für
Maschinen verständlich sind.
– Ermöglichen die formale Beschreibung von
Problemlösungsverfahren, die auf einem Computer oder
Computersystemen ausführbar sind.
– Bilden die Basis zur Entwicklung von Software und
Betriebssystemen.
– Komplexität des gegebenen Problems
– Schwierigkeiten beim Management des Entwicklungsprozesses
– Software-Flexibilität
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
11
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
12
Einleitung und Begriffliches
Einleitung und Begriffliches
• Syntax, Semantik, Pragmatik
• Algorithmus
– 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
– 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
Einzelschritten.
– Beispiele: Euklidischer Algorithmus, Such- und Sortieralgorithmen,
etc.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
14
Einleitung und Begriffliches
• Programme
• Programmiersprachen:
– 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.
– 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)
15
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
16
Klassifikation von Programmiersprachen
Programmierparadigmen
• historisch nach Generationen
–
–
–
–
–
Programmierparadigmen beschreiben grundsätzliche Konzepte oder
Problemlösungsstrategien die einer Sprache zugrunde liegen.
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
–
–
•
Anweisung → Funktion → Modul → Objekt → Framework,
Entwurfsmuster, Component Ware
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)
17
Einige höhere Programmiersprachen
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
Ab etwa 1980: Objektorientiertes Programmieren (Smalltalk, C++, Java, C#)
–
–
• nach zentralen Konzepten:
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Etwa 1970: strukturierte (prozedurale) Programmierung (Pascal, C)
–
•
• systematisch nach Programmierparadigmen (s. u.)
–
–
•
18
Entwicklung der Programmiersprachen
1950
1955
1960
1965
1970
1975
1980
1985
1995
2000
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
19
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
20
Programmier-Vorkenntnisse
Maschinennahe Sprachen
Assembler
Imperative Sprachen
Basic
Pascal
C
Ada, Modula 2
Objektorientierte Sprachen
C++
Smalltalk
C#
Java
Deklarative / Funktionale Sprachen
Lisp
Prolog
Phasen des Softwareentwicklungs-Prozesses
Skriptsprachen
PHP
Perl / Python
VBScript / JavaScript
Shell-Programmierung (Unix)
• Fragestellung:
– Wie komme ich vom Problem zur Lösung?
Anwendungsspezifische Sprachen
CNC-Steuerungen
• oder spezieller:
– Welche Phasen muss ich durchlaufen, um
vom Problem zum Programm zu kommen?
PL/SQL
Autorensysteme
Macromedia Director
Adobe Flash
Keine
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
21
Phasen des Softwareentwicklungs-Prozesses
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
22
Softwarelebenszyklus
• Dokumentation beschreibt:
– Welche generellen Leistungen soll das
System erbringen?
– Was soll das System im Einzelnen leisten?
– Wie funktioniert das System?
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
23
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
24
Wasserfallmodell der Softwareentwicklung
Lebenszyklus: Analyse
Was ist das Problem, was soll die Anwendung leisten (Funktion, Dienst) ?
• Machbarkeitsstudie, technische, personelle, ökonomische
Durchführbarkeit
• Anforderungsanalyse (requirements engineering)
Identifikation und Dokumentation der exakten Anforderungen an das System
Resultat: Anforderungsspezifikation
(requirements specification, Analyse-Modell)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
25
26
Wasserfallmodell der Softwareentwicklung
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
27
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
28
Wasserfallmodell der Softwareentwicklung
Lebenszyklus: Entwurf (Design)
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, UMLDiagramme)
• Feinentwurf der Modulspezifikationen
auch Referenzimplementierungen der architekturbezogenen Module
Resultat: Design
formale 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
Lebenszyklus: Implementierung
Produktion des Programmcodes (Quellcode)
• Programmieren der Module
• auch Generieren von Programmcode, Montieren von Komponenten,
Instantiieren von Schemata (templates)
Resultat: Implementierung, Programm
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
31
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
32
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wasserfallmodell der Softwareentwicklung
33
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
34
Wasserfallmodell der Softwareentwicklung
Lebenszyklus: Integration
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
• 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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
36
Wasserfallmodell der Softwareentwicklung
Lebenszyklus: Installation und Wartung
Auslieferung und Wartung des Produkts beim Kunden
• Integration des Systems in technische und/oder organisatorische
Anwendungsumgebung beim Kunden
• Resultat: das eigentliche System
– Abnahmetests, Freigabe, Schulungen, Wartung ...
– Wartung: alle Maßnahmen und Änderungen am System nach dessen
Erstauslieferung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
37
Wasserfallmodell der Softwareentwicklung
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
38
Wasserfallmodell der Softwareentwicklung
39
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
40
Phasen und Resultate objektorientiert
Entwicklungswerkzeuge
• Texteditor
Ein 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.
• Compiler
Ein Compiler ist ein Übersetzungsprogramm, das ein in einer höheren
Programmiersprache abgefasstes Quellprogramm in eine andere
Sprache, z.B. Maschinensprache, übersetzt.
• Weitere Entwicklungssoftware
Binder, Lader, Interpreter, Debugger
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
41
Entwicklungswerkzeuge
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
42
Programmübersetzung: Compiler
• 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.
• Compiler:
• Testwerkzeuge
Unterstützung von Testprozessen, z.B. Unit-Tests,
Integrationstests, Testautomation, Teststeuerung,
Testdokumentation
Überführen des in einer höheren
Programmiersprache formulierten
Programms (Algorithmus) in eine
andere Sprache, z.B. eine
Maschinensprache
• Betriebsunterstützung
Softwaremonitore, Profiling, dynamische Lastverteilung,
Fehlertoleranz und Ausfallsicherheit
Phasen der Codeerzeugung:
• u.v.a.m.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
43
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
44
Programmübersetzung: Compiler-Phasen
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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
45
Programmausführung: Interpreter
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
46
Programmausführung von Java-Programmen:
• 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
interpretiert.
Java-Programm
• Compiler erzeugt Bytecode
– plattformunabhängiges
Code-Format
– kann auch über das Netz
transportiert werden
übersetzt
prog.java
Java-Compiler
Java-Bytecode
prog.class
• JVM interpretiert Bytecode
– auf verschiedenen
Plattformen (Windows,
Linux, PDA, Handy, …)
• Beispiele
– Perl, Basic, Skriptsprachen
JVM1
JVM2
interpretiert
JVM3
% java prog arg1 arg2 …
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
47
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
48
Objektorientierte Programmierung (OOP)
Grundbegriffe objektorientierter Programmierung
•
•
•
•
• Ziele
– Verkürzung der Entwicklungszeit
– Senkung der Fehlerrate (Verbesserung der Qualität)
– verbesserte Erweiterbarkeit und Anpassungsfähigkeit
Objektorientierte Programmierung
Erste Java-Programme
Java als Programmiersprache
Imperativ, objektorientiert
• 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)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
49
Ein erstes Java-Programm und seine Bestandteile
50
Ein erstes Java-Programm und seine Bestandteile
•
class
– Definieren einer Klasse
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);
}
}
•
new
– Anlegen eines Objektes
(Instanzierung einer Klasse)
•
public
•
main
– bestimmt die Sichtbarkeit
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)
51
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
52
Java-Programmbestandteile: eine kleine Übersicht
Ein erstes Java-Programm und seine Bestandteile
Wir beschreiben die Programmbestandteile, indem wir angeben,
• welche Wörter (Bestandteile) zum Schreiben
von Java-Programmen existieren,
• wie sie zusammengesetzt werden können,
Syntax
• welche Bedeutung diese haben, und
Semantik
• wie und wozu sie sinnvoll eingesetzt werden
Pragmatik
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
53
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
54
Grundlegende Sprachelemente
Die Programmiersprache Java: Der imperative Kern
Zeichensatz Quellcode
– 16-Bit-Zeichensatz: Unicode
Bezeichner
– Groß- und Kleinschreibung ist signifikant
– Erstes Zeichen muss Buchstabe, $ oder _ sein
Schlüsselwörter
• Der imperative Kern
• Ausdrücke, Anweisungen, Kontrollstrukturen
– sind reservierte Wörter und dürfen nicht für eigene Bezeichner verwendet werden
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)
55
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
56
Einfache Datentypen und Operatoren
Einfache Datentypen und Standardwerte (default values)
• Orientiert an C, einfache Variante von C++, imperativer Kern
• Einfache Datentypen
byte, short, int, long, boolean, char, float, double
• Einfache Datentypen
byte, short, int, long, boolean, char, float,
double
• 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 initiale Werte
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
58
Operatoren und ihre Präzedenzen
Prio.
1 Primary
• Einfache Datentypen
byte, short, int, long, boolean, char, float, double
• Implizite Typumwandlung
Auswertung eines Ausdrucks liefert Typ B, aber Typ A wird erwartet
(implizite) Typanpassung wird versucht (entlang der Pfeile)
double
float
long
int
short
byte
char
float g = 2 / 5;
float h = 2 / 5.0;
float j = 2F / 5;
// g = 0.0, d.h. zuerst die Division
// h = 0.4
// j = 0.4
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Beschreibung
Bezeichnung
(Ausdruck) Literale Methodenaufrufe
Arrayzugriffe new this
Pre/Postfix
++ -- + - (unär)
Unär
~ ! cast-Ausdrücke (Typ)
Multiplikativ
* / %
Additiv
+ - (binär)
Shift
<< >> >>>
Relational
< > <= >= instanceof
(Un)Gleichheit
== !=
Und
&
Exklusiv-Oder
^
Oder
|
Logisches Und
&&
Logisches Oder
||
Conditional
? :
Assignment
=
Assignment-Op.
*= /= %= += -= <<= >>= >>>= &= ^= |=
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
59
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Java ist auch eine Insel
60
Literatur (Internet, Java)
Beispiele für Ausdrücke
Dokumentationen und Spezifikationen
Deklarationen mit Initialisierung
– Java Development Kit (JDK) Documentation
int i = 10;
int j = 15;
– Java API Specification
Beispiele für Ausdrücke
– Java-Tutorial
– Christian Ullenboom: Java ist auch eine Insel
https://rz-static.uni-hohenheim.de/anw/programme/prg/java/tutorials/javainsel4/
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
61
Der imperative Kern
i+j
i++
i & j
i | j
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
62
Der imperative Kern
Variablendeklarationen
Zuweisungen
<Variable> = <Ausdruck>;
[<Sichtbarkeit>] [static] <Typ>
<Name1> [= <Init1>]
[ , <Name2> [= <Init2>], … ]
Beispiele:
x = 1;
y = 2;
Beispiele:
int i = 10;
public static String Hello = “Hello World !“;
boolean flag = true;
int i, j=10,k, l=2*j;
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
–
–
–
–
63
Zuweisungen sind auch Ausdrücke:
x = y = 1;
entspricht
x = (y = 1);
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
64
Imperativer Kern - Kontrollstrukturen
Imperativer Kern - Kontrollstrukturen
Bedingte Anweisungen
Blöcke
Sequenzen von Anweisungen und Deklarationen in
Sequenzen von Anweisungen und Deklarationen in
if (<Bedingung>) {
<Konsequenz>
}
[ else {
<Alternative>
} ]
{ … }
Beispiel
{ int
i =
int
j =
}
i = 10;
2*i;
j;
i+i;
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Beispiel
if ( a < b ) { x = a; } else { x = b;}
65
Imperativer Kern - Kontrollstrukturen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
66
Imperativer Kern - Kontrollstrukturen
Endliche Fallunterscheidung (Switch)
Endliche Fallunterscheidung (Switch)
Beispiel:
switch (<Ausdruck>) {
case
c1 : <Anweisung1>
.
.
.
cn : <Anweisungn>
[ default : <Anweisung> ]
}
int x = 2, j;
switch (x) {
case 1: j=10;
case 2: j=20;
case 3: { j=25;
break;
}
case 4: j=0;
default: j++;
}
Spezielle Anweisung: break;
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
67
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
68
Imperativer Kern - Kontrollstrukturen
Imperativer Kern
Schleifen (while, do, for)
Die Fakultät in Java
while (<Bedingung>) { <Anweisungen> }
public class Fakultaet {
static int fac (int n) {
if (n==0)
return 1;
else
return n*fac(n-1);
}
do
{ <Anweisungen> }
while (<Bedingung>)
for (<Init>; [<Bedingung>;] <Abschluss>)
<Anweisungen>
public static void main (String[] argv) {
System.out.println ( fac(6) );
}
Beispiel
for (i=0; i<10; i++) { x = x+i; }
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
69
Java als Programmiersprache
70
Java als Programmiersprache
Objektorientierung (Klassen, Objekte, Methoden, Vererbung)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Objektorientierung (Klassen, Objekte, Methoden, Vererbung)
Kapselung (engl. encapsulation)
Vererbung (engl. inheritance, Struktursicht, Typsicht)
Nachrichtenaustausch (engl. message passing)
71
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
72
Klassen und Objekte
Klassen und Objekte
Klassen sind Datentypen (zeigerreferenzierte Recordtypen)
Objekte sind Daten (Instanzen einer Klasse)
– entsprechen etwa zeigerreferenzierten Records in Modula 2
– legen die Struktur (Instanzvariablen, erlaubte Operationen)
ihrer Instanzen (Objekte) fest
– können Komponenten einer anderen Klasse erben
– kapseln Funktionalität etwa durch Deklaration von Sichtbarkeiten
– 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)
class Circle {
float x, y, r;
}
class Circle {
float x, y, r;
}
// Mittelpunkt (x,y) und Radius r
// Mittelpunkt (x,y) und Radius
Circle c;
c = new Circle(); // erzeugt ein Objekt der Klasse Circle
// und weist es der Variablen c zu
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
73
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
74
Methoden
Objekte (Instanzen)
Objekte sind Daten (zeigerreferenzierte Records)
Methoden entsprechen Prozeduren / Funktionen
– werden durch Nachrichten aufgerufen:
Speicher
objekt.methodenname(arg1, …, argn)
new Circle()erzeugt
0100
nocheinmal new Circle()
0110
0100
Circle
0104
x = 0.0
0108
y = 0.0
010C
r = 0.0
0110
Circle
0114
X = 0.0
0118
Y = 0.0
011C
Z = 0.0
entspricht (im Prinzip, beachte Methodenauswahl, late binding)
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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
75
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
76
Methoden
Methodenaufruf (Nachricht)
Methodendeklarationen (in Klassen)
(Objekt-) Methoden
– werden durch Nachrichten aufgerufen:
[<Sichtbarkeit>] [static] <Typ> <Name>
(<Parameter>) { <Rumpf>}
– Beispiel:
Beispiel:
c.x = 2.0;
c.y = 3.0;
c.r = 1.0;
public class Circle {
…
public double umfang () {
return 2*3.14159 * this.r;
}
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
double x = c.umfang();
77
Objekterzeugung (Konstruktoren)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
78
Objekte (Instanzen)
Instanzen von Klassen (Objekte) werden durch Konstruktoraufrufe
erzeugt, z.B. durch
Objekte sind Daten (zeigerreferenzierte Records)
Speicher
new Circle(2.0, 3.0, 1.0);
new Circle(2.0,3.0,1.0)erzeugt
– Methoden, die keinen Resultattyp und denselben Namen haben
wie die Klasse, sind Konstruktormethoden
– Beispiel:
0100
0100
Circle
0104
float x = 2.0
0108
float y = 3.0
010C
float r = 1.0
0110
0114
public Circle ( float x, y, r ) {
this.x = x;
this.y = y;
this.r = r;
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
0118
011C
79
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
80
Überladung
Überladung
In Java sind zwei Methoden gleich, wenn sie
• den gleichen Namen und
• die gleiche Signatur haben, d.h. Anzahl, Reihenfolge
und Typen der Parameter gleich sind
In Java sind zwei Methoden verschieden, wenn sie
• verschiedene Namen oder
• gleiche Namen und
verschiedene Signaturen haben, d.h. Anzahl, Reihenfolge
oder Typen der Parameter verschieden sind
Beispiel: (hier: Konstruktormethoden):
Beispiel: (hier: Konstruktormethoden):
public double umfang () {
return 2 * Math.PI * r;
}
public double umfang () {
return Math.PI * ((r + s) * 3 / 2
- Math.sqrt(r * s));
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; }
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
81
Statische Komponenten
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
82
Statische Variablen (Beispiel)
– Statische Methoden sind gewöhnliche Funktionen oder
Prozeduren (Schlüsselwort static)
– Statische Instanzvariablen sind globale Variablen.
Sind sie zusätzlich final deklariert, wirken sie wie Konstanten
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
}
– Beispiele:
public static int fac ( int n ) { … }
public Circle () {
this (0.0, 0.0, 1.0);
}
public final static double PI = 3.14159;
}
Zugriff auf statische Variablen (Klassenvariablen):
Circle.num_circles
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
83
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
84
Vererbung
Vererbung (Struktursicht, Typsicht)
A
class B extends A {
…
}
–
–
–
–
A
class B extends 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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
B
Struktursicht:
B erbt alle Komponenten (Attribute, Methoden) von A
Typsicht:
B ist Subtyp von A, jedes B ist auch ein A
85
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
86
Vererbung - Beispiel
Vererbung (Typsicht, Typ-/Subtyp-Beziehung)
A
public class GraphicCircle extends Circle {
class B extends A {
…
}
Color fill, outline;
B
public void draw (Graphics g) {
g.setColor(outline);
g.drawOval(x-r, y-r, 2*r, 2*r);
g.setColor(fill);
g.fillOval(x-r, y-r, 2*r, 2*r);
}
– 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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
87
}
Die Methoden drawOval(…) und fillOval(…) in Java 1.5
erwarten Integer-Argumente (Anzahl Pixel) anstatt float.
– Beteiligte Packages:
java.awt.Color, java.awt.Graphics
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
88
Objekte (Instanzen), Vererbung von Attributen
Vererbung – Überdecken von Attributen
Objekte sind Daten (zeigerreferenzierte Records)
Klasse GraphicsCircle erbt die Komponenten von Circle
public class Circle
extends Ellipse {
Speicher
double r;
new GraphicsCircle()
erzeugt
0100
0100
GraphicsCircle
0104
float x = 0.0
0108
float y = 0.0
010C
float r = 0.0
0110
Color fill =
0114
Color outline =
public double umfang () {
return 2 * Math.PI * r;
}
}
– Kreise haben sowohl ein double r
als auch das float r aus Ellipse
0118
011C
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
89
Objekte (Instanzen), Überdecken von Attributen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Vererbung – Überschreiben von Methoden
Objekte sind Daten (zeigerreferenzierte Records)
Klasse Circle erbt alle Komponenten von Ellipse
public class Ellipse {
Speicher
float x, y, r, r2;
new Circle()erzeugt
0100
0100
Circle
0104
float x = 0.0
0108
float y = 0.0
010C
float r = 0.0
0110
float r2 = 0.0
0114
90
public double umfang () {
return Math.PI
* ((this.r + this.r2) * 3 / 2
- Math.sqrt(this.r * this.r2));
}
}
double r = 0.0
0118
– Dynamische Bindung (late binding)
011C
– xxx.umfang() für Instanzen von Ellipse
– xxx.umfang() für Instanzen von Circle
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
91
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
92
Vererbung – Überschreiben von Methoden
Vererbung – Überschreiben von Methoden
public class Ellipse {
public class Circle extends Ellipse {
float x, y, r, r2;
double r;
public double umfang () {
return Math.PI
* ((r + r2) * 3 / 2
- Math.sqrt(r * r2));
}
public double umfang () {
return 2 * Math.PI * r;
}
}
}
– Dynamische Bindung (late binding)
– Dynamische Bindung (late binding)
– xxx.umfang() für Instanzen von Ellipse
– xxx.umfang() für Instanzen von Ellipse
– xxx.umfang() für Instanzen von Circle
– xxx.umfang() für Instanzen von Circle
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
93
Vererbung – Dynamische Bindung (late binding)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Vererbung – Dynamische Bindung (late binding)
public double umfang () {
return Math.PI * ((r + s) * 3 / 2
- Math.sqrt(r * s));
public double umfang () {
return 2 * Math.PI * r;
}
!
Der Typ des Nachrichtenempfängers
entscheidet, welche Methode aufgerufen
wird.
Ellipse e = new Ellipse();
Circle c = new Circle();
Ellipse e = new Ellipse();
Circle c = new Circle();
… e.umfang() …
… c.umfang() …
… e.umfang() …
… c.umfang() …
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
94
95
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
96
Vererbung (Typ-Subtyp-Beziehung)
Vererbung (Typ-Subtyp-Beziehung)
A
class B extends A {
…
}
class Circle extends Ellipse {
…
}
B
– jedes B ist auch ein A, B ist Subtyp von A
– überall, wo ein A erwartet wird, darf auch ein B auftauchen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
– jeder Kreis ist auch eine Ellipse,
Circle ist Subtyp von Ellipse
– überall, wo eine Ellipse erwartet wird, darf auch ein Kreis
auftauchen
97
Vererbung – Dynamische Bindung (late binding)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
98
Vererbung (Typsicht)
Ellipse e;
Circle c;
class Circle extends Ellipse {
…
}
if (das_Wetter_ist_schoen())
e = new Ellipse();
else
e = new Circle();
(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
… e.umfang() …
!
Methodenauswahl zur Laufzeit
parametrischer Polymorphismus
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
99
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
100
Vererbung (Struktursicht, Finalisieren von Klassen)
Begriffliches zu Methoden
Welche Komponenten hat eine Klasse ?
Signatur
Resultattyp
Methodenname
Attribute (Instanzvariablen)
– alle Attribute der Superklasse (und damit aller
Superklassen)
– alle eigenen (lokalen) Attribute
public void draw (Graphics g, Dummy z) {
g.drawRect((int)x, (int)y, width, height);
}
Methoden
– alle Methoden der Superklasse, die nicht durch
eine gleiche lokale Methode (Name und
Signatur) überschrieben werden
– alle lokalen Methoden
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Formale Parameter
Methodenrumpf
Parameterliste + Methodenrumpf = erweiterter Methodenrumpf
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
101
Vererbung (Struktursicht, Finalisieren von Klassen)
102
Vererbung (Struktursicht, Finalisieren von Klassen)
public class GraphicalElement {
Color fill, outline;
public void draw (Graphics g) {
System.out.println("cannot draw");
}
}
public class GraphicalElement {
Color fill, outline;
public void draw (Graphics g) {
System.out.println("cannot draw");
}
}
public class Rectangle extends GraphicalElement {
float x,y;
int width, height;
public boolean isQuadrat () {
return width == height;
}
}
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");
}
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
103
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
104
Vererbung (Struktursicht, Finalisieren von Klassen)
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");
}
}
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");
}
}
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);
}
public class GraphicRectangle
extends Rectangle {
public void draw (Graphics g) {
g.drawRect((int)x, (int)y,
width, height);
}
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
}
105
Vererbung (Struktursicht, Finalisieren von Klassen)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
106
Vererbung (Struktursicht, Finalisieren von Klassen)
Welche Komponenten hat eine Klasse ?
Attribute (Instanzvariablen)
– alle Attribute der Superklasse (und damit
aller Superklassen)
– alle eigenen (lokalen) Attribute
Methoden
– alle Methoden der Superklasse, die nicht
durch eine gleiche lokale Methode (Name
und Signatur) überschrieben werden
– alle lokalen Methoden
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
107
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
108
Abstrakte Klassen und Schnittstellen
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)
Klassen und abstrakte Klassen
• werden vererbt (einfache Vererbung)
Schnittstellen (Interfaces)
Schnittstellen (Interfaces)
• Definieren Typen
• Enthalten keine Attribute und nur Namen und Signaturen der
enthaltenen Methoden
• Können von Klassen implementiert werden
(Implementierungsvererbung, mehrfache Vererbung)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• werden implementiert (mehrfache Implementierungsvererbung)
109
Abstrakte Klassen und Schnittstellen
110
Vererbung von abstrakten Methoden
Abstrakte Klassen
Wenn wir von einer Klasse abstrakte Methoden erben, so haben wir
zwei Möglichkeiten:
public abstract class GrElement {
…
public abstract void m ( … );
…
}
1.
2.
• Definieren Typen und nicht instanziierbare Klassen
• Können Methoden- und Attributdefinitionen enthalten
• Methoden können abstrakt definiert werden
(Methoden ohne Rumpf)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wir überschreiben alle abstrakten Methoden und
implementieren sie. Dann kann die erbende Klasse instanziiert
werden
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.
111
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
112
Abstrakte Klassen (Beispiel)
Abstrakte Klassen
Schnittstellen (Interfaces)
Abstrakte Klasse, nicht
instanziierbar, aber
gemeinsamer Supertyp von
GrCircle und GrRectangle
public abstract class GrElement {
int x,y;
Color fill, outline;
public abstract void draw (Graphics g);
}
Schnittstellen
Abstrakte Methode
public class GrCircle extends GrElement {
int r;
public void draw (Graphics g) {
g.drawOval(x-r, y-r, 2*r, 2*r);
}
}
public interface DrawableElement {
public void draw ( … );
…
}
Instanziierbare
Subklassen
•
•
•
•
public class GrRectangle extends GrElement {
int width, height;
public void draw (Graphics g) {
g.drawRect(x-width/2, y-height/2, width, height);
}
Wolfgang 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
Interface, keine Instanzen, aber
gemeinsamer Supertyp
public interface DrawableElement {
public void draw (Graphics g);
extends
implements
}
public class GrCircle implements DrawableElement {
int x, y, r;
Color fill, outline;
public void draw (Graphics g) {
g.drawOval(x-r, y-r, 2*r, 2*r);
}
}
• Definieren Sichten (Rollen) von Objekten der implementierenden
Klassen
• Objekte können mehrere Rollen haben (mehrere Schnittstellen
implementieren
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
114
Schnittstellen (Beispiel)
Schnittstellen
public interface DrawableElement {
public void draw ( … );
…
}
implements
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
113
Schnittstellen (Interfaces)
extends
Interface-Methode
Instanziierbare
implementierende
Klassen
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);
}
115
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
116
Schnittstellen und abstrakte Klassen (Beispiel)
Schnittstellen und abstrakte Klassen
Interessante Systemschnittstellen (aus java.awt.event)
Interface, keine Instanzen, aber
gemeinsamer Supertyp
public interface DrawableElement {
public void draw (Graphics g);
}
public abstract class GrElement {
int x, y;
Color fill, outline
}
ActionListener
AdjustmentListener
AWTEventListener
ComponentListener
ContainerListener
FocusListener
HierarchyBoundsListener
HierarchyListener
InputMethodListener
ItemListener
KeyListener
Interface-Methode
Abstrakte Superklasse, nicht
instanziierbar, aber auch
gemeinsamer Supertyp
public class GrCircle extends GrElement
implements DrawableElement {
int r;
public void draw (Graphics g) {
g.drawOval(x-r, y-r, 2*r, 2*r);
}
}
Instanziierbare
implementierende
(Sub-)Klassen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
117
Interessante Systemschnittstellen (z.B. MouseListener)
MouseListener
MouseMotionListener
MouseWheelListener
TextListener
WindowFocusListener
WindowListener
WindowStateListener
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
118
Interessante Systemschnittstellen (z.B. MouseMotionListener)
void mouseClicked(MouseEvent e)
Invoked when the mouse button has been clicked (pressed and
released) on a component.
void mouseDragged(MouseEvent e)
Invoked when a mouse button is pressed on a component and then
dragged.
void mousePressed(MouseEvent e)
Invoked when a mouse button has been pressed on a component.
void mouseReleased(MouseEvent e)
Invoked when a mouse button has been released on a component.
void mouseMoved(MouseEvent e)
Invoked when the mouse cursor has been moved onto a
component but no buttons have been pushed.
void mouseEntered(MouseEvent e)
Invoked when the mouse enters a component.
void mouseExited(MouseEvent e)
Invoked when the mouse exits a component.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
119
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
120
Modifikatoren
Beispiel: Scribble
public class Scribble extends Applet
implements MouseListener, MouseMotionListener {
• Man unterscheidet
private int last_x, last_y;
public
public
public
public
public
public
– Modifikatoren für Klassen
– Modifikatoren für Attribute
– Modifikatoren für Methoden
void mouseClicked(MouseEvent ev) {}
void mouseReleased(MouseEvent ev) {}
void mouseEntered(MouseEvent ev) {}
void mouseExited(MouseEvent ev) {}
void mouseMoved(MouseEvent ev) {}
void mousePressed (MouseEvent ev) {
last_x = ev.getX();
last_y = ev.getY();
• Funktion von Modifikatoren
}
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);
}
– Sichtbarkeit und Zugriffsmöglichkeiten (Klassen, Methoden,
Attribute: public, protected, private)
– Kennzeichnung als abstrakt (abstract)
– Steuerung der Vererbbarkeit (final)
– Klassen- vs. Instanzbezug (static)
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
121
Modifikatoren für Klassen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
122
Modifikatoren für Variablen
Modifikator
Bedeutung
keiner (package)
Variable ist nur innerhalb der eigenen Klasse und des
Package erreichbar, zu dem sie gehört.
Modifikator
Bedeutung
keiner (package)
Klasse ist nur aus demselben Package sichtbar
und erreichbar (ggf. aus dem Default-Package).
public
Variable ist überall dort erreichbar, wo auch die Klasse
erreichbar ist, zu der sie gehört.
public
Klasse ist von überall erreichbar.
private
abstract
Klasse ist abstrakt, d.h. kann nur geerbt, aber
nicht instanziert werden.
Variable ist nur innerhalb der eigenen Klasse
erreichbar.
protected
final
Klasse ist final, d.h. kann nicht vererbt werden.
Es dürfen keine Subklassen gebildet werden.
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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
123
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
124
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.
abstract
Methode besitzt keinen Rumpf. Dieser muss
von einer Unterklasse implementiert werden. Klasse muss
ebenfalls als abstrakte Klasse definiert werden.
final
Methode kann von Unterklassen nicht überschrieben
werden.
native
Methode ist in einer anderen Programmiersprache
realisiert. Wie bei abstract kein Methodenrumpf.
static
Methode ist eine Klassenmethode, kein Instanzbezug
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Client-Server-Anwendungen
Client-Server-Anwendungen
•
•
•
•
•
125
Programmierung graphischer Benutzeroberflächen
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
126
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)
Graphical User Interfaces (GUIs)
•
•
•
Typische Aktionen:
• Ein Button (Knopf) wird gedrückt
• Ein Text wird in ein Textfeld eingegeben
• Eine Checkbox wird angewählt
• …
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Webanwendungen (HTML-Oberflächen für Clients)
Thin Client
Graphische Benutzeroberfläche,
Smart Client
Unterschiedlich ausgeprägte lokale
Rich Client
Verarbeitung
Fat Client
127
AWT (Abstract Windowing Toolkit)
SWT (Standard Widget Toolkit)
Swing (Widget Toolkit, Java)
java.awt.*
javax.swing.*
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
128
Swing-Dialogelemente (Beispiele)
Einige Swing-Dialogelemente
JFrame
JDialog
JTextField
JTextField
nicht editierbar
JLabel
JButton
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
129
Swing-Dialogelemente (Beispiele)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
130
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,
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);
}
…
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Typischerweise sind Buttons (Knöpfe)
als ActionListener registriert
…
{
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));
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);
}
});
}
…
131
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
132
Swing-Dialogelemente (Beispiele)
Interessante Systemschnittstellen (aus java.awt.event)
ActionListener
AdjustmentListener
AWTEventListener
ComponentListener
ContainerListener
FocusListener
HierarchyBoundsListener
HierarchyListener
InputMethodListener
ItemListener
KeyListener
Programmierung der GUI:
• Graphischer Editor
Programmierung der fachlichen Berechnungen:
• Manuell
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
133
Interessante Systemschnittstellen (aus java.awt.event)
MouseListener
MouseMotionListener
MouseWheelListener
TextListener
WindowFocusListener
WindowListener
WindowStateListener
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
134
Swing-Dialogelemente (Beispiele)
ActionListener
Programmierung der GUI:
• Graphischer Editor
Interface aus java.awt.event
Programmierung der fachlichen Berechnungen:
• Manuell
Zu implementierende Methoden:
void actionPerformed(ActionEvent e)
Invoked when an action occurs.
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Typische actions:
• Ein Button (Knopf) wird gedrückt
• Ein Text wird in ein Textfeld eingegeben
• Eine Checkbox wird angewählt
• …
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
135
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
136
Klassenschachtelung: Anonyme innere Klassen
Klassenschachtelung: Anonyme innere Klassen
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
}
);
}
Allgemein:
new KlasseOderSchnittstelle()
{ /* Eigenschaften der inneren Klasse */ }
entspricht
entspricht
class Anonymous implements ActionsListener {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
}
class Anonymous extends Klasse { … }
oder
BerechnenBerechnen.addActionListener(new Anonymous());
class Anonymous implements Schnittstelle { … }
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
137
Swing-Dialogelemente (Beispiele)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
138
Eclipse GUI-Editoren
Programmierung der GUI:
• Graphischer Editor
Programmierung der fachlichen Berechnungen:
• Manuell
Berechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
BerechnenActionPerformed(evt);
}
});
}
…
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
http://wiki.computerwoche.de/doku.php/programmierung/gui-builder_fuer_eclipse
139
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
140
Klausur – Termin und Ort
Klausur – Beispiele für Klausuraufgaben
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:
Donnerstag, 16.07.2009
09:00 – 11:00 Uhr (2 Zeitstunden)
Hörsaal 1
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
1. Inwiefern kapseln Klassendefinitionen Daten und Funktionen? Welche Modifikatoren
können für Attribute und Methoden in Klassen verwendet werden, um die Sichtbarkeit zu
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?
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
141
Klausur – Beispiele für Klausuraufgaben
142
Klausur – Beispiele für Klausuraufgaben
class A {
int i = 1;
int m1() { return i; }
}
Betrachten Sie die folgenden drei Klassendiagramme bzw. die entsprechenden JavaKlassen- und Schnittstellendefinitionen. Vererbungsbeziehungen (extends) sind
durchgezogen, Implementierungsbeziehungen (implements) sind gestrichelt gezeichnet.
class B extends A {
int i = 2;
int m2() { return i; }
}
public class Test {
public static void main(String[] args) {
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
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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
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.
143
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
144
Klausur – Beispiele für Klausuraufgaben
Klausur – Beispiele für Klausuraufgaben
class A {
public void sayA() { System.out.println(“A“); }
}
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:
class B {
public void sayB() { System.out.println(“B“); }
}
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.
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.
class C {
public void sayC() { System.out.println(“C“); }
public class D {
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“.
Entwerfen Sie in Java geeignete Klassen bzw. Schnittstellen für die obige Aufgabe. Die
Klassen sollen entsprechende Attribute und Methoden enthalten.
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
145
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
146
Benutzerschnittstellen und Ereignisverarbeitung
Klausur – Beispiele für Klausuraufgaben
Gegeben seien die folgenden Ausschnitte aus zwei Java-Dateien B.java und A.java
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);
14.
}}
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);
15.
}}
Aufbau graphischer Benutzeroberflächen
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();
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
147
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
148
Aufbau graphischer Benutzeroberflächen
Aufbau graphischer Benutzeroberflächen
• Aufbauelemente / Bestandteile (statische Sicht):
• statische Sicht auf die Benutzerschnittstelle:
– 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)
– Aufbauelemente der Benutzerschnittstellenprogrammierung
• Fensterklassen
• Controls
• Steuerung visueller Eigenschaften (Styles, Ränder, Fraben etc.)
• Unterscheidung der Dialogelemente in
– Layout und Anordnung von Elementen
– 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.)
• dynamische Sicht
– Interaktion mit der Benutzerschnittstelle
– Verarbeiten von Ereignissen (Events)
– Benutzerschnittstelle als „Scharnier“ zwischen Benutzer und „dahinter“
liegender Systemfunktionalität
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
• 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
149
Oberflächenprogrammierung in Java
150
Java Foundation Classes (Swing)
• Graphical User Interface (GUI)
• 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
– intensive Anwendung der objektorientierten Programmierung
– Nutzung der Java-Klassenbibliotheken
• standardmäßig zwei verwendbare Klassenbibliotheken
– Abstract Window Toolkit (AWT, java.awt und Unterpakete)
• vorgefertige Klassen und Methoden für Dialoge, z.B.
– Java Foundation Classes (JFC, javax.swing und Unterpakete)
– File öffnen, speichern: JFileChooser()
– Warnungen und Fehlermeldungen: OptionPane.showMessageDialog()
• auch Swing-Bibliothek genannt (import javax.swing…)
• baut auf AWT auf
• seit Java 1.2 Standard
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
151
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
152
Übersicht über Pakete im Java AWT (einfaches GUI Toolkit)
Übersicht über Pakete in Java Swing
java.awt
Abstract Window Toolkit
(Benutzerschnittstellenprogrammierung)
javax.swing
Benutzerschnittstellenkomponenten von Swing/Java
Foundation Classes
java.awt.datatransfer
Datenübertragung zwischen Anwendungen
über die Zwischenablage (clipboard)
javax.swing.border
Klassen für die Generierung von Rändern um
Swing-Komponenten
java.awt.dnd
Funktionalität für die Unterstützung von drag &
drop-Operationen
javax.swing.colochooser Farbwahlkomponente und Farbauswahlmodelle
java.awt.event
Ereignisprogrammierung (Ereignisklassen,
Lauscherklassen, Adapterklassen)
java.awt.peer
Klassen, die die Schnittstelle zwischen den
AWT-Klassen und der aktuellen graphischen
Benutzerschnittstelle (z. B. MS-Windows, OSFMotif etc.)
bilden
java.awt.print
javax.swing.event
Hilfsklassen für die Druckausgabe von AWT Komponenten
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
153
Ü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)
Zusatzklassen für die Ereignisverarbeitung in Swing
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
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
154
Component und Container
Die Klassenhierarchie des Paktes java.awt sieht zwei grundlegende
Klassen vor, die die gemeinsame Basisfunktionalität der GUIElemente enthalten
– java.awt.Component
Wurzelklasse aller GUI-Komponenten (auch der Java Swing-Klassen)
Komponentenarchitektur von Java GUIs
– java.awt. Container
Wurzelklasse der Containertypen
javax.beans
Komponentenentwicklung (Java Beans)
javax.beans.beancontext
Beschreibung eines bean context, d.h. eines
Behälters für Java Beans
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
155
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
156
Wichtige GUI-Elemente der Swing-Bibliothek
Component und Container
• Normales Fenster:
• Component enthält z. B. alle erforderlichen Methoden für die
Manipulation des visuellen Erscheinungsbildes einer Komponente
–
–
–
–
–
– JFrame
• Menüleiste:
setForeground
setBackground
getFont
setFont
...
– JMenuBar
• Menüelement:
– JMenuItem
• Bedienelemente:
–
–
–
–
–
–
–
• 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
...
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
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
157
Layouts
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
158
Implementierung von Benutzerschnittstellen (statisch)
Anordnung der Bedienelemente (Beispiele)
• Objektorientierung
– GUI-Elemente als Felder einer Klasse
– Spezialisierung (Subklassen) von GUI-Elementklassen, z.B. spezielle Fenster,
spezielle Controls
• BorderLayout:
• Strukturierung
• FlowLayout (GUI-Objekte werden nebeneinander angeordnet)
– durch Container und Components
– Container können Komponenten und auch Container enthalten
• GridLayout (alle Bereiche gleich groß!)
• CardLayout
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
159
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
160
Ereignisauslösung und -verarbeitung
Implementierung von Benutzerschnittstellen (dynamisch)
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.:
• 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
– Mausbewegung,
– Tastendruck (Keyboard/Maus),
– Scrolling, etc.
• Ereignisquellen erzeugen Ereignisse (z. B. durch Benutzeraktionen)
• Lauschobjekte (Listener) bekommen Ereignisobjekte zugeführt und
verarbeiten sie
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)
• Eine zentrale System Event Queue
– überwacht die Benutzerschnittstelle und fängt Ereignisse ab
– verteilt die Ereignisse an die registrierten Ereignislauscher (Event-Listener)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
161
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
162
Ereignistypen (Beispiele)
Ereignisverarbeitung
• Einfache Ereignisse wie Mausbewegung oder Tastendruck:
– Component ComponentEvent
FocusEvent, KeyEvent, MouseEvent, MouseMotionEvent, …
– Dialog, Frame WindowEvent
• Auswertung von Events mittels des Listener-Konzepts
(Implementierung von Schnittstellen mit Event-Handlern)
– java.awt.event
• Interaktionen
–
–
–
–
–
–
–
• 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);
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
163
Button ActionEvent
MenuItem ActionEvent
List ActionEvent, ItemEvent
Choice ItemEvent
CheckBox ItemEvent
CheckboxMenuItem ItemEvent
ScrollBar AdjustmentEvent
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
164
Beispiel: Scribble (Wdh.)
Adapterklassen
public class Scribble extends Applet
implements MouseListener, MouseMotionListener {
private int last_x, last_y;
public
public
public
public
public
public
• Problem:
void mouseClicked(MouseEvent ev) {}
void mouseReleased(MouseEvent ev) {}
void mouseEntered(MouseEvent ev) {}
void mouseExited(MouseEvent ev) {}
void mouseMoved(MouseEvent ev) {}
void mousePressed (MouseEvent ev) {
last_x = ev.getX();
last_y = ev.getY();
– GUI-Elemente müssen als Listener für verschiedene Ereignisse registiert werden
– Interface-Konzept erfordert Implementierung aller Interface-Methoden (meist mit
leerem Rumpf)
}
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);
}
• 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)
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
165
Adapterklassen (Beispiel)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
166
Model-View-Control (MVC)
• Anwendungsbereich
– Komplexe GUI-Applikationen
Schnittstelle WindowListener
Ereignismethoden:
void
void
void
void
void
void
void
windowActivated(WindowEvent e)
windowClosed(WindowEvent e)
windowClosing(WindowEvent e)
windowDeactivated(WindowEvent e)
windowDeiconified(WindowEvent e)
windowIconified(WindowEvent e)
windowOpened(WindowEvent e)
• Aufteilen in logische Einzelkomponenten (Objekte)
Adapterklasse
public abstract class WindowAdapter
extends Object
implements WindowListener,
WindowStateListener,
WindowFocusListener {
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) {}
…
}
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
167
– Datenmodell (model)
– Ansicht (view)
– Steuerung (control)
• Zweck
– Trennung des Anwendungsobjekts (model) von der Art seiner Repräsentation (view)
beim Benutzer und der Weise, in der es von ihm beeinflusst wird (controller)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
168
Model-View-Control (Kommunikation der Objekte)
Registrieren der Observer beim Observable
• 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(...)
• 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(...)
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
169
Registrieren der Observer beim Observable
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
171
Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009)
170
Herunterladen