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 Klausur – Beispiele für Klausuraufgaben Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 146 Benutzerschnittstellen und Ereignisverarbeitung 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 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 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) 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 lösen Ereignisse (Events) aus • Grundprinzip notification-based event delegation – ein Ereignis wird nur der Komponente zugeführt, die für dieses Ereignis als sog. Lauschobjekt (Listener) registriert ist – Mausbewegung, – Tastendruck (Keyboard/Maus), – Scrolling, etc. • Ereignisquellen erzeugen Ereignisse (z. B. nach 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 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 161 Ereignisverarbeitung Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 162 Ereignistypen • Einfache Ereignisse wie Mausbewegung oder Tastendruck: – Component ComponentEvent FocusEvent, KeyEvent, MouseEvent, MouseMotionEvent, … – Dialog, Frame WindowEvent • Auswertung von Events mittels Listener – 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 Adapterklassen public class Scribble extends Applet implements MouseListener, MouseMotionListener { private int last_x, last_y; public public public public public public 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(); • Problem: – 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, in muss nur die benötigte Methode implementieren – Realisierung des Adapters oft als anonymes Objekt / anonyme Klasse } 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