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