Objektorientierte Programmierung in Javawg/Lehre/Vorlesung-SS2009/... · Vorlesung an der...

43
Objektorientierte Programmierung in Java Vorlesung an der Fachhochschule Kiel Vorlesung an der Fachhochschule Kiel Sommersemester 2009 PD Dr. Wolfgang Goerigk Dr. Wolfgang Goerigk b+m Informatik AG Rotenhofer Weg 20, 24109 Melsdorf [email protected] [email protected] Organisatorisches 04340 – 404 1423 0160 – 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

Transcript of Objektorientierte Programmierung in Javawg/Lehre/Vorlesung-SS2009/... · Vorlesung an der...

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)