Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Prof. Dr.-Ing. Holger Vogelsang Informatik 2 Einführung in Java und UML.

Ähnliche Präsentationen


Präsentation zum Thema: "Prof. Dr.-Ing. Holger Vogelsang Informatik 2 Einführung in Java und UML."—  Präsentation transkript:

1 Prof. Dr.-Ing. Holger Vogelsang Informatik 2 Einführung in Java und UML

2 Holger Vogelsang Inhaltsverzeichnis n Roter Faden (4) Roter Faden (4) n Übersicht (6) Übersicht (6) n Übersicht: (8) Übersicht: (8) n Übersicht (9) Übersicht (9) n Arbeitsschritte und Software (14) Arbeitsschritte und Software (14) n Imperative Aspekte (35) Imperative Aspekte (35) n Klassen und Objekte (46) Klassen und Objekte (46) n Fehlererkennung (91) Fehlererkennung (91) n Zusicherungen (98) Zusicherungen (98) n Klassen und Objekte (111) Klassen und Objekte (111) n Überladen von Methoden (121) Überladen von Methoden (121) n Vererbung (126) Vererbung (126) n Überschreiben von Methoden (156) Überschreiben von Methoden (156) n Vererbung (183) Vererbung (183) n Generische Klassen (189) Generische Klassen (189) Informatik 2 - Einführung in Java und UML2

3 Holger Vogelsang Inhaltsverzeichnis n Generische Methoden (197) Generische Methoden (197) n Aufzähltypen (202) Aufzähltypen (202) n Regeln und Hinweise (208) Regeln und Hinweise (208) n Klassendiagramme (220) Klassendiagramme (220) n Fehlerbehandlung mit Ausnahmen (275) Fehlerbehandlung mit Ausnahmen (275) n Pakete (291) Pakete (291) Informatik 2 - Einführung in Java und UML3

4 Holger Vogelsang Roter Faden Informatik 2 - Einführung in Java und UML4 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

5 Holger Vogelsang Roter Faden Informatik 2 - Einführung in Java und UML5 Grafische Oberflä- chen ÜbersichtLayoutsWidgets Zeichen- operationen Grafik- widgets Effekte, Animationen Offene Punkte Ereignisse Daten- strukturen ADTs Elementare Datenstrukturen Hash- tabellen BäumeGraphenIteratoren Datenstrukturen in Java Typinfo., I/O Annota- tionen Laufzeit- typinfo. Ein-, Ausgabe Entwurf Prinzipien Verbindung von Modulen OSGiSpring

6 Holger VogelsangInformatik 2 - Einführung in Java und UML6 Übersicht Literatur Java n Christian Ullenboom: u Java ist auch eine Insel, Galileo Computing (auch frei als Open-Book unter u Java 7 – Mehr als eine Insel, Galileo Computing n D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger: Grundkurs Programmieren in Java, Hanser- Verlag n R. C. Martin: Clean Code, mitp Objektorientierung allgemein n B. Lahres, G. Raýman: Objektorientierte Programmierung, Galileo Computing (auch frei als Open-Book unter Konfigurationsmanagement und Build-Systeme n G. Popp: Konfigurationsmanagement mit Subversion, Maven und Redmine, dpunkt

7 Holger VogelsangInformatik 2 - Einführung in Java und UML7 Übersicht Literatur UML (Objekt- und Klassendiagramme) n M. Jeckle, C. Rupp, J. Hahn, B. Zengler, S. Queins: UML 2 - glasklar, Hanser-Verlag n C. Kecher: UML 2.0 – Das umfassende Handbuch, Galileo Computing JavaFX 2 n C. Dea: JavaFX 2.0: Introduction by Example, Apress n J. L. Weaver: Pro JavaFX 2: A Definitive Guide to Rich Clients with Java Technology, Apress n Datenstrukturen n G. Saake, K. Sattler: Datenstrukturen und Algorithmen: Eine Einführung mit Java, dpunkt Spring n C. Walls: Spring im Einsatz (3. Auflage), Hanser-Verlag (deutsch) oder Spring in Action (Third Edition), Manning (englisch) OSGi n B. Weber, P. Baumgartner, O. Braun: OSGi für Praktiker, Hanser-Verlag n G. Wütherich, N. Hartmann, B. Kolb, M. Lübken: Die OSGI Service Platform, dpunkt

8 Holger VogelsangInformatik 2 - Einführung in Java und UML8 Übersicht: Änderungen zum Sommersemester 2013 n veränderte Reihenfolge n kleinere Anpassungen

9 Holger VogelsangInformatik 2 - Einführung in Java und UML9 Übersicht Hinweise Markierungen n Expertenkapitel (nicht klausurrelevant): n Tafel-/ Rechnerübungen:Längeres Beispiel: n Pacman-Beispiel:

10 Holger Vogelsang Übersicht Historie im Informatikstudium n Bekannt sind aus Informatik 1: u Datentypen u Prozedurale Elemente u einfache Klassen u Arrays u Algorithmen zum Suchen und Sortieren Informatik 2 - Einführung in Java und UML10

11 Holger Vogelsang Übersicht Entwicklungsumgebungen n Java-Entwicklung u Eclipse: mit zusätzlichen Plugins:http://www.eclipse.org Findbugs: In Eclipse Help Eclipse Marketplace, Findbugs im Suchfeld eingeben und Findbugs Eclipse Plugin installieren Checkstyle zur Überprüfung der Code-Konventionen: In Eclipse Help Eclipse Marketplace, Checkstyle im Suchfeld eingeben und Checkstyle Plug-in installieren SVN Team Provider: In Eclipse Help Eclipse Marketplace, SVN im Suchfeld eingeben und Subversive SVN Team Provider installieren SVN Connector: In Eclipse Help Install New Software Add… SVN- Connector mit der Update Site ler-site/ eingeben OK Im Baum links SVNKit Implementation sowie SVN Connectors auswählen und installieren. ler-site/ u Netbeans: u IntelliJIDEA (freie Community-Version): Informatik 2 - Einführung in Java und UML11

12 Holger Vogelsang Übersicht Entwicklungsumgebungen, Durchgängiges Beispiel: Pacman-Klon n UML: u Visual Paradigm, siehe im Ilias unter https://ilias.hs-karlsruhe.de/repository.php?ref_id=32415&cmd=&rep_frame=1 u UML Lab, siehe im Ilias unter https://ilias.hs-karlsruhe.de/repository.php?ref_id=32415&cmd=&rep_frame=1 n Java und die Datenstrukturen werden anhand eines kleinen Spielfragmentes erläutert, einer Variation von Pacman: u nur einen Level u verändertes Spielfeld u andere Punktezählung u veränderter interner Aufbau, um alle wichtigen Techniken zeigen zu können u fehlende Spielelemente des Originals u teilweises anderes Verhalten der Figuren u Vektor- statt Pixelgrafik u plattformunabhängige Implementierung mit JavaFX Informatik 2 - Einführung in Java und UML12

13 Holger Vogelsang Übersicht Durchgängiges Beispiel: Pacman-Klon n Spielfeld: n Spielende: Pacman wurde von einem Geist gefressen, oder alle Essensrationen sind von Pacman gefressen worden. Informatik 2 - Einführung in Java und UML13 Geist Pacman Essen Kirsche (Geister werden für eine gewisse Zeit ungefährlich und können gefressen werden) Tor zur anderen Seite

14 Holger Vogelsang Arbeitsschritte und Software Übersicht Informatik 2 - Einführung in Java und UML14 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

15 Holger VogelsangInformatik 2 - Einführung in Java und UML15 Arbeitsschritte und Software Motivation n Bekannt aus Informatik 1: Schreiben einfacher Java-Programme n Wie kann der Quelltext verwaltet werden?

16 Holger VogelsangInformatik 2 - Einführung in Java und UML16 Arbeitsschritte und Software Ausführbares Programm Erzeugen eines ausführbaren Programmes Quellcode Pacman.java Quellcode Cherry.java Quellcode Ghost.java Bytecode Pacman.class Compiler Archiv (Pacman.jar) jar Compiler Bytecode Ghost.class Bytecode Cherry.class Manifest.mf Bilder/… Manifest-Version: 1.0 Main-Class: de.Main

17 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung n Warum sollen die Quelltexte nicht nur im Dateisystem des Entwicklers liegen? u Gruppenarbeit: -Viele Entwickler arbeiten an einem Programm Zugriff auf deren Quelltexte. -Was haben die anderen Entwickler gemacht oder geändert? -Was habe ich an dem aktuellen Projekt geschrieben? u Verbesserung der eigenen Arbeitsmöglichkeiten: -Automatisierte Sicherung: Was passiert bei Zerstörung der lokalen Daten? -Wiederherstellung eines alten Standes, wenn der neue kaputtprogrammiert wurde Undo zu einer bekannten Version u Wieso sollen mehrere Versionen eines Programmes gepflegt werden? -Anpassungen für Kunden -Arbeit an alter Version (Korrekturen) und neuer Version (Erweiterungen) -Vergleich unterschiedlicher Versionen was hat sich geändert? u Jede neue Version einer Datei erhält eine Versionsnummer. n Ziel: Speicherung in einem zentralen Repository. Informatik 2 - Einführung in Java und UML17

18 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung n Einflüsse während der Programmentwicklung: Informatik 2 - Einführung in Java und UML18 Projekt viele Entwickler viele Versionenviele unterschiedliche Arbeitsplätze viele Klassen und Dokumente

19 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung n Grafischer Versionsvergleich: Informatik 2 - Einführung in Java und UML19

20 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung n Lösung: Unterstützung der Entwicklung durch eine Versionsverwaltung. Auswahl: u RCS/CVS: veraltet u SVN: sehr häufig im Einsatz, ein zentraler Server u Git: manchmal als Nachfolger von SVN gesehen, verteilte Datenhaltung auf mehreren Servern, oft in Open-Source-Projekten, in Firmen noch selten anzutreffen u Team Foundation Server: reine Microsoft-Lösung n In Informatik 2 und im Softwarelabor: Arbeit mit Subversion (SVN) n Genauere Einführung z.B. unter Informatik 2 - Einführung in Java und UML20

21 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung n Interne Speicherung im Repository: u Es wird normalerweise nicht jede Version komplett abgelegt. u Statt dessen speichert ein Repository die Unterschiede (Deltas). u Subversion kennt beide Varianten + komplette Speicherung nach Bedarf. Informatik 2 - Einführung in Java und UML21 Rückwärtsdelta: schnelleres Auslesen Version 5 (aktuell) als vollständige Datei Vorwärtsdelta: schnelleres Schreiben Version 4 Version 3 Version 2 Version 1 (alt) als vollständige Datei Version 2 Version 3 Version 4 Version 5 Deltas

22 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung n Wichtigste Aktionen für die Arbeit mit Subversion: u Share: einmalig Projekt im Repository anlegen, eventuell lokales Projekt übergeben u Check out (einmalig für ein Projekt): Projekt aus dem Repository in ein lokales Verzeichnis kopieren u Commit: lokal erzeugte Änderungen im Repository ablegen u Update: zwischenzeitliche Änderungen im Repository in das lokale Verzeichnis übernehmen n Für alle Schritte gibt es Kommandozeilenwerkzeuge sollen hier nicht betrachtet werden. n Die wichtigsten lassen sich auch mit IDE-Plugins durchführen. Informatik 2 - Einführung in Java und UML22

23 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Installation in Eclipse) Arbeit mit SVN Jetzt kann mit Window Open Perspective SVN Repository Exploring die Ansicht aller SVN-Server angezeigt werden (ist leer). Im rechten Fenster SVN Repositories lässt sich durch Rechtsklick mit New Repository Location ein neuer Server einrichten. n Für den an der Hochschule müssen Sie folgendes eintragen: URL: / : Ihr IZ-Benutzername u Als Nutzernamen und Password geben Sie Ihren IZ-Account ein. Save authentication ist auf eigenen Rechnern ganz praktisch, damit Sie sich nicht immer neu anmelden müssen. Informatik 2 – Versionsverwaltung mit SVN23

24 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Projekt anlegen) Projekt anlegen n Wenn das Projekt bisher nur lokal existiert, muss es im Repository angelegt werden. n Dann können alle anderen Entwickler mit der entsprechenden Berechtigung darauf zugreifen. Informatik 2 - Einführung in Java und UML24 ProjektXYZ Repository auf dem Server mit dem neuen Projekt ProjektXYZ share /ProjektXYZ/trunk Projekt auf dem lokalen Arbeitsplatz-PC Repository RootProjekt-Pfad

25 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Projekt anlegen) n Ablauf in Eclipse: u Rechtsklick auf das Projekt Dann Team und Share Project auswählen. SVN und im nächsten Dialog Ort des Repositorys auswählen, Simple Mode ist für uns ausreichend Kommentar eingeben und auf Finish klicken n Empfohlener Aufbau eines Projektarchivs (Repository) auf dem Server: /Projektname/trunk : Hauptentwicklungslinie des Projektes /Projektname/branches : Alternative Entwicklungen wie z.B. spezielle Anpassungen für einen Kunden, Wechsel auf neue Technologie, … /Projektname/tags : Kopie der Hauptentwicklungslinie oder einer Verzweigung zu einem bestimmten Zeitpunkt. -Wird z.B. angelegt, wenn eine neue Version an den Kunden ausgeliefert wird. Dann kann ein Tag mit dem Namen der Version erzeugt wird (Version 1.0). -Ein Tag hat keine bestimmte Bedeutung. Er erlaubt aber, bestimmte Versionen mit einem leicht erkennbaren Namen zu versehen. Informatik 2 - Einführung in Java und UML25

26 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Check out) Checkout: Daten aus dem Repository auf den lokalen PC kopieren (einmalig) Informatik 2 - Einführung in Java und UML26 Entwickler lokale Kopie des Quelltextes Repository auf dem Server mit allen Versionen des Quelltextes + zusätzlichen Binärdateien Check out

27 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Check out) n Ablauf in Eclipse: Wechsel in die Ansicht SVN Repository Exploring u Rechtsklick auf die gewünschte Version des Projektes Check Out wählen u Arbeit auf der lokalen Kopie des Projektes Informatik 2 - Einführung in Java und UML27

28 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Commit) Commit: Lokale Änderungen in das Repository übertragen Informatik 2 - Einführung in Java und UML28 Entwickler lokale Kopie des Quelltextes Repository auf dem Server mit allen Versionen des Quelltextes + zusätzlichen Binärdateien Änderungen eintragen, Konflikte lösen

29 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Commit) n Ablauf in Eclipse: u Nach den lokalen Änderungen übertragen die Entwickler die neuen Daten in das Repository. u Rechtsklick auf das Projekt (z.B. in der Java-Ansicht) oder Rechtsklick auf einzelne Pakete/Klassen Dann Team und Commit auswählen. u Die Änderungen sollten unbedingt mit einem Kommentar versehen werden. Der Kommentar beschreibt, was an der Datei geändert wurde (Fehler xyz behoben, …). Nur geänderte Daten werden geschrieben. Sie erhalten dabei eine neue Versionsnummer (siehe SVN Repository Explorer ). u Was passiert, wenn ein anderer Entwickler die Datei bereits verändert hat? Es ist eine Konfliktbehandlung erforderlich. Informatik 2 - Einführung in Java und UML29

30 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Commit) n Konfliktbehandlung: 1.Kopieren-Ändern-Zusammenführen-Modell -Auschecken einer Version aus dem Projektarchiv: Eine Kopie der Daten wird auf den Client kopiert. -Arbeit auf den Client-Dateien -Einchecken der Änderungen auf den Server: Die Änderungen werden dort gespeichert, Konflikte müssen behoben werden. Konflikte? Was passiert, wenn ein anderer Entwickler dieselbe Datei verändert hat? Möglichkeiten: –Änderungen zusammenführen –eigene Datei überschreibt die auf dem Server –eigene Änderungen werden verworfen –… Der SVN-Client hilft beim Zusammenführen beider Versionen. Informatik 2 - Einführung in Java und UML30

31 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Commit) 2.Sperren-Ändern-Entsperren-Modell -Zur Konfliktvermeidung lassen sich Dateien auf dem Server gegen Änderung sperren nicht sehr gerne gesehen (insbesondere wenn Sie in den Urlaub fahren und die Sperre vergessen). -Bei Binärdateien, die nicht sinnvoll zusammengeführt werden können, ist das Modell aber durchaus sinnvoll. -Häufig kann ein Administrator Sperren wieder entfernen. -Verwendung: Rechtsklick auf eine Datei oder ein Verzeichnis, Team und Lock… auswählen. Danach die Dateien bearbeiten. Abschließend nach einem Commit mit Team und Unlock… wieder freigeben. n In der Praxis hat sich gezeigt, dass das Kopieren-Ändern-Zusammenführen-Modell wenig Probleme bereitet: Nicht jeder Entwickler arbeitet gleichzeitig an allen Projektteilen. Informatik 2 - Einführung in Java und UML31

32 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Update) Update: Zwischenzeitliche Änderungen aus dem Repository übernehmen Informatik 2 - Einführung in Java und UML32 Entwickler lokale Kopie des Quelltextes Repository auf dem Server mit allen Versionen des Quelltextes + zusätzlichen Binärdateien Update

33 Holger Vogelsang Arbeitsschritte und Software Versionsverwaltung (Update) n Während der Arbeit oder nach einer Pause haben andere Entwickler eventuell neue Versionen im Repository abgelegt. n Vor einer Änderungen in der eigenen lokalen Kopie sollte sie aktualisiert werden, damit nicht ein alter Stand verändert wird. n Ablauf in Eclipse: Rechtsklick auf ein Paket, eine Klasse, eine Ressource oder das Projekt, dann Team und Synchronize with Repository auswählen. u Eine weitere Ansicht zeigt die Änderungen, die übernommen werden können. n Weitere Funktionen: siehe weiterführende Literatur (insbes. Merge verschiedene Entwicklungszweige und Kollisionsbehandlung beim Commit) Informatik 2 - Einführung in Java und UML33

34 Holger Vogelsang Imperative Aspekte Übersicht Informatik 2 - Einführung in Java und UML34 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

35 Holger VogelsangInformatik 2 - Einführung in Java und UML35 Imperative Aspekte Motivation n Wie sollte der Quelltext formatiert sein? n Zusammenhang zwischen primitiven Datentypen und Klassen n Wie kann die falsche Verwendung von Funktionen und Algorithmen zur Laufzeit erkannt werden? n Als bekannt vorausgesetzt: Schleifen, Abfragen, lokale Variable

36 Holger VogelsangInformatik 2 - Einführung in Java und UML36 Imperative Aspekte Formatierung des Quelltextes Hinweise zur Formatierung n Der Compiler ignoriert jegliche Formatierung des Quelltextes. n Ein Programmierer benötigt dringend eine gut lesbare Struktur! n Beispiel: public V(){for(int i=0;i<3;i++)v[i]=0;} public Vector() { for (int i = 0; i < getSize(); i++) { values[ i ] = 0.0; } Die erste Variante ist nicht effizienter, nur komplett unleserlich. n Erleichtern Sie sich und Ihren Kollegen die Arbeit (lassen Sie ein Programm 3 Jahre liegen und schauen Sie es sich dann wieder an). n Einhaltung der Java-Code-Konventionen Checkstyle hilft Ihnen! lesbar

37 Holger VogelsangInformatik 2 - Einführung in Java und UML37 Imperative Aspekte Einige Regeln zur Formatierung des Quelltextes Einige ganz einfache Regeln n Anfangs- und Endklammern eines Blocks immer in dieselbe Spalte setzen oder die Endklammer an das Ende der Zeile davor. n Den Inhalt eines Blockes immer entweder um einen Tabulator oder eine gleiche Anzahl von Leerzeichen einrücken. n Beispiel: for (int i = 0; i < 10; i++) { Blockinhalt } n Selbsterklärende Variablen- und Methodennamen verwenden. n Großzügig Leerzeilen zwischen verschiedene Blöcke einfügen, um logisch getrennte Einheiten optisch anzuzeigen. n Großzügig Leerzeichen zur Formatierung einfügen. n Reihenfolgen der Operatoren durch Klammerungen optisch hervorheben. Sinnvolle Kommentare verwenden (nicht einfach: Hier wird x erhöht.) n Siehe auch: (The International Obfuscated C Code Contest)http://www.ioccc.org/

38 Holger VogelsangInformatik 2 - Einführung in Java und UML38 Imperative Aspekte Konstanten: String und Zeichen String- und Zeichenkonstanten im Unicode-Format Zeichenkonstanten: char, z.B.: 'A', numerischer Wert = 65 Stringkonstanten: Folge von char, z.B.: "ABD". Beispiele ZeichenBedeutungNum. Wert A Großbuchstabe A65 Leerzeichen32 0 Ziffer 048 \xdd dd = Num. Wert eines Zeichens im Hexadezimalsystem\xdd \ddd Eine Folge von 1, 2 oder 3 oktalen Ziffern\ddd

39 Holger VogelsangInformatik 2 - Einführung in Java und UML39 Imperative Aspekte Konstanten: String und Zeichen Vordefinierte Sonderzeichen ZeichenBedeutungNum. Wert \\ Das Zeichen \ selbst (ein Backslash).92 \" Das Zeichen " 34 \' Das Zeichen ' 39 \b Rückwärts Löschen, Backspace, BS8 \f Seitenvorschub, form-feed, FF12 \n Zeilenvorschub, new line oder line feed, LF10 \r Wagenrücklauf, carriage return, CR13 \t Horizontaler Tabulator, HT9

40 Holger Vogelsang Imperative Aspekte Konstanten: String und Zeichen (Pacman-Beispiel) n Beschreibung des Spielfeldes im Quelltext durch eine Zeichenkette n Die Zeichenkette wird später eingelesen, um die einzelnen Objekte zu erzeugen. String[] fieldLayout = { ".....* *.....", "o***.*.*******.*.***o", " C ", "**.*.****.*.****.*.**", " *.*.*....*.*....*.* ", "**.*.****.*.****.*.**", "E.*......*......*. E", "**.*** ******* ***.**", " *. 0.* ", " *.*** ###-### ***.* ", " *.* #2 1 3# *.* ", "**.* * ###-### * *.**", "E. * C *. E", "**.****** * ******.**", ".*..... *.....*.", ".*.***.*******.***.*.", " P ", // usw. }; Informatik 2 - Einführung in Java und UML40 ZeichenBedeutung des Feldes C enthält eine Kirsche (Cherry) * kann nicht betreten werden Nummer des Geistes E mit Ausgang (Exit) auf die andere Seite # ist Gefängnisumrandung (entspricht hier '*' ) o mit Energiepaket (nicht verwendet) P mit Pacman Ohne Angabe: leeres Feld. mit Essensportion

41 Holger Vogelsang Imperative Aspekte Konstanten: String und Zeichen (Pacman-Beispiel) String[] fieldLayout = { ".....* *.....", "o***.*.*******.*.***o", " C ", "**.*.****.*.****.*.**", " *.*.*....*.*....*.* ", "**.*.****.*.****.*.**", "E.*......*......*. E", "**.*** ******* ***.**", " *. 0.* ", " *.*** ###-### ***.* ", " *.* #2 1 3# *.* ", "**.* * ###-### * *.**", "E. * C *. E", "**.****** * ******.**", ".*..... *.....*.", ".*.***.*******.***.*.", " P ", ".***.****.*.****.***.", // usw. }; Informatik 2 - Einführung in Java und UML41

42 Holger VogelsangInformatik 2 - Einführung in Java und UML42 Imperative Aspekte Parameterübergabe per Wert bei primitiven Datentypen Parameterübergabe per Wert (Call by Value) n Werte primitiver Datentypen werden immer per Wert übergeben. Es wird eine lokale Kopie erzeugt. Änderungen am Wert innerhalb einer Methode wirken nicht nach außen. Beispiel: public void doSomething(int xx){ xx = 2; } public int doSomethingElse(){ int x = 21; doSomething(x); System.out.println(x); return 0; } Ausgabe: 21

43 Holger VogelsangInformatik 2 - Einführung in Java und UML43 Imperative Aspekte Parameterübergabe per Referenz bei Objekten Parameterübergabe per Referenz (Call by Reference) n Objekte werden immer per Referenzen übergeben werden. Damit sind Änderungen nach außen sichtbar. Beispiel: public void doSomething(Bruch br){ br.setZaehler(42); } public int doSomethingElse(){ Bruch br = new Bruch(21, 3); doSomething(br); System.out.println(br.getZaehler()); return 0; } Ausgabe: 42 n Zusatznutzen einer Referenzübergabe: Das Anlegen einer Kopie kann zeitaufwändig sein.

44 Holger VogelsangInformatik 2 - Einführung in Java und UML44 Imperative Aspekte Ergebnisrückgabe n Es gilt dasselbe wie bei Übergaben: u Werte primitiver Datentypen werden als Kopie und u Objekte per Referenz zurückgegeben.

45 Holger Vogelsang Klassen und Objekte Übersicht Informatik 2 - Einführung in Java und UML45 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Typinforma- tionen Ein-, Ausgabe Objekt- orientierung Annota- tionen Laufzeit- typinfo. Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

46 Holger VogelsangInformatik 2 - Einführung in Java und UML46 Klassen und Objekte Objekte Einige Objekte im Pacman-Spiel n Pacman n die Geister 1 bis 4 n einzelne Kirschen n das Spielfeld Einige Eigenschaften von Objekten (Zustandsinformationen) n Pacman: bewegt sich nach oben, öffnet den Mund n Geist 1: ist gefährlich, befindet sich auf Zelle (2,3), bewegt sich nach unten und hat eine gewisse Intelligenz n Geist 2: ist gefährlich, befindet sich auf Zelle (12,5), bewegt sich nach links und hat ebenso eine gewisse Intelligenz

47 Holger VogelsangInformatik 2 - Einführung in Java und UML47 Klassen und Objekte Objekte Objekte kommunizieren (Verhalten) n Das Spielfeld sagt zu Pacman: Bewege Dich nach oben Quellobjekt (Spielfeld) schickt dem Ziel (Pacman) eine Nachricht. Objekte unterscheiden sich (Identität) n Geist 1 ist nicht Geist 2. n Alle Objekte sind eindeutig unterscheidbar!

48 Holger VogelsangInformatik 2 - Einführung in Java und UML48 Klassen und Objekte Objekte Definition: Objekt Ein Objekt ist eine konkret vorhandene Einheit mit folgenden Merkmalen: u Identität: Alle Objekte lassen sich eindeutig unterscheiden (z.B. durch die Referenz). u Zustand (Daten): -Alle Attributwerte des Objektes. Der Typ der Attribute wird durch die Klasse festgelegt. -Der Zustand ist nur durch das Objekt selbst veränder- und sichtbar, nicht aber von außen. -Beziehungen zu anderen Objekten. u Eigenschaften (Properties): -Sie können von außen abgefragt werden. -Sie werden unter Umständen aus Daten berechnet, sind aber selbst keine Daten (z.B. Alter = Datum - Geburtsdatum). u Verhalten: Festgelegt durch Methoden der Klasse des Objektes.

49 Holger Vogelsang Klassen und Objekte Objekte Vereinfachte Darstellung von Objekten in UML: Informatik 2 - Einführung in Java und UML49 geist1: Geist x = 2 y = 3 IQ = 70 direction = DOWN /nextX Name des Objektes und Name der Klasse Zustand (Daten) Eigenschaften (Properties) {if (direction == DOWN) nextX = max(x-1, 0)} Einschränkungen (Constraints)

50 Holger VogelsangInformatik 2 - Einführung in Java und UML50 Klassen und Objekte Klassen Objekte haben Gemeinsamkeiten Alle Geister haben Daten x, y und direction mit entsprechenden Werten und eine berechnete neue X-Position direction hat bei jedem Geist denselben Typ. Zusammenfassung von Objekten gleicher Eigenschaften zu Klassen Geist 1 und 2 gehören zur Klasse Ghost : u gleiche Attribut- und Eigenschaftstypen u gleiches Verhalten Definition: Klasse (im Implementierungsmodell) Eine Klasse ist die Definition der Attribut-, Eigenschaftstypen und Operationen einer Menge von Objekten.

51 Holger VogelsangInformatik 2 - Einführung in Java und UML51 Klassen und Objekte Klassen Definition: Attribut (auch Instanzvariable genannt) n Ein Attribut ist eine Eigenschaft eines Objektes, die von außen abgefragt werden kann. n Es kann ein Datenelement oder ein berechneter Wert (=abgeleitetes Attribut) sein. n Ein Attribut kommt in allen Objekten der Klasse vor. n Der Wert des Attributs kann in den Objekten unterschiedlich ausfallen. n Ein Attribut kann nicht ohne das zugehörige Objekt leben. n Ein Attribut hat keine Identität. In der Vorlesung wird der Begriff Attribut immer für ein Datenelement verwendet.

52 Holger Vogelsang Klassen und Objekte Klassen Definition: Operation n Eine Operation legt fest, welche Funktionalität ein Objekt bereitstellt. n Unterstützt ein Objekt eine bestimmte Operation, so sichert es einem Aufrufer zu, dass es bei einem Aufruf die Operation ausführen wird. n Durch die Operation wird die Syntax des Aufrufs vorgegeben (Typen der Parameterwerte). n Die Operation gibt Zusicherungen darüber, welche Resultate die Operation haben wird. n Die Operation beinhaltet keine Implementierung. Sie beschreibt lediglich Schnittstelle (Signatur) und Zusicherung nach außen. Informatik 2 - Einführung in Java und UML52

53 Holger Vogelsang Klassen und Objekte Klassen Definition: Methode n Eine Methode ist die konkrete Implementierung einer Operation. n Während Operationen die Funktionalität nur abstrakt definieren, sind Methoden für die Realisierung dieser Funktionalität zuständig. n In der Vorlesung wird die strenge Kategorisierung von Methode und Operation nicht immer aufrechterhalten. n Hier wird häufig Methode als Synonym für beide Begriffe verwendet. n Operation wird dort verwendet, wo es speziell auf den reinen Signaturcharakter ankommt. Informatik 2 - Einführung in Java und UML53

54 Holger VogelsangInformatik 2 - Einführung in Java und UML54 Beispiel zu Klasse und Objekt (unvollständiges Beispiel) Klassen und Objekte Klassen und Objekte (Pacman-Beispiel) Attribute Klassenname Operationen Attributwerte Ghost -x: int -y: int -direction: Direction +setX(x: int) +setY(y: int) +paint(p: JPanel, cellWidth: int, cellHeight: int) geist1: Ghost x = 2 y = 3 direction = UP geist2: Ghost x = 12 y = 3 direction = DOWN

55 Holger VogelsangInformatik 2 - Einführung in Java und UML55 Klassen und Objekte Objektorientierte Sichtweise Idee der Kapselung (Information hiding) n Die Implementierung der Datenstrukturen und Algorithmen innerhalb einer Klasse wird gegenüber den Aufrufern versteckt. Sie kann nach außen unsichtbar verändert werden. Objekt Aufruf Attribute Methoden

56 Holger VogelsangInformatik 2 - Einführung in Java und UML56 Klassen und Objekte Objektorientierte Sichtweise (Pacman-Beispiel) Beispiel: Kapselung des Geistes in einer Klasse Ghost setX setY paint x y direction

57 Holger Vogelsang Klassen und Objekte Objektorientierte Sichtweise n Vorteile der Kapselung: u Interne Zustände und deren Abhängigkeiten bleiben nach außen verborgen Leichtere Konsistenzhaltung der Daten. u Bei Zustandsänderung müssen häufig noch andere Operationen ausgeführt werden. Beispiel: -Im Pacman-Spiel wird die Farbe einer Figur geändert. Die Farbe ist ein Attribut der Figur. -Danach muss die Figur neu gezeichnet werden. -Bei sauberer Kapselung wird durch die Farbänderung automatisch das Neuzeichnen ausgelöst. Informatik 2 - Einführung in Java und UML57

58 Holger Vogelsang Klassen und Objekte Objektorientierte Sichtweise n Funktioniert die Kapselung immer? Beispiel: u Im Pacman-Spiel werden einzelne Figuren auf dem Spielfeld platziert. u Die Figuren haben Attribute wie Farbe, Bewegungsrichtung und Position. u Der aktuelle Spielstand soll auf Festplatte gespeichert werden Zugriff auf die Attribute zum Speichern notwendig. n Konsequenz: u Jede Figur müsste selbst speichern Verteilung der Speicherfunktionalität auf viele Klassen sehr unschön. u Eine Klasse speichert, muss aber auf die privaten Attribute der Figuren zugreifen Aushebelung der Kapselung? u Nein: Kapselung ist immer auf einen Aufgabenbereich beschränkt. u Speicherung ist eine andere Aufgabe, darf also auf die privaten Daten zugreifen. u Das gilt aber nicht für Klassen, die für das Zeichnen verwendet werden. Informatik 2 - Einführung in Java und UML58

59 Holger VogelsangInformatik 2 - Einführung in Java und UML59 Klassen und Objekte Zugriffsrechte Zugriffsrechte private : Auf private Attribute oder Methoden dürfen nur Methoden der eigenen Klasse zugreifen. public : Auf öffentliche Attribute und Methoden dürfen alle Methoden anderer Klassen zugreifen. protected : für Vererbung (kommt später...) n : Paketrecht (kommt später …) n Die Rechte gelten auf Klassenebene: Ein Objekt einer Klasse darf auf private Attribute eines anderen Objektes derselben Klasse zugreifen!

60 Holger Vogelsang Klassen und Objekte Klassen in UML Vereinfachte Darstellung von Klassen in UML: Attribut (Angaben in eckigen Klammern sind optional): [ Sichtbarkeit ][/] Name [: Typ ][ Multiplizität ][ =Vorgabewert ] [{ Eigenschaft }] Sichtbarkeit /Zugriffsrecht: # : geschützt (protected) - : privat (private) + : öffentlich (public) ~ : Paket (package) Informatik 2 - Einführung in Java und UML60 Attribute Klassenname Operationen Ghost - x: int - y: int - count: int + paint(p: JPanel, x: int, y: int) + setX(x: int) + setY(y: int) statisches Attribut

61 Holger Vogelsang Klassen und Objekte Klassen in UML / : Das Attribut ist eine Eigenschaft. Es wird berechnet und muss somit nicht gespeichert werden. Name : Name des Attributs. Aufgrund von Einschränkungen vieler Programmiersprachen sollte man auf Umlaute usw. verzichten. :Typ : Typ des Attributs Multiplizität : Anzahl Ausprägungen des Attributs u kann als Array betrachtet werden u Angaben sind minimale und maximale Anzahl oder die genaue Anzahl: -[2] : exakt zwei Werte -[1..2] : ein oder zwei Werte -[1..*] : mindestens ein Wert bis beliebig viele Werte -[0..*] bzw. [*] : beliebig viele Werte =Vorgabewert : Initialwert für das Attribut u muss zum Typ des Attributs passen bei Multiplizität größer als 1: Aufzählung in der Form {1, 2, 3, 4} Informatik 2 - Einführung in Java und UML61

62 Holger Vogelsang Klassen und Objekte Klassen in UML {Eigenschaft} : besondere Merkmale des Attributs (Auswahl) {readOnly} : Der Wert darf nach der Initialisierung nicht mehr verändert werden (eine Konstante). {subsets } : Der Wert ist eine Untermenge der Werte, die in dem Attribut erlaubt sind. {union} : Vereinigung aller Attributwerte, die mit subsets spezifiziert wurden. {redefines } : Redefiniert ein Attribut seiner Basisklasse {ordered} : Die Attributwerte müssen geordnet vorliegen. Duplikate sind nicht erlaubt. {bag} : Die Attributwerte müssen nicht geordnet vorliegen. Duplikate sind erlaubt. {seq} bzw. {sequence} : Die Attributwerte müssen geordnet vorliegen. Duplikate sind erlaubt. {unique} : Die Attributwerte müssen nicht geordnet vorliegen. Duplikate sind nicht erlaubt. {composite} : Das Attribut wird durch Komposition an die Klasse gebunden. Es ist so selbst für die Zerstörung seines Inhalts verantwortlich. Informatik 2 - Einführung in Java und UML62

63 Holger Vogelsang Klassen und Objekte Klassen in UML Operation (Angaben in eckigen Klammern sind optional): [ Sichtbarkeit ] Name ([ Parameterliste ])[ :Rückgabetyp ] [{ Eigenschaft }] Sichtbarkeit /Zugriffsrecht: wie bei Attributen Name : wie bei Attributen Parameterliste mit dem folgenden Aufbau: [ Übergabemodus ] Name : Typ [ Multiplizität ][ =Vorgabewert ][{ Eigenschaft }] Übergabemodus (unvollständig): -in : Der Parameter wird von der Operation nur gelesen. Fehlt der Modus, so wird in angenommen. In Java nur für primitive Datentypen möglich. -out : Der Parameter wird von der Operation nur geschrieben. Umsetzungsmöglichkeit in Java nur für Objekte (Besonderheit String StringBuffer, …) -inout : Der Parameter wird von der Operation gelesen und geschrieben. Umsetzungsmöglichkeit in Java nur für Objekte. Informatik 2 - Einführung in Java und UML63

64 Holger Vogelsang Klassen und Objekte Klassen in UML Name : Name des Parameters :Typ : Typ des Parameters Multiplizität : Anzahl Ausprägungen des Parameters, die übergeben werden. Die Angaben erfolgen wie bei Attributen. Umsetzungsmöglichkeit in Java: Arrays =Vorgabewert : Wert, den der Parameter erhält, wenn er nicht übergeben wird. Umsetzung in Java nicht direkt möglich. {Eigenschaft} : siehe Attribute :Rückgabetyp : Typ des Rückgabewertes, fehlt dieser, so wird void angenommen. Die Angabe void ist nicht erlaubt. {Eigenschaft} : Angabe spezieller Merkmale des Rückgabetyps, siehe Attribute. n Und was ist mit Ausnahmen (Exceptions)? UML kennt sie nicht. Ausweg in Form eines Eigenschaftswertes (Tagged Value): {raisedException=NameDerAusnahme} Andere, eigene Eigenschaftswerte sind auch erlaubt sinnvoll bei MDA. Informatik 2 - Einführung in Java und UML64

65 Holger Vogelsang Klassen und Objekte Klassen in UML (Pacman-Beispiel) n Klasse für eine Zelle des Spielfeldes (unvollständig): n Weitere Klassen kommen erst später, weil sie Vererbung bzw. Beziehungen zwischen Klassen benötigen. Informatik 2 - Einführung in Java und UML65 Cell - border: int - food: boolean - exit: boolean + paint(panel: JPanel, x: int, y: int) + isFood(): boolean + isExit(): boolean + getBorder(): int

66 Holger Vogelsang Klassen und Objekte Klassen allgemein Typen von Klassen n Statisches Typsystem (C++, C#, Java, …): u Der Typ von Variablen und Parametern wird im Quelltext festgelegt. u Vorteile: -bessere Optimierung durch den Compiler möglich -saubere Programmstruktur, da Typen direkt im Quelltext ersichtlich sind -gute Unterstützung durch IDEs, da diese die Variablentypen erkennen -frühzeitige Fehlererkennung durch den Compiler n Dynamisches Typsystem (z.B. JavaScript): u Variablen können beliebige Daten aufnehmen. u Der Variablentyp steht erst zur Laufzeit fest. u Vorteile: -Werte können von beliebigem Typ sein automatische Konvertierung -Ducktyping: Wenn es watschelt wie eine Ente, wenn es schwimmt wie eine Ente, wenn es quakt wie eine Ente, dann behandeln wir es wie eine Ente. Informatik 2 - Einführung in Java und UML66

67 Holger Vogelsang Klassen und Objekte Klassen allgemein Stark und schwach typisierte Programmiersprachen n Stark typisierte Sprache: Überwacht das Erstellen und den Zugriff auf alle Objekte so, dass sichergestellt ist, dass Referenzen/Zeiger immer auf Objekte verweisen, die auch die Spezifikation des Typs erfüllen, der für die Variable deklariert ist. Beispiel: Java n Schwach typisierte Sprachen: Zeiger können auf Objekte verweisen, ohne dass das Objekt notwendigerweise die Spezifikation des Typs der Variablen erfüllt. Beispiel: C++ Informatik 2 - Einführung in Java und UML67

68 Holger VogelsangInformatik 2 - Einführung in Java und UML68 Klassen und Objekte Klassensyntax in Java Syntax von Klassen in Java n Eine Klasse kapselt Attribute, Operationen und eventuell Operatoren als eine Einheit. n Beispiel zu Attributen und Methoden: public class Cell { private int border; private boolean food; private boolean exit; public int getBorder() { return border; } n Hinweis: Statt Methode wird häufig auch der Begriff Funktion verwendet. n Statt Attribut werden auch häufig Instanzvariable oder Variable verwendet.

69 Holger VogelsangInformatik 2 - Einführung in Java und UML69 Alle Attributzugriffe sollten immer über Methoden mit gleichem Namen mit vorangestelltem get bzw. set erfolgen Kapselung! Beispiel: public class Cell { private int border; private boolean food; //... public int getBorder(){ return border; } public boolean isFood(){ return food; } public void setBorder(int nBorder){ border = nBorder; } public void setFood(boolean nFood){ food = nFood; } Klassen und Objekte Attributzugriffe falls der Lese- und Schreibzugriff erlaubt sein soll Namensvergabe nach Java-Konvention

70 Holger VogelsangInformatik 2 - Einführung in Java und UML70 Klassen und Objekte Beispiel (Vektor, Version 1) n Aus der Mathematik bekannt: Vektoren und Matrizen. Klasse Vector, hier eingeschränkt auf Länge 3 mit double -Zahlen (noch unvollständig und gefährlich kommt später besser): package de.hska.iwii.i2; public class Vector { private double[] values = new double[ 3 ]; public void setValue(int index, double value) { values[ index ] = value; } public double getValue(int index) { return values[ index ]; } Vector - values: double[3] {bag} + setValue(index: int, double: value) + getValue(index: int): double package de.hska.iwii.i2; public class VectorTest { public static void main( String[] args) { Vector v1 = new Vector(); v1.setValue(0, 2.0); System.out.println(v1.getValue(0)); }

71 Holger VogelsangInformatik 2 - Einführung in Java und UML71 Klassen und Objekte Konstruktoren Definition: Konstruktor Konstruktoren dienen der gezielten Initialisierung eines Objektes bei dessen Erzeugung. n Es kann mehr als einen Konstruktor in einer Klasse geben. Beispiel ( Vector, Version 2): public class Vector { private double[] values; public Vector(int size) { values = new double[ size ]; } public void setValue(int index, double value) { values[ index ] = value; } public double getValue(int index) { return values[ index ]; }

72 Holger VogelsangInformatik 2 - Einführung in Java und UML72 Klassen und Objekte Konstruktoren n Ein Konstruktor darf auch einen anderen aufrufen: public class Vector { //... public Vector(int size) { this(size, 0.0); } public Vector(int size, double initValue) { values = new double[ size ]; for (int i = 0; i < size; ++i) { values[ i ] = initValue; } //... } n Ohne die Angabe eines Konstruktors wird immer automatisch der Defaultkonstruktor (ohne Parameter) erzeugt (sonst nicht). n Ein Konstruktor wird immer automatisch aufgerufen, wenn ein Objekt der Klasse erzeugt wird.

73 Holger VogelsangInformatik 2 - Einführung in Java und UML73 Klassen und Objekte Beispielmethode zur Skalarproduktberechnung n Skalarprodukt (immer noch Version 2): public class Vector { //... public double getScalarProduct(Vector second) { double result = 0.0; for (int i = 0; i < values.length; ++i) { result += values[ i ] * second.values[ i ]; } return result; } //... }

74 Holger VogelsangInformatik 2 - Einführung in Java und UML74 Klassen und Objekte Variable Anzahl Übergabeparameter n Probleme: u Eine Methode oder ein Konstruktor wird mit einer beliebigen Anzahl Werte desselben Typs aufgerufen. u Lösungen: -Alle Werte kommen in ein Array. Das Array wird übergeben. -Java unterstützt die Übergabe einer variablen Parameteranzahl. Beispiel Konstruktor des Vektors mit variabler Anzahl double -Werte: public class Vector { private double[] values; public Vector(double... initValues) { values = new double[initValues.length]; for (int i = 0; i < initValues.length; ++i) { values[ i ] = initValues[ i ]; } //... }

75 Holger VogelsangInformatik 2 - Einführung in Java und UML75 Klassen und Objekte Variable Anzahl Übergabeparameter n Aufrufe: Vector v1 = new Vector(1.0, 2.0, 3.0, 4.0); // Länge 4 Vector v2 = new Vector(1.0, 2.0); // Länge 2 Vector v3 = new Vector(); // Länge 0 n Intern werden die Parameter in einem Array abgelegt: Die Anzahl der Parameter kann mit array.length ermitteln werden. n Die Parameter werden mit Array-Zugriffen ausgelesen. n Das funktioniert auch für Methoden.

76 Holger VogelsangInformatik 2 - Einführung in Java und UML76 Klassen und Objekte Aufbau und Verwendung von Klassen n Klassen kapseln Daten und arbeiten selbst auf ihren eigenen Daten: Don't ask for the information that you need to do something; rather, ask the object that has that information to do the job for you. n Beispiel (so nicht): public class Article { private double price; public double getPrice() { return price; } // usw. } // Implementierung einer Preiserhöhung in einer anderen Klasse public void increasePrice(Article article, double percentage) { article.setPrice(article.getPrice() * (1 + percentage / 100.0)); } Problem: Lesen, Manipulation und Schreiben von Article -Daten. Die Article -Operation gehört in die Klasse!

77 Holger VogelsangInformatik 2 - Einführung in Java und UML77 Klassen und Objekte Aufbau und Verwendung von Klassen n Beispiel (so ist es ok): public class Article { private double price; public double getPrice() { return price; } // usw. // Implementierung einer Preiserhöhung public void increasePrice(double percentage) { price *= (1 + percentage / 100.0)); }

78 Holger VogelsangInformatik 2 - Einführung in Java und UML78 Klassen und Objekte Statische Attribute und Methoden n Bisher: Jedes Attribut einer Klasse existiert in jedem Objekt der Klasse. n Manchmal gewünscht: Auch globale Attribute, die nur einmal für eine Klasse existieren Alle Objekte einer Klasse teilen sich dieses Attribut: static Typ Attribut-Name; n Zugriff auf statische Attribute: u Statische Methoden: static Typ Methode(Parameter); u Aufruf einer statischen Methode einer Klasse auch ohne ein konkretes Objekt. n Statische Attribute können als globale Attribute innerhalb einer Klasse betrachtet werden. n Beispiel kommt nachher im Rahmen der Einführung von Referenzen.

79 Holger VogelsangInformatik 2 - Einführung in Java und UML79 Klassen und Objekte final-Parameter und final-Werte final -Parameter und final -Werte können nicht verändert werden Konstante! Beispiel: public void add(final int arg) { //... } final Vector vector : Unveränderliche Referenz auf ein Vektor-Objekt, dessen Inhalt aber verändert werden kann.

80 Holger VogelsangInformatik 2 - Einführung in Java und UML80 Für die primitiven Datentypen existieren Wrapper-Klassen TypGrößeWertebereichWrapper boolean true, false Boolean char 16 Bit '\u0000' bis '\uFFFF' Character byte 8 Bit-2 7 bis Byte short 16 Bit-2 15 bis Short int 32 Bit-2 31 bis Integer long 64 Bit-2 64 bis 2 64 – 1 Long float 32 Bit bis ( )·2 127 Float double 64 Bit bis ( )· Double voidVoid Klassen und Objekte Primitive Datentypen und Wrapper-Klassen

81 Holger VogelsangInformatik 2 - Einführung in Java und UML81 Klassen und Objekte Primitive Datentypen und Wrapper-Klassen Eigenschaften der Wrapper Sie kapseln einen Wert eines primitiven Datentyps (ein Integer -Objekt nimmt genau einen int -Wert auf). n Der gekapselte Wert ist unveränderlich. n Sie besitzen Methoden zur Konvertierung vom/in den Wrapper. Wozu dienen die Wrapper? n Manche Methoden und Klassen erwarten Objekte und keine primitiven Datentypen die Wrapper kapseln die Daten dazu. Beispiel aus dem 1. Semester: Eine ArrayList mit int -Werten kann so verwendet werden: ArrayList daten = new ArrayList<>(); // primitive Datentypen sind // nicht möglich daten.add(500); // wird automatisch zu // daten.add(Integer.valueOf(500));

82 Holger VogelsangInformatik 2 - Einführung in Java und UML82 Klassen und Objekte Primitve Datentypen und Wrapper-Klassen Automatisches Einpacken mit Wrappern (autoboxing) n Automatisches Einpacken (siehe vorheriges Beispiel) ArrayList daten = new ArrayList<>(); daten.add(66); // autoboxing daten.add(42); // autoboxing daten.add(1); // autoboxing daten 1 add

83 Holger VogelsangInformatik 2 - Einführung in Java und UML83 Klassen und Objekte Primitive Datentypen und Wrapper-Klassen n Was passiert genau? u Für die ganze Zahlen -128 bis 127 existieren vordefinierte Wrapper-Objekte, die verwendet werden. Für andere Zahlenbereiche sowie float und double werden jeweils neue Objekte erzeugt Probleme beim Vergleichen: Integer boxedKlein1 = 127; Integer boxedKlein2 = 127; System.out.println(boxedKlein1 == boxedKlein2); // true Integer boxedKlein1 = 128; Integer boxedKlein2 = 128; System.out.println(boxedKlein1 == boxedKlein2); // false

84 Holger Vogelsang Klassen und Objekte Primitive Datentypen und Wrapper-Klassen Automatisches Auspacken mit Wrappern (unboxing) n Automatisches Auspacken ArrayList daten = new ArrayList<>(); daten.add(66); // autoboxing daten.add(42); // autoboxing daten.add(1); // autoboxing int wert = daten.get(0); // unboxing Informatik 2 - Einführung in Java und UML84 daten 66

85 Holger Vogelsang Klassen und Objekte Primitive Datentypen und Wrapper-Klassen n Was passiert genau? Eine null -Referenz kann nicht umgewandelt werden und führt zu einer Exception: int zahl = (Integer) null; // führt zu einer NullPointerException u Es lauern Fallen bei der Umwandlung von Zahlen: Integer i1 = new Integer(42); Integer i2 = new Integer(42); System.out.println(i1 >= i2); // true, unboxing in int-Werte System.out.println(i1 <= i2); // true, unboxing in int-Werte System.out.println(i1 == i2); // false, Vergleich der Referenzen! Informatik 2 - Einführung in Java und UML85

86 Holger Vogelsang Klassen und Objekte Innere Klassen n Klassen lassen sich ineinander schachteln. n Java unterstützt drei unterschiedliche Arten innerer Klassen: u nicht-statische innere Klassen u statische innere Klassen u anonyme innere Klassen n Einsatzgebiete: u Die inneren Klassen werden hauptsächlich in der äußeren benötigt oder von dieser erzeugt. u Beispiel (kommt später): Iteratoren Informatik 2 - Einführung in Java und UML86

87 Holger Vogelsang Klassen und Objekte Innere Klassen: Nicht-statische innere Klassen n Einsatz: Das Erzeugen eines Objektes der inneren Klasse erfolgt immer innerhalb der Grenzen der äußeren Klasse (z.B. in einer der Methoden oder im Konstruktor). n Beispiel: public class Outer { class Inner { private int attr1; public void method1(){} public void method2(){ method1(); Outer.this.method1(); } public void method1(){} } n Innere Klassen dürfen weder statische Methoden noch statische Attribute besitzen. Outer darf auf alle Methoden und Attribute von Inner zugreifen. Inner darf auf alle Methoden und Attribute von Outer zugreifen. n Innere und äußere Klasse sind somit fest miteinander verbunden. Erzeugte Dateien: Outer.class, Outer$Inner.class Informatik 2 - Einführung in Java und UML87

88 Holger Vogelsang Klassen und Objekte Innere Klassen: Statische innere Klassen n Einsatz: Das Erzeugen eines Objektes der inneren Klasse kann außerhalb der Grenzen der äußeren Klasse erfolgen. n Beispiel: public class Outer { static class Inner { private int attr1; public void method1(){} public void method2(){ method1(); } private int attr2; public void method1(){} } n Die innere Klasse ist nicht an die äußere gekoppelt und kann daher nicht auf Attribute und Methoden der äußeren Klasse zugreifen. Erzeugte Dateien: Outer.class, Outer$Inner.class Informatik 2 - Einführung in Java und UML88

89 Holger Vogelsang Klassen und Objekte Innere Klassen: Anonyme innere Klassen n Einsatz: Mit dem Erzeugen einer Klasse wird auch gleichzeitig ein Objekt angelegt. Die Klasse wird nur einmalig benötigt. n Häufig im Zusammenhang mit dem Implementieren von Schnittstellen verwendet: n Beispiel: public class Outer { public void method() { Runnable runObject = new Runnable() public void run() { System.out.println("Huhu"); } }; runObject.run(); } Runnable ist eine Schnittstelle kommt noch genauer n Die anonyme Klasse darf nur auf finale lokale Variablen der Methode zugreifen. n Die anonyme Klasse darf auf Attribute und Methoden der äußeren Klassen zugreifen. Erzeugte Dateien: Outer.class, Outer$1.class Informatik 2 - Einführung in Java und UML89

90 Holger Vogelsang Fehlererkennung Übersicht Informatik 2 - Einführung in Java und UML90 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

91 Holger VogelsangInformatik 2 - Einführung in Java und UML91 Fehlererkennung Fehlerhafte Methodenaufrufe n Idee: Die eigenen Methoden und Klassen werden eventuell falsch oder mit falschen Daten aufrufen. n Auch wenn der eigene Algorithmus korrekt ist, darf er nicht durch falsche Werte durcheinander geraten. n Denn: Programme werden im Laufe der Zeit permanent verändert. Fehler können daher immer wieder einmal auftreten. n Konsequenz: Ein Profi sichert seine eigenen Klassen und Methoden gegen eine fehlerhafte Verwendung ab. n In Kombination mit einem sauberen Software-Entwurf und anschließenden Tests, stellt die defensive Programmierung einen wichtigen Schritt in Richtung stabiler Programme dar. n Der Anwender sollte Programmfehler nie zu Gesicht bekommen.

92 Holger VogelsangInformatik 2 - Einführung in Java und UML92 Fehlererkennung Fehlerhafte Methodenaufrufe n 3 Strategien zur Parameterbehandlung: u Müll rein – nichts raus u Müll rein – Fehlernachricht raus u Müll rein – Müll raus (nicht akzeptabel!) n Daher: Prüfen aller Eingabeparameter u Numerische Werte innerhalb vorgegebener Toleranzen u Maximale Länge von Strings Randbedingungen wie 0, "", null usw. n Festlegen und dokumentieren, wie fehlerhafte Parameter behandelt werden sollen: Rückgabe eines Fehlercodes ( false, -1,...). Besser: Ausnahmen u Aufruf einer Fehlerbehandlungsroutine u Eintrag in einer Protokolldatei erstellen u Programm beenden

93 Holger Vogelsang Fehlererkennung Fehlerhafte Methodenaufrufe n Kontrakt zwischen einer Klasse und den Nutzern einer Klasse: u Beschreibt, welche Voraussetzungen (Vorbedingungen) ein Aufrufer der Operation schaffen muss, damit die Operation durchgeführt werden kann. u Legt fest, welche Leistung (Nachbedingungen) die Operation erbringt, sofern die Vorbedingungen eingehalten sind. n Vorbedingungen (engl. Preconditions) u Der Aufrufer der Operation ist verpflichtet, diese Bedingungen beim Aufruf der Operation herzustellen. u Sind die Vorbedingungen nicht erfüllt, ist die Operation nicht verpflichtet, ihre spezifizierte Aufgabe zu erfüllen. u Vorbedingungen sind damit der Kontraktbestandteil, den der Aufrufer einer Operation einzuhalten hat. u Sind die Vorbedingungen eingehalten, ist der Aufgerufene wiederum verpflichtet, die Nachbedingungen herzustellen. Informatik 2 - Einführung in Java und UML93

94 Holger Vogelsang Fehlererkennung Fehlerhafte Methodenaufrufe n Nachbedingungen (engl. Postconditions) u Eine Klasse, die eine Operation implementiert, sichert zu, dass die Nachbedingungen unmittelbar nach Aufruf der Operation gelten. u Die Zusicherung gilt nur, wenn der Aufrufer die für die Operation definierten Vorbedingungen eingehalten hat. u Zusätzlich können auch nach außen zugesicherte Bedingungen vereinbart sein, die immer gelten sollen, unabhängig vom Aufruf einer Operation. n Invarianten (engl. Invariants) u Invarianten sind Eigenschaften und Beziehungen zwischen Attributen eines Objekts, die sich durch keine Operation ändern lassen. u Invarianten, die für eine Klasse definiert werden, gelten für alle Objekte der Klasse. Informatik 2 - Einführung in Java und UML94

95 Holger Vogelsang Fehlererkennung Fehlerhafte Methodenaufrufe n Deklaration von Bedingungen in UML u Ziel: möglichst automatische Überprüfbarkeit im späteren Quelltext u Einführung der Object Constraint Language (OCL) n Object Constraint Language (OCL) u Die OCL wird verwendet, um zusätzliche Bedingungen darzustellen, die sich mit den sonstigen Beschreibungsmitteln der UML nicht oder nur umständlich ausdrücken lassen. u OCL stellt dabei eine rein deklarative Beschreibungsmöglichkeit zur Verfügung, um sogenannte Constraints auszudrücken. u Ein Constraint ist ein Ausdruck, der entweder wahr oder falsch ist. u OCL eignet sich sehr gut, um Vorbedingungen, Nachbedingungen und Invarianten von Operationen auszudrücken. u Hier: keine vollständige Einführung in OCL Informatik 2 - Einführung in Java und UML95

96 Holger Vogelsang Fehlererkennung Fehlerhafte Methodenaufrufe n Beispiel zu OCL: n Wozu Constraints? Im Quelltext sind sie doch sowieso nicht sichtbar. Falsch: u Mit Assertions (Zusicherungen) lassen sich Vorbedingungen manuell überprüfen. u Einhaltung der Vorbedingungen können mit automatisch überwacht werden.http://sourceforge.net/projects/ocl4java/ Informatik 2 - Einführung in Java und UML96 Account - number: int - balance: int + payOff(amount: int) context Account::payOff pre: balance >= amount post: balance = balance - amount

97 Holger Vogelsang Zusicherungen Übersicht Informatik 2 - Einführung in Java und UML97 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

98 Holger Vogelsang Zusicherungen Fehlerhafte Methodenaufrufe n Idee: Jede Funktion oder Methode schützt sich selbst gegen beispielsweise falsche Aufrufparameter oder falsche Zustände. n Realisierung: Die Anweisung assert wird zur Prüfung der Vor- und Nachbedingungen einer Methode verwendet. Sie wertet eine übergebene Bedingung aus. Ist diese falsch, so wird das Programm mit einem AssertionError beendet. Beispiel Methode sqrt : public double sqrt(double value) { assert value >= 0.0; // Nicht negativ // Wurzelberechnung } n Aufruf mit: x.sqrt(42.0); // OK x.sqrt(-66.66); // Abbruch Informatik 2 - Einführung in Java und UML98

99 Holger VogelsangInformatik 2 - Einführung in Java und UML99 Zusicherungen Fehlerhafte Methodenaufrufe n Verwendungen: u assert Bedingung; -Der Ausdruck muss einen Booleschen Wert ergeben. -Ist der Wert false, so wird dieses als Fehler betrachtet. -Ist der Wert true, so wird das Programm normal fortgesetzt. assert value >= 0.0; u assert Bedingung : Meldungstext; -Es gelten die Aussagen wie im ersten Fall. -Zusätzlich wird hier ein Text übergeben, der in die Ausnahme aufgenommen wird. assert value >= 0.0 : "Die Wurzel aus 0 ist undefiniert." u Assertions müssen aktiviert werden: -Alle aktivieren: java -ea Main.class -Nur im Paket de.hska und dessen Unterpaketen: java -ea:de.hska... u Sind Assertions nicht aktiv, dann werden sie ignoriert.

100 Holger VogelsangInformatik 2 - Einführung in Java und UML100 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat n Programmierung eines sehr einfachen Ticketautomaten: u Der Preis erscheint auf dem Display (Einheitspreis in Cent).

101 Holger VogelsangInformatik 2 - Einführung in Java und UML101 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat u Der Kunde zahlt solange mit Münzen oder Scheinen, bis der Betrag erreicht ist (muss passend bezahlen). u Nach dem Geldeinwurf wird der Restbetrag angezeigt. u Nach Erreichen des Betrags wird der Fahrschein ausgegeben.

102 Holger VogelsangInformatik 2 - Einführung in Java und UML102 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat n Benötigte Attribute: int ticketPrice : Preis für ein Ticket int paidPrice : bereits bezahlter Preis n Benötigte Methoden, 1. Versuch: Konstruktor: Einheitspreis als int -Parameter flexibel void requestTicket() : Ticket anfordern int requestPrice() : (Rest-)Preis für das Ticket abfragen void insertMoney(int amount) : Geld einwerfen void printTicket() : Ticket ausdrucken

103 Holger Vogelsang Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat n Klasse in UML: Informatik 2 - Einführung in Java und UML103 TicketMachine -ticketPrice: int -paidPrice: int +TicketMachine(price: int) +requestTicket() +requestPrice(): int +insertMoney(amount: int) +printTicket() context TicketMachine::printTicket pre: paidPrice >= ticketPrice post: paidPrice = 0 context TicketMachine::requestTicket post: paidPrice = 0 context TicketMachine::insertMoney pre: amount > 0 post: paidPrice = paidPrice + amount context TicketMachine::TicketMachine pre: price > 0 post: (ticketPrice = price and paidPrice = 0)

104 Holger VogelsangInformatik 2 - Einführung in Java und UML104 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat n Quelltext: public class TicketMachine { // Die Attribute der Klasse private int ticketPrice; private int paidPrice; // Konstruktor zum Initialisieren public TicketMachine(int price) { ticketPrice = price; paidPrice = 0; } // Ticket anfordern --> löscht den bisher bezahlten Betrag public void requestTicket() { paidPrice = 0; } // (Noch) zu zahlenden Betrag anfordern. public int requestPrice() { return ticketPrice – paidPrice; }

105 Holger VogelsangInformatik 2 - Einführung in Java und UML105 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat // Geld einwerfen --> Restbetrag reduzieren. public void insertMoney(int amount) { paidPrice += amount; } // Ticket "ausdrucken" public void printTicket() { System.out.println("Ticket xyz"); System.out.println("Preis: " + ticketPrice); paidPrice = 0; }

106 Holger VogelsangInformatik 2 - Einführung in Java und UML106 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat n Eine perfekte Lösung Nein!!! n Probleme: u Keine Prüfungen der Methodenparameter und internen Zustände: -negative Beträge eingeworfen -Ticket drucken, obwohl Endbetrag nicht erreicht wurde -Was passiert, wenn zu viel Geld eingeworfen wurde? -Der Ticketpreis im Konstruktor ist ungeprüft. u Einhaltung der Constraints wurde nicht geprüft!!!

107 Holger VogelsangInformatik 2 - Einführung in Java und UML107 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat n Quelltext mit Prüfungen: public class TicketMachine { // Die Attribute der Klasse private int ticketPrice; private int paidPrice; // Konstruktor zum Initialisieren public TicketMachine(int price) { assert price > 0; ticketPrice = price; paidPrice = 0; } // Ticket anfordern --> löscht den bisher bezahlten Betrag public void requestTicket() { paidPrice = 0; } context TicketMachine::TicketPrice pre: price > 0 post: (ticketPrice = price and paidPrice = 0) context TicketMachine::requestTicket post: paidPrice = 0

108 Holger VogelsangInformatik 2 - Einführung in Java und UML108 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat // (Noch) zu zahlenden Betrag anfordern. public int requestPrice() { return ticketPrice – paidPrice; } // Geld einwerfen --> Restbetrag reduzieren. // Zuviel bezahlten Betrag wieder auswerfen. public int insertMoney(int amount) { assert amount > 0; int diff = ticketPrice – paidPrice - amount; paidPrice += amount; if (paidPrice > ticketPrice) paidPrice = ticketPrice; return diff >= 0 ? 0 : -diff; } context TicketMachine::insertMoney pre: amount > 0 post: paidPrice = min(paidPrice + amount, ticketPrice)

109 Holger VogelsangInformatik 2 - Einführung in Java und UML109 Zusicherungen Fehlerhafte Methodenaufrufe: Ticketautomat // Ticket "ausdrucken" public void printTicket() { assert paidPrice >= ticketPrice; System.out.println("Ticket xyz"); System.out.println("Preis: " + ticketPrice); paidPrice = 0; } context TicketMachine::printTicket pre: paidPrice >= ticketPrice post: paidPrice = 0

110 Holger Vogelsang Klassen und Objekte Übersicht Informatik 2 - Einführung in Java und UML110 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

111 Holger VogelsangInformatik 2 - Einführung in Java und UML111 Klassen und Objekte Beispiel: Ringpuffer n Eine erste einfache Implementierung eines Ringpuffers: u Ein Ringpuffer kann als ein Array mit speziellen Lese- und Schreiboperationen interpretiert werden: Das Array dieses Ringpuffers kann nur int -Daten aufnehmen. u Ein Leseindex RI zeigt die Position an, an der der nächste Wert gelesen wird. Nach dem Lesen wird der Index automatisch erhöht. Am Ende des Arrays wird der Index auf 0 gesetzt. Somit handelt es sich um ein zerstörendes Lesen, bei dem der Wert nach dem Lesen nicht mehr im Ringpuffer zugreifbar ist. u Ein Schreibindex WI zeigt die Position an, an die der nächste Wert geschrieben wird. Nach dem Schreiben wird der Index automatisch erhöht. Am Ende des Arrays wird der Index auf 0 gesetzt. u Der Ringpuffer ist leer, wenn WI genauso groß wie RI ist. u Der Ringpuffer ist voll, wenn gilt: WI hätte nach dem Erhöhen den Wert von RI. n Bessere Variante: siehe Übungsaufgabe

112 Holger VogelsangInformatik 2 - Einführung in Java und UML112 Klassen und Objekte Referenzen und dynamische Speicherverwaltung n Warum kann man Objekte und Variable nicht einfach alle auf dem Stack verwalten? n Wie werden Objekte auf dem Heap erzeugt und wieder freigegeben? n Referenzen sind spezielle Variable, die auf Objekte verweisen. n Zum Bau komplexer Datenstrukturen sind der Heap und Referenzen zwingend notwendig.

113 Holger VogelsangInformatik 2 - Einführung in Java und UML113 Klassen und Objekte Referenzen und dynamische Speicherverwaltung Definition: Referenz Eine Referenz hat einen unveränderlichen Typ T. Sie enthält einen Verweis auf genau ein oder gar kein Objekt der Klasse T. Das Objekt liegt auf dem Heap. n Beispiel für eine Referenz, die auf kein Objekt verweist: Bruch brReferenz = null; Beispiel für eine Referenz auf ein Bruch -Objekt: Bruch brReferenz = new Bruch(2,3); n Intern enthält die Referenz die Speicheradresse des Objektes. n Es existieren zwei Referenzen mit einer besonderen Semantik: null : Die Referenz verweist auf gar kein Objekt. this : Die Referenz verweist auf die eigene Objektinstanz (kann nur in Konstruktoren oder nicht-statischen Methoden verwendet werden). n Es gibt auch sogenannte schwache Referenzen, die hier aber nicht betrachtet werden sollen.

114 Holger VogelsangInformatik 2 - Einführung in Java und UML114 Klassen und Objekte Referenzen und dynamische Speicherverwaltung Definition: Heap Speicherbereich, in dem der Entwickler selbst die Lebensdauer seiner Daten kontrolliert. Mit new wird ein Bereich reserviert. Die Freigabe erfolgt automatisch durch den Garbage- Collector. Der Operator new führt die folgenden Schritte durch: u Reservierung des benötigten Speichers auf dem Heap u Aufruf eines Konstruktors u Rückgabe einer Referenz auf das erzeugte Objekt n Anforderung eines Speicherbereichs mit Aufruf des Defaultkonstruktors: Syntax:Beispiel: Klasse ref = new Klasse();Pacman pacmanRef = new Pacman(); n Anforderung eines Speicherbereichs mit Aufruf eines beliebigen Konstruktors: Syntax: Beispiel: Klasse ref = new Klasse(init);Pacman pacmanRef = new Pacman(x, y);

115 Holger VogelsangInformatik 2 - Einführung in Java und UML115 Klassen und Objekte Referenzen und dynamische Speicherverwaltung – new-Operator Der Operator new führt die folgenden Schritte bei Arrays durch: u Reservierung des benötigten Speichers auf dem Heap u Initialisierung des Arrays: -bei Arrays mit primitiven Datentypen: 0, 0.0 oder false -bei Arrays mit Referenzen: null u Rückgabe einer Referenz auf das Array n Anforderung eines Speicherbereichs der Größe des Arrays mit primitiven Daten: Syntax: Beispiel: Typ[] ref = new Typ[ size ];int[] iRef = new int[ 10 ]; Das Array enthält 10 int -Daten mit dem Wert 0. n Anforderung eines Speicherbereichs der Größe des Arrays mit Referenzen: Syntax: Beispiel: Typ[] ref = new Typ[ size ];Bruch[] brRef = new Bruch[ 10 ]; Das Array enthält 10 null -Referenzen. Es werden keine Bruch -Objekte angelegt!

116 Holger VogelsangInformatik 2 - Einführung in Java und UML116 Klassen und Objekte Referenzen und dynamische Speicherverwaltung – new-Operator für Arrays Ausführlicheres Beispiel: 4 Referenzen auf Ghost -Objekte in einem Array: Ghost[] allGhosts = new Ghost[ 4 ]; // Platz für vier Geister for (int i = 0; i < allGhosts.length; i++) allGhosts[ i ] = new Ghost(3, 1); for (int i = 0; i < allGhosts.length; i++) allGhosts[ i ].setX(12); n Mehrdimensionale Arrays lassen genauso erzeugen. Geist 1Geist 2Geist 3 0x20000x20100x2020 Fiktive Adressen! 0x12400x20000x20100x2020 0x1240 allGhosts 0x2030 Geist 4 0x2030

117 Holger VogelsangInformatik 2 - Einführung in Java und UML117 Klassen und Objekte Referenzen und dynamische Speicherverwaltung – Speicherfreigabe Was passiert mit Objekten, auf die keine Referenzen mehr existieren? n Sie sind durch das eigene Programm nicht mehr erreichbar. n Der interne Garbage-Collector kann sie beseitigen und wieder dem Freispeicher zuordnen. Vor der Speicherfreigabe wird die Methode protected void finalize() des zu löschenden Objektes aufgerufen. n Es kann passieren, dass die Objekte auf dem Heap bleiben, wenn genügend Speicher vorhanden ist Zeitpunkt der Freigabe ist nicht vorhersehbar. Manueller Aufruf des Garbage-Collectors: Runtime.getRuntime().gc(); u Es werden trotzdem nicht alle unerreichbaren Objekte freigegeben. u Mehrfacher Aufruf, bis sich der freie Speicher nicht mehr ändert: long freeMem = Runtime.getRuntime().freeMemory();

118 Holger VogelsangInformatik 2 - Einführung in Java und UML118 Klassen und Objekte Referenzen und dynamische Speicherverwaltung – Singleton Definition: Singleton Eine Klasse, von der nur ein Objekt erzeugt werden kann. n Beispielimplementierung (nicht perfekt). public class Logger { private static Logger instance; // Privater Konstruktor private Logger(){ } public static Logger getInstance(){ if (instance == null) instance = new Logger(); return instance; } public void log(String message) { // Ausgabe } public void test() { Logger log1 = new Logger(); // Fehler Logger log2 = Logger.getInstance(); Logger log3 = Logger.getInstance(); log2.log("Wichtige Nachricht"); // Oder kürzer Logger.getInstance().log("Nachricht"); }

119 Holger VogelsangInformatik 2 - Einführung in Java und UML119 Klassen und Objekte Referenzen und dynamische Speicherverwaltung – Beispiel n Implementierung einer einfach verketteten Liste doppelte Verkettung ist eine Übungsaufgabe! n Welche Klassen werden benötigt? n Implementierung einiger Methoden der Klassen

120 Holger Vogelsang Überladen von Methoden Übersicht Informatik 2 - Einführung in Java und UML120 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Typinforma- tionen Ein-, Ausgabe Objekt- orientierung Annota- tionen Laufzeit- typinfo. Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

121 Holger VogelsangInformatik 2 - Einführung in Java und UML121 Überladen von Methoden Definition: Überladen von Methoden Eine Klasse besitzt zwei oder mehr Methoden mit demselben Namen und unterschiedlichen Parametertypen. Die passende Methode wird durch den Compiler ermittelt, indem er auch Typkonvertierungen durchführt. Der Rückgabetyp darf unterschiedlich sein. Beispiel: Klassenname -attribut: int +methode() +methode(wert: int) +methode(wert: string)

122 Holger VogelsangInformatik 2 - Einführung in Java und UML122 Überladen von Methoden n Einsatz: Verwendung der gleichen Methode mit unterschiedlichen Parametertypen. n Vorteil: Keine explizite Konvertierung der Argumente im Aufruf. Beispiel: Vereinfachter Auszug aus der bereits eingeführten Klasse GameController, die in Pacman die Figuren steuert. GameController +collisionOfPacmanWith(ghost: Ghost) +collisionOfPacmanWith(cherry: Cherry)

123 Holger VogelsangInformatik 2 - Einführung in Java und UML123 Überladen von Methoden Auswahl der passenden Methode Auswahlkriterien durch den Compiler: n Die Anzahl der Parameter muss zum Aufruf passen. n Alle Übergabeparameter müssen in die Parametertypen der Methode konvertierbar sein. Beispiel: public class PrintStream { public void println(long x){} public void println(char x){} } Aufruf: PrintStream out =... out.println(123); n Für alle Übergabeparameter wird der kleinste passende Typ gesucht. Beispiel: char int, vor char long. n Ein größerer Typ wird nie in einen kleineren Typ umgewandelt. PrintStream +println(x: long) +println(x: char) int wird zu long

124 Holger VogelsangInformatik 2 - Einführung in Java und UML124 Überladen von Methoden n Es wird die Methode mit der kleinsten Summe der Konvertierungsabstände aller Parameter ermittelt. n Existieren mehrere Methoden mit gleichem minimalen Abstand, so wird ein Übersetzungsfehler gemeldet. n Beispiel (OK, ziemlich sinnlos): public class MyClass { public void method(long x, int y); public void method(int x, long y); } Aufruf: MyClass cl = new MyClass(); cl.method(123, 456 ); Fehler ! cl.method(123L,456 ); cl.method(123, 456L); MyClass +method(x: long, y: int) +method(x: int, y: long)

125 Holger Vogelsang Vererbung Übersicht Informatik 2 - Einführung in Java und UML125 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

126 Holger VogelsangInformatik 2 - Einführung in Java und UML126 Vererbung Motivation n Wie können existierende Klassen wiederverwendet werden? n Welche Methoden sollte eine Klasse immer unterstützen? n Welche Arten von Beziehungen können zwischen Objekten bestehen?

127 Holger VogelsangInformatik 2 - Einführung in Java und UML127 Vererbung Motivation n Eigenschaften, die für eine Figur gelten, gelten eventuell auch für spezielle Figuren: n Vererbungsbeziehungen können mit der Vererbungshierarchie in der Biologie verglichen werden: n Ein Koalabär ist ein Säugetier (Mammal) ist ein Tier. Figure GhostPacman Animal MammalReptile KangarooKoala Crocodile

128 Holger Vogelsang Vererbung Begriffe n Es gibt zwei Arten der Vererbung in Programmiersprachen: u Vererbung der Spezifikation: wichtiges Konzept der objektorientierten Programmierung u Vererbung der Implementierung: Mittel zur Vermeidung von Redundanzen mit einigen konzeptuellen und praktischen Problemen n Beide Techniken werden häufig unter dem Begriff der Vererbung zusammengefasst. Informatik 2 - Einführung in Java und UML128

129 Holger Vogelsang Vererbung Begriffe Definition: Vererbung Vererbung ist eine Programmiersprachenkonzept zur Umsetzung einer Relation zwischen einer Ober- und einer Unterklasse: Eine Klasse AbgelKlasse ist dann eine Unterklasse der Klasse BasisKlasse, wenn AbgelKlasse die Spezifikation von BasisKlasse erfüllt, umgekehrt aber BasisKlasse nicht die Spezifikation von AbgelKlasse. Die Klasse BasisKlasse ist dann eine Oberklasse von AbgelKlasse. Informatik 2 - Einführung in Java und UML129 BasisKlasse +operation1() AbgelKlasse +operation1() +operation2() AbgelKlasse hält Vor- und Nachbedingung von operation1 der BasisKlasse ein. AbgelKlasse erweitert die eigene Spezifikation um operation2.

130 Holger VogelsangInformatik 2 - Einführung in Java und UML130 Vererbung Begriffe n Die Oberklasse vererbt ihre Spezifikation (Vor- und Nachbedingungen) an die Unterklasse. n Durch Unterklassen wird das Verhalten der Oberklasse nicht verändert. n Durch Vererbung (Ableitung) entsteht eine Klassenhierarchie. ist Spezialfall von ist Erweiterung von Unterklasse Subklasse abgeleitete Klasse Spezialisierung Oberklasse Superklasse Basisklasse Generalisierung ist Verallge- meinerung von Figure -x: int -y: int +setX(x: int) +setY(y: int) Ghost -IQ: int +getIQ(): int Pacman -mouthOpening: boolean +isMouthOpening(): boolean

131 Holger VogelsangInformatik 2 - Einführung in Java und UML131 Vererbung Begriffe Generalisierung und Spezialisierung – Begriffe n Prozess der Klassenbildung ist ein Abstraktionsvorgang: u Spezialisierung: Aus bestehenden Klassen können spezialisierte Unterklassen (abgeleitete Klassen) gebildet werden. u Generalisierung: Gemeinsamkeiten bestehender Klassen können in gemeinsame Oberklassen (Basisklasse) verlagert werden. u Ergebnis: Klassenhierarchien aus Ober- und Unterklassen. n Oberklassen: Allgemeiner und abstrakter als Unterklassen. n Unterklassen: Spezieller und konkreter als Oberklassen. n Der Sprachmechanismus, der dieses Konzept unterstützt, wird Vererbung genannt. n Wichtig: Eine Unterklasse ist ein Untertyp von Oberklasse. Damit kann die Unterklasse überall dort verwendet werden, wo die Oberklasse erwartet wird.

132 Holger VogelsangInformatik 2 - Einführung in Java und UML132 Vererbung Begriffe n Eine Unterklasse ist ein Stellvertreter für die Oberklasse. n Sie kann Methoden der Oberklasse überschreiben (umdefinieren). KlassenObjekte Speicher ghost1 x = 1 y = 4 IQ = 70 pacman x = 2 y = 13 mouthOpening = false Figure -x: int -y: int +setX(x: int) +setY(y: int) Ghost -IQ: int +getIQ(): int Pacman -mouthOpening: boolean +isMouthOpening(): boolean

133 Holger Vogelsang Vererbung Vererbung der Spezifikation Allgemeiner Fall: Vererbung der Spezifikation n Eine Unterklasse erbt grundsätzlich die Spezifikation ihrer Oberklasse. n Die Unterklasse übernimmt damit alle Verpflichtungen und Zusicherungen der Oberklasse. n Häufiger wird auch der Begriff Vererbung von Schnittstellen benutzt. n Vererbung der Spezifikation: Eine Unterklasse übernimmt die Verpflichtungen (Vor- und Nachbedingungen), die sich aus der Spezifikation der Oberklasse ergeben. n Vererbung ist mehr als die einfache Syntax zur Implementierung einer Schnittstelle. n Prinzip der Ersetzbarkeit: Wenn die Klasse B eine abgeleitete Klasse der Klasse A ist, dann können in einem Programm alle Objekte der Klasse A durch Objekte der Klasse B ersetzt worden sein, und es gelten trotzdem weiterhin alle zugesicherten Eigenschaften der Klasse A. n Java unterstützt dieses Konzept durch eigene Sprachmittel, C++ nicht kommt gleich genauer. Informatik 2 - Einführung in Java und UML133

134 Holger Vogelsang Spezieller Fall: Vererbung der Implementierung n Anwendungsbeispiel: Es gibt eine Basisklasse, die nicht vollständig durch spezialisierte abgeleitete Klassen abgedeckt wird. n Es gibt also Objekte der Basisklasse. n Beispiel (in der Basisklasse sind z.B. Beamte und Rentner): n Syntaxbeispiel: public class Angestellter extends Steuerzahler { } Informatik 2 - Einführung in Java und UML134 Vererbung Vererbung der Implementierung Steuerzahler AngestellterSelbstaendiger

135 Holger Vogelsang Vererbung Vererbung der Implementierung Beispiel: Erben gesetzlicher Regelungen (aus Praxisbuch Objektorientierung) n Gesetzliche Regelungen werden auf verschiedenen Ebenen vorgenommen. Für eine in Karlsruhe lebende Person gilt: u Die europäische Union legt rechtliche Rahmenbedingungen fest. u Die Bundesrepublik Deutschland hat gesetzliche Regelungen für das Steuerrecht. u Das Land Baden-Württemberg hat wiederum eigene spezielle Regelungen. u Schließlich legt die Stadt Karlsruhe noch eigene Regelungen fest, zum Beispiel den so genannten Hebesatz für die Gewerbesteuer. n Vererbung der Regelungen u Die Karlsruher-Regelung erbt von der des Landes Baden-Württemberg. u Diese wiederum erben die Regeln des Bundes. u Der Bund muss die Regeln der EU akzeptieren. Informatik 2 - Einführung in Java und UML135

136 Holger Vogelsang Vererbung Vererbung der Implementierung n Effekte der Vererbung der Umsetzung: u Beispiel: Der allgemeine Einkommenssteuersatz wird für Karlsruhe direkt aus der Regelung des Bundes übernommen. u Eine Änderung des Einkommensteuersatzes bundesweit führt auch zu einer Änderung in Karlsruhe. u In einem bestimmten Rahmen können eigene Umsetzungen in den speziellen Fällen erfolgen. Beispiel: Jede Kommune hat eigene Gewerbesteuerumsetzung. n Die Regelungen sind hierarchisch organisiert, wobei die weiter oben liegenden Regeln jeweils weiter unten liegende überschreiben. Informatik 2 - Einführung in Java und UML136

137 Holger Vogelsang Vererbung Vererbung der Implementierung n Suche einer passenden Regelung anhand des Beispiels: u Suche eines Gesetzes durch Suchen in den Büchern von oben nach unten im Stapel. u Vorteil: -Karlsruhe muss nicht den kompletten Gesetzestext der EU beinhalten. -Eine Änderung innerhalb der EU wird automatisch übernommen. -Nur kleinere Anpassungen werden lokal festgelegt Karlsruher Recht muss mit EU- Recht übereinstimmen. Informatik 2 - Einführung in Java und UML137 Steuerrecht Karlsruhe Steuerrecht BW Steuerrecht Bund Steuerrecht EU Suchrichtung

138 Holger Vogelsang Vererbung Vererbung der Implementierung n Klassenhierarchie der Regelungen: n Wie wird eine Klassenhierarchie implementiert? Informatik 2 - Einführung in Java und UML138 Steuerrecht- EU Steuerrecht- Bund Steuerrecht- BW Steuerrecht- Karlsruhe

139 Holger VogelsangInformatik 2 - Einführung in Java und UML139 Vererbung Vererbung der Implementierung – Syntax n Beispiel: Figure als allgemeine Basisklasse für eine Figur Ghost als spezielle Figur public class Figure { private int xPos; private int yPos; public Figure(int xPos, int yPos) { /*... */ } public void move(int xPos, int yPos) { /*... */ } //... } public class Ghost extends Figure { private boolean dangerous; public Ghost(int xPos, int yPos, boolean dangerous) { /*... */ } public boolean isDangerous() { /*... */ } public void move(int xPos, int yPos) { /*... */ } //... }

140 Holger VogelsangInformatik 2 - Einführung in Java und UML140 Vererbung Vererbung der Implementierung – Konstruktorenreihenfolge Frage: Wie funktioniert der Konstruktoraufruf in Figure jetzt, wenn ein Ghost -Objekt erzeugt wird? Antwort: Der Konstruktor von Ghost kann Argumente an den Konstruktor der Basisklasse Figure weiterleiten. n Ein Konstruktor kann auch seine eigenen Attribute initialisieren. Vorgehensweise: u Aufruf des Basisklassenkonstruktors. u Initialisierung der eigenen Attribute.

141 Holger Vogelsang n Klassenelemente werden von oben nach unten initialisiert: u Erst wird der Konstruktor der Basisklasse aufgerufen. u Dann werden die Attribute einer Klasse in der Reihenfolge ihrer Deklaration initialisiert. u Abschließend wird der Konstruktor der Klasse selbst aufgerufen. n Initialisierungsreihenfolge im Ghost-Beispiel: Informatik 2 - Einführung in Java und UML141 Figure -xPos: int -yPos: int +Figure() Ghost -dangerous: boolean +Ghost() Vererbung Vererbung der Implementierung – Konstruktorenreihenfolge Initialisierungsreihenfolge 1. Attribute der Basisklasse in der Reihenfolge ihrer Deklaration 2. Konstruktor der Basisklasse 3. Attribute der abgeleiteten Klasse in der Reihenfolge ihrer Deklaration 4. Konstruktor der abgeleiteten Klasse

142 Holger VogelsangInformatik 2 - Einführung in Java und UML142 Vererbung Vererbung der Implementierung – Konstruktorenreihenfolge Beispiel: Ghost public Ghost(int xPos, int yPos, boolean dangerous) { super(xPos, yPos); this.dangerous = dangerous; } Attribute Konstruktor Basisklasse

143 Holger Vogelsang Zur Erinnerung: Vor der Freigabe wird die Methode finalize aufgerufen. Zuerst wird finalize der abgeleiteten Klasse aufgerufen. Diese Methode ruft finalize der Basisklasse auf und führt dann eigene Aufräumarbeiten durch. Aufrufreihenfolge der finalize -Methoden im Ghost-Beispiel (sofern dort finalize implementiert wurde): Informatik 2 - Einführung in Java und UML143 Figure -xPos: int -yPos: int #finalize() Ghost -dangerous: boolean #finalize() Vererbung Vererbung der Implementierung – Freigabereihenfolge Freigabereihenfolge 2. finalize der Basisklasse 1. finalize der abgeleiteten Klasse ruft auf

144 Holger Vogelsang Vererbung Vererbung der Implementierung - Verhindern der Vererbung Soll verhindert werden, dass von einer bestimmten Klasse geerbt wird, dann kann sie als final deklariert werden. Beispiel: public final class Game { private Cell[][] cells; public Game() { /*... */ } public void run() { /*... */ } /*... */ } Die Klasse String ist beispielsweise als final deklariert. Informatik 2 - Einführung in Java und UML144

145 Holger VogelsangInformatik 2 - Einführung in Java und UML145 Vererbung Vererbung der Implementierung – Klassenhierarchien Bildung komplexer Klassenhierarchien Jede abgeleitete Klasse kann die Basisklasse einer anderen Klasse sein. public class Figure { private int xPos; private int yPos; public Figure() { /*... */ } public void move(int xPos, int yPos) { /*... */ } public void print() { /*... */ } /*... */ } Figure -xPos: int -yPos: int +Figure() Ghost -dangerous: boolean +Ghost() FlyingGhost +FlyingGhost()

146 Holger VogelsangInformatik 2 - Einführung in Java und UML146 Vererbung Vererbung der Implementierung – Klassenhierarchien public class Ghost extends Figure { private boolean dangerous; public void move(int xPos, int yPos) { /*... */ } public void print() { /*... */ } /*... */ } Figure -xPos: int -yPos: int +Figure() Ghost -dangerous: boolean +Ghost() FlyingGhost +FlyingGhost()

147 Holger VogelsangInformatik 2 - Einführung in Java und UML147 Vererbung Vererbung der Implementierung – Klassenhierarchien public class FlyingGhost extends Ghost { public void print() { /*... */ } /*... */ } Figure -xPos: int -yPos: int +Figure() Ghost -dangerous: boolean +Ghost() FlyingGhost +FlyingGhost()

148 Holger VogelsangInformatik 2 - Einführung in Java und UML148 Vererbung Vererbung der Implementierung – Klassenhierarchien Hinweise n Die Klassenhierarchie kann einen Baum bilden. Beispiel: public class Person { /*... */ } public class Student extends Person { /*... */ } public class Angestellter extends Person { /*... */ } n Mehrfachvererbung gibt es in Java nicht. Definition: Einfachvererbung Eine abgeleitete Klasse erbt nur von einer direkten Basisklasse.

149 Holger VogelsangInformatik 2 - Einführung in Java und UML149 Vererbung Vererbung der Implementierung – Rechte bei Attribut- oder Methodenzugriffen Neues Zugriffsrecht: protected für Vererbung räumt einer abgeleiteten Klasse mehr Rechte als einer anderen Klasse ein. n Eine abgeleitete Klasse kann alle public - oder protected -Methoden aller seiner Basisklassen aufrufen. alle public - oder protected -Attribute aller seiner Basisklassen lesen und beschreiben. u nicht auf die privaten Methoden oder privaten Attribute der Basisklassen zugreifen. Wird eine abgeleitete Klasse in einem Programm verwendet, so kann nur auf die public - Methoden oder Attribute dieser Klasse sowie deren Oberklassen zugegriffen werden. Beispiel: Ghost ghost = new Ghost(3, 2, true); ghost.move(3, 1);// OK boolean dangerous = ghost.dangerous;// Fehler, privat

150 Holger VogelsangInformatik 2 - Einführung in Java und UML150 Vererbung Vererbung der Implementierung – Rechte bei Attribut- oder Methodenzugriffen n Szenario: public class A { public int i1; protected int i2; private int i3; int i4; } class B extends A { } class C { } class D extends A { } class E { } hska.iwii.myhska.iwii.p1hska.iwii.p2 class F { } //code

151 Holger VogelsangInformatik 2 - Einführung in Java und UML151 Vererbung Vererbung der Implementierung – Rechte bei Attribut- oder Methodenzugriffen public int i1 ist in allen Klassen und Paketen sichtbar. public class A { public int i1; protected int i2; private int i3; int i4; } class B extends A { } class C { } class D extends A { } class E { } class F { } //code hska.iwii.myhska.iwii.p1hska.iwii.p2

152 Holger VogelsangInformatik 2 - Einführung in Java und UML152 Vererbung Vererbung der Implementierung – Rechte bei Attribut- oder Methodenzugriffen protected int i2 ist in Unterklassen und im eigenen Paket sichtbar. public class A { public int i1; protected int i2; private int i3; int i4; } class B extends A { } class C { } class D extends A { } class E { } class F { } //code hska.iwii.myhska.iwii.p1hska.iwii.p2

153 Holger VogelsangInformatik 2 - Einführung in Java und UML153 Vererbung Vererbung der Implementierung – Rechte bei Attribut- oder Methodenzugriffen private int i3 ist nur in der eigenen Klasse sichtbar. public class A { public int i1; protected int i2; private int i3; int i4; } class B extends A { } class C { } class D extends A { } class E { } class F { } //code hska.iwii.myhska.iwii.p1hska.iwii.p2

154 Holger VogelsangInformatik 2 - Einführung in Java und UML154 Vererbung Vererbung der Implementierung – Rechte bei Attribut- oder Methodenzugriffen int i4 ist im eigenen Package sichtbar. public class A { public int i1; protected int i2; private int i3; int i4; } class B extends A { } class C { } class D extends A { } class E { } class F { } //code hska.iwii.myhska.iwii.p1hska.iwii.p2

155 Holger Vogelsang Überschreiben von Methoden Übersicht Informatik 2 - Einführung in Java und UML155 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

156 Holger VogelsangInformatik 2 - Einführung in Java und UML156 Überschreiben von Methoden Grundlagen n Idee: Eine abgeleitete Klasse besitzt eine Methode mit demselben Namen und derselben Signatur wie die Basisklasse. n Ein häufiges Problem beim Prinzip der Ersetzbarkeit: u Eine Basisklassenreferenz verweist auf ein Objekt einer abgeleiteten Klasse. u Wie kann festgestellt werden, welcher Klasse das Objekt angehört wichtig für den Aufruf der korrekten Methode? Basisklasse +print() AbgeleiteteKlasse +print()

157 Holger VogelsangInformatik 2 - Einführung in Java und UML157 Überschreiben von Methoden Grundlagen Definition: Überschreiben (von Methoden) n Wenn eine abgeleitete Klasse eine Methode implementiert, für die es bereits in einer Basisklasse eine Methode gibt, so überschreibt die abgeleitete Klasse die Methode der Basisklasse. n Wird die Operation auf einem Exemplar der abgeleiteten Klasse aufgerufen, so wird die überschriebene Implementierung der Methode aufgerufen. n Das ist unabhängig davon, welchen Typ die Referenz hat, über die das Objekt angesprochen wird. n Entscheidend ist der Typ des Objekts selbst, nicht der Typ der Variablen.

158 Holger VogelsangInformatik 2 - Einführung in Java und UML158 Überschreiben von Methoden Grundlagen Aufruf der neuen Methode print. public class Figure { public void print() { System.out.println("Figure"); } public class Ghost extends Figure { private boolean public void print() { System.out.println("Ghost"); } // … private int test() { Ghost ghost = new Ghost(3, 2, true); Figure figure = ghost; ghost.print(); figure.print(); //... Figure -xPos: int -yPos: int +print() Ghost -dangerous: boolean +print() Ausgabe: Ghost

159 Holger VogelsangInformatik 2 - Einführung in Java und UML159 Überschreiben von Methoden Verhalten Verhalten n Aufruf der Methode der abgeleiteten Klasse (auch, wenn die Methode über eine Basisklassenreferenz aufgerufen wird). n Vorteil: Code, der die Methoden aufruft, bleibt unverändert, selbst wenn Klassen hinzukommen oder sich Klassen ändern. n Verhalten Alle Methoden, die nicht als final deklariert werden, können überschrieben werden. u Signatur und Name der Methode müssen in Basisklasse und abgeleiteter Klasse identisch sein. Überschreibende Methoden sollten mit der versehen werden. Dann kann der Compiler prüfen, ob diese Methode wirklich eine andere überschreibt: public class Ghost extends Figure public void print() { System.out.println("Ghost"); }

160 Holger VogelsangInformatik 2 - Einführung in Java und UML160 Überschreiben von Methoden Verhalten n Beispiel für eine Methode, die nicht überschrieben werden darf: public class Figure { public final void print() { System.out.println("Figure"); }

161 Holger VogelsangInformatik 2 - Einführung in Java und UML161 Überschreiben von Methoden Manueller Einfluss Manueller Einfluss auf das Überschreiben Umgehung der automatischen Methodenauswahl, expliziter Aufruf einer Methode der Basisklasse: super.methode(Parameter); Beispiel: public class Figure { //... public void move(int xPos, int yPos) { //... } public class Ghost extends Figure { public void move(int xPos, int yPos) { super.move(xPos, yPos); // z.B. Neuzeichnen } Figure -xPos: int -yPos: int +move(xPos: int, yPos: int) Ghost -dangerous: boolean +move(xPos: int, yPos: int)

162 Holger VogelsangInformatik 2 - Einführung in Java und UML162 Überschreiben von Methoden Konstruktoren Konstruktoren und Überschreiben n Der Konstruktor der Basisklasse wird vor dem Konstruktor der abgeleiteten Klasse ausgeführt. n Aufruf einer polymorphen Methode im Konstruktor der Basisklasse: u Im Gegensatz zu C++: Aufruf der überschriebenen Methode u Achtung: Die abgeleitete Klasse ist noch gar nicht initialisiert!! u Konsequenz: Konstruktoren sollten nur private oder finale Methoden aufrufen. public class Base { private Bruch br; public Base() { br = new Bruch(); init(); } public void init() { br.setZaehler(42); } public class Derived extends Base { private MathVector mv; public Derived() { mv = new MathVector(3,true); init(); public void init() { mv.setValue(0, 66); } janein Base +Base() +init() Derived +Derived() +init()

163 Holger VogelsangInformatik 2 - Einführung in Java und UML163 Überschreiben von Methoden Hinweise Hinweise zum Umgang mit dem Überschreiben Ermittlung der richtigen Methode: n Zur Übersetzungszeit (early binding, statische Bindung): u Der Aufruf kann vom Compiler direkt in Bytecode umgesetzt werden, da die Methode jederzeit bekannt ist. nur für Methoden möglich, die als final oder private deklariert sind n Zur Laufzeit (late binding, dynamische Bindung): u Alle Methoden, die nicht final, nicht privat und nicht statisch sind Polymorphismus. Das Objekt findet selbst heraus, welche Methode aufgerufen werden soll u geringer Mehraufwand beim Methodenaufruf u Die überschreibende Methode der abgeleiteten Klasse darf die Zugriffsrechte der Methode der Basisklasse nicht einschränken.

164 Holger VogelsangInformatik 2 - Einführung in Java und UML164 Überschreiben von Methoden Hinweise Hinweise zum Design n Normale Methoden: Alle Methoden einer Klasse, die überschrieben werden dürfen, sollten nicht final sein. final sollte nur aus Design- nicht aus Geschwindigkeitsgründen hinzugefügt werden. n Finale Methoden: Methoden, die nicht überschrieben werden dürfen, sollten als final deklariert werden.

165 Holger Vogelsang Überschreiben von Methoden Regeln n Wiederholung: Prinzip der Ersetzbarkeit Wenn die Klasse Abgel eine abgeleitete Klasse der Klasse Basis ist, dann können in einem Programm alle Objekte der Klasse Basis durch Objekte der Klasse Abgel ersetzt worden sein, und es gelten trotzdem weiterhin alle zugesicherten Eigenschaften der Klasse Basis. n Der für die Basisklasse geschlossene Kontrakt mit Bezug auf Vorbedingungen, Nachbedingungen und Invarianten gilt also auch dann weiter, wenn Objekte der Basisklasse durch Objekte der abgeleiteten Klasse ersetzt werden. n Beim Überschreiben von Methoden gilt also: Abgeleitete Klassen dürfen zwar mehr anbieten, aber nicht mehr verlangen als Exemplare ihrer Basisklassen. Informatik 2 - Einführung in Java und UML165

166 Holger Vogelsang Überschreiben von Methoden Regeln Liskovsches Substitutionsprinzip Formulierung 1993 von Barbara Liskov und Jeannette Wing: Basisklasse Basis b ist ein Objekt von Basis. Abgeleitete Klasse Abgeleitet, die von Basis erbt a ist ein Objekt von Abgeleitet. n Es gilt: Sei q( b ) eine beweisbare Eigenschaft von Objekten b des Typs Basis. Dann soll q( a ) für Objekte a des Typs Abgeleitet wahr sein. n Beispiele kommen gleich! Besser verständlich als ist-ein-Beziehung. Informatik 2 - Einführung in Java und UML166 Basis Abgeleitet

167 Holger Vogelsang Überschreiben von Methoden Regeln n Konsequenzen für die Vorbedingungen, Nachbedingungen und Invarianten einer abgeleiteten Klasse: u Schwächere Vorbedingungen: -Eine abgeleitete Klasse kann die Vorbedingungen für eine Operation, die durch die Basisklasse definiert wird, einhalten oder abschwächen. Sie darf die Vorbedingungen aber nicht verschärfen. -Falls eine abgeleitete Klasse die Vorbedingungen verschärfen würde, würde damit ohne Absprache mit den Partnern von diesen mehr verlangt als vorher. -Erlaubte und verbotene Maßnahmen (unvollständig): Der Wertebereich der Übergabeparameter wird erweitert. Eine nicht öffentliche Methode wird öffentlich überschrieben. Der Wertebereich der Übergabeparameter wird verkleinert. Der Übergabeparameter wird von einem Objekt der Basisklasse auf ein Objekt der abgeleiteten Klasse eingeschränkt. Informatik 2 - Einführung in Java und UML167

168 Holger Vogelsang Überschreiben von Methoden Regeln u Stärkere Nachbedingungen: -Eine abgeleitete Klasse kann die Nachbedingungen für eine Operation, die durch eine Oberklasse definiert werden, einhalten oder einschränken. Sie darf die Nachbedingungen aber nicht lockern. -Falls eine abgeleitete Klasse die Nachbedingungen lockern würde, würde diesen damit wieder ohne Absprache mit den Partnern des Kontrakts mehr geboten als vorher. -Erlaubte und verbotene Maßnahmen (unvollständig): Der Wertebereich der Rückgabeergebnisse wird eingeschränkt. Der Rückgabetyp ist ein Objekt der abgeleiteten Klasse A ( A erbt von B ), während die Methode der Basisklasse ein Objekt einer Basisklasse B zurückgibt. Der Wertebereich der Rückgabeergebnisse wird erweitert. Der Rückgabetyp ist ein Objekt der Basisklasse B, während die Methode der Basisklasse ein Objekt einer abgeleiteten Klasse A ( A erbt von B ) zurückgibt. Informatik 2 - Einführung in Java und UML168

169 Holger Vogelsang Überschreiben von Methoden Regeln u Invarianten: -Eine abgeleitete Klasse muss dafür sorgen, dass die für die Basisklasse definierten Invarianten immer gelten. Sie darf die Invarianten verschärfen. -Die Partner des Kontrakts müssen sich auf die zugesicherten Invarianten verlassen können. -Eine Verhaltensänderung darf eintreten. Ergebnis: Design by Contract Informatik 2 - Einführung in Java und UML169

170 Holger Vogelsang Überschreiben von Methoden Regeln n Beispiel für die Verletzung der Ersetzbarkeit: Informatik 2 - Einführung in Java und UML170 Figure +display() Rectangle +display() +scaleX(factor: double) +scaleY(factor: double) context Rectangle::scaleX(factor: float) pre: factor > 0 post: (lengthX = * factor and lengthY = -lengthX: int -lengthY: int Square context Square inv: lengthX = lengthY Ersetzbarkeit verletzt: Neue Einschränkung der Längen in der Invariante des Quadrates!

171 Holger Vogelsang Überschreiben von Methoden Regeln n Beispiel für die Einhaltung der Ersetzbarkeit: Informatik 2 - Einführung in Java und UML171 Account +withdraw(amount: int) +payin(amount: int) +getBalance(): int CreditAccount +withdraw(amount: int) +changeLimit(limit: int) context Account::withdraw pre: amount > 0 and amount <= balance post: balance = - amount -creditLimit: int Nachbedingung wurde nicht gelockert, Vorbedingung gelockert ok. -balance: int context CreditAccount::withdraw pre: amount > 0 and amount <= (balance + creditLimit) post: balance = - amount

172 Holger Vogelsang Überschreiben von Methoden Regeln n Implementierung des Kontobeispiels: public class Account { private int balance = 0; public int getBalance() { return balance; } public void withdraw(int amount) { assert amount > 0 && amount <= balance; balance -= amount; } public void payin(int amount) { balance += amount; } Informatik 2 - Einführung in Java und UML172 public class CreditAccounte extends Account { private int creditLimit; public CreditAccount(int limit) { creditLimit = limit; public void withdraw(int amount) { assert amount > 0 && amount <= (balance + creditLimit); balance -= amount; } public void changeLimit(int limit) { creditLimit = limit; }

173 Holger Vogelsang Überschreiben von Methoden Regeln n Verwendung des Kontobeispiels: CreditAccount account1 = new CreditAccount(10000); Account account2 = new Account(); // Abheben bank.withdraw(account1); bank.withdraw(account2); // Methode zum Abheben eines Festbetrags // account verweist auf Account oder CreditAccount public void withdraw(Account accountPtr) { if (accountPtr.getBalance() >= 200) accountPtr.withdraw(200); } Wichtig: In der Methode withdraw sind Vor- und Nachbedingung sowie Invariante nur anhand der Klasse Account erkennbar! Informatik 2 - Einführung in Java und UML173

174 Holger Vogelsang Überschreiben von Methoden Regeln n Beispiel für die Verletzung der Ersetzbarkeit (Einschränkung der Vorbedingung): Informatik 2 - Einführung in Java und UML174 Account +withdraw(amount: int) +payin(amount: int) +getBalance(): int +transfer(amount: int, dest: Account) +setCreditLimit(limit: int) DepositAccount +transfer(amount: int, dest: Account) +setCreditLimit(limit: int) context Account::transfer pre: amount > 0 and amount <= balance + creditLimit post: (balance = – amount and dest.balance = + amount) Die Überweisung von einem Sparkonto wird verboten Einschränkung der Vorbedingung! -balance: int -creditLimit: int context DepositAccount::transfer pre: false

175 Holger Vogelsang Überschreiben von Methoden Regeln n Implementierung des Kontobeispiels (unvollständig): public class Account { private int balance = 0; private int creditLimit = 0; public int getBalance() { return balance; } public void transfer(int amount, Account dest) { assert amount > 0 && amount <= (balance + creditLimit)); balance -= amount; dest.payin(amount); } public void payin(int amount) { assert amount > 0; balance += amount; } Informatik 2 - Einführung in Java und UML175 public class DepositAccount extends Account public void transfer(int amount, Account dest) { assert false; }

176 Holger Vogelsang Überschreiben von Methoden Regeln n Verwendung des Kontobeispiels: DepositAccount account1 = new DepositAccount(); Account account2 = new Account(); // Überweisen bank.transfer(account1, account2); bank.transfer(account2, account1); // Methode zum Überweisen eines Festbetrags public void transfer(Account dest, Account source) { if (source.getBalance() + source.getCreditLimit() >= 200) source.transfer(200, dest); } Wichtig: In der Methode transfer berücksichtigt die Vorbedingung der Klasse Account. DepositAccount schränkt diese aber ein Methode transfer kann nicht richtig funktionieren. Informatik 2 - Einführung in Java und UML176

177 Holger Vogelsang Überschreiben von Methoden Regeln n Problem: Die Kontraktverletzungen werden erst zur Laufzeit entdeckt vollständige Test erforderlich. n Lösung: Spracherweiterungen, die eine Spezifikation der Kontrakte erlauben n Problem: Prüfungen auf Kontrakteinhaltung müssen manuell in den Code verteilt werden sehr viel Arbeit. n Lösung: AOP (Aspect Oriented Programming) kommt später Informatik 2 - Einführung in Java und UML177

178 Holger Vogelsang Überschreiben von Methoden Regeln n Wie können Kontrakte angegeben werden? u in UML mit OCL u im Quelltext mit Assertions (auch mit Hilfe von AOP) u Es gibt Erweiterungen objektorientierter Sprachen um Constraints, Auswahl: jContractor (http://jcontractor.sourceforge.net/),http://jcontractor.sourceforge.net/ C4J (http://c4j.sourceforge.net/),http://c4j.sourceforge.net/ COFOJA (http://code.google.com/p/cofoja)http://code.google.com/p/cofoja n Wie sieht es bei Schnittstellen oder abstrakten Klassen aus? Dort gibt es keine Implementierung! u in UML mit OCL spezifizieren u im Quelltext dokumentieren u Constraint-Erweiterung verwenden Informatik 2 - Einführung in Java und UML178

179 Holger Vogelsang Überschreiben von Methoden Kovarianz und Kontravarianz Genauerer Blick auf die Vererbung bei Methodenparametern und Rückgabetypen Kovariante Rückgabetypen in der clone -Methode: Der Rückgabetyp in der abgeleiteten Klasse erbt vom Rückgabetyp der Basisklasse u Einschränkung der Nachbedingung in dieser Form ist erlaubt. u Java unterstützt seit Version 5 kovariante Rückgabetypen. u C++ hat kovariante Rückgabetypen im Standard definiert. Allerdings unterstützen nicht alle Compiler dieses Sprachmittel. Informatik 2 - Einführung in Java und UML179 Figure +clone(): Figure Ghost +clone(): Ghost -x: int -y: int Die Klasse T2 ist der Klasse T1 kovariant, wenn alle Objekte von T2 gleichzeitig Objekte von T1 sind. Einfacher gesagt: T2 muss entweder T1 oder eine abgeleitete Klasse sein.

180 Holger Vogelsang Überschreiben von Methoden Kovarianz und Kontravarianz Kovariante Übergabetypen in der set -Methode: Der Übergabegabetyp in der abgeleiteten Klasse erbt vom Übergabegabetyp der Basisklasse u Die Einschränkung der Vorbedingung ist nicht erlaubt. Ausweg: In Java und C++ wird die Methode set in Figure gar nicht überschrieben, sie wird überladen! u Schlussfolgerung: Die Übergabetypen sind nicht kovariant. Informatik 2 - Einführung in Java und UML180 Figure +set(f: Figure) Ghost +set(g: Ghost) -x: int -y: int

181 Holger Vogelsang Überschreiben von Methoden Kovarianz und Kontravarianz Kontravariante Übergabetypen in der set -Methode: Der Übergabegabetyp in der abgeleiteten Klasse ist Basisklasse des Übergabetyps der Basisklasse u Aufweichung der Vorbedingung ist erlaubt. u Kontravariante Übergabetypen sind erlaubt. n Kontravariante Rückgabetypen sind nicht erlaubt. Informatik 2 - Einführung in Java und UML181 Figure +set(g: Ghost) Ghost +set(f: Figure) -x: int -y: int Die Klasse T2 ist der Klasse T1 kontravariant, wenn alle Objekte von T1 gleichzeitig Objekte von T2 sind. Einfacher gesagt: T1 muss entweder T2 oder seine abgeleitete Klasse sein.

182 Holger Vogelsang Vererbung Übersicht Informatik 2 - Einführung in Java und UML182 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

183 Holger VogelsangInformatik 2 - Einführung in Java und UML183 Vererbung Vererbung der Implementierung (abstrakte Basisklasse) Spezialfall der Vererbung: Abstrakte Basisklasse n Idee: Es gibt keine Objekte der Oberklasse. Alle Objekte der Basisklasse müssen durch Unterklassenobjekte repräsentiert werden. n Beispiel: Ein Konto ist entweder ein Girokonto oder ein Sparkonto. n Es muss eines von beiden sein, kann aber nicht in beiden Klassen gleichzeitig sein. Pacman-Beispiel: Es gibt keine Objekte der Basisklasse Figure. kursiv Figure GhostPacman

184 Holger VogelsangInformatik 2 - Einführung in Java und UML184 Vererbung Vererbung der Implementierung (abstrakte Basisklasse) Klassen werden mit dem Schlüsselwort abstract als abstrakt markiert, um zu verhindern, dass ein Objekt solcher Klasse erzeugt wird. Beispiel: Figure, von dem keine Objekte erzeugt werden dürfen. public abstract class Figure { private int xPos; private int yPos; public void handleCollisionWith(Figure other){ //... } public class Pacman extends Figure { private boolean public void handleCollisionWith(Figure other) { //... } //... } Überschreiben bzw. implementieren der Methode

185 Holger VogelsangInformatik 2 - Einführung in Java und UML185 Vererbung Vererbung der Implementierung (abstrakte Basisklasse) n Auch Methoden können abstrakt sein: u Die Basisklasse kann z.B. keine sinnvolle gemeinsame Implementierung anbieten. u Die abgeleiteten Klassen müssen die Methoden dann implementieren. u Ein Klasse mit mindestens einer abstrakten Methode ist abstrakt. Beispiel: Figure ohne Implementierung des Zeichnens public abstract class Figure { private boolean dead; public abstract void paint(JComponent panel); //... } keine Implementierung

186 Holger VogelsangInformatik 2 - Einführung in Java und UML186 Vererbung Vererbung der Spezifikation (Schnittstellen) Für die Vererbung einer Spezifikation gibt es in Java Schnittstellen ( interface ). n Es werden nur Methodensignaturen und statische Attribute angeboten, ohne irgendwelche Implementierungsdetails bekannt zugeben. Beispiel: Schnittstelle Runnable aus dem JDK public interface Runnable { void run(); } Alle Methoden sind public (nicht angegeben). Alle Attribute sind public, static und final (nicht angegeben). n Implementierung einer Schnittstelle: public class Figure implements Runnable public void run() { /*... */ } } n Eine Klasse darf beliebig viele Schnittstellen direkt implementieren (die Schnittstellen werden mit Kommata getrennt aufgeführt). > Runnable +run() Figure -xPos: int -yPos: int +run()

187 Holger VogelsangInformatik 2 - Einführung in Java und UML187 Vererbung Beispiel: Pacman n Ziel: Klassenhierarchie für das Zeichenprogramm oder Pacman-Figuren n Die Algorithmen des Programms sollen auch mit noch unbekannten Figuren funktionieren Erweiterbarkeit!

188 Holger Vogelsang Generische Klassen Übersicht Informatik 2 - Einführung in Java und UML188 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

189 Holger VogelsangInformatik 2 - Einführung in Java und UML189 Generische Klassen Definition: Generische Klasse Eine generische Klasse ist eine mit formalen generischen Parametern versehene Schablone. Erst durch die Verwendung der Klasse werden die Parameter durch konkrete Klassen ersetzt. So kann zur Übersetzungszeit eine höhere Typsicherheit sichergestellt werden. Darstellung mit UML: Parameteraufbau: Parameter-Name [ :Parameter-Typ ][ =Vorgabewert ] Parameter-Name : Name des Platzhalters Parameter-Typ : Optionale Klasse des Parameters. Ist kein Typ angegeben, kann jede beliebige Klasse class verwendet werden. Vorgabewert : Standardwert, falls die Typangabe fehlt TemplateKlasse T: class Parametertyp Parametername

190 Holger VogelsangInformatik 2 - Einführung in Java und UML190 Generische Klassen Vektor (Version 3) n Vektor als generische Klasse: public class Vector { private E[] public Vector(int size, E initValue) { values = (E[]) new Object[ size ]; for (int i = 0; i < size; ++i) { values[ i ] = initValue; } public void setValue(int index, E value) { values[ index ] = value; } public E getValue(int index) { return values[ index ]; } Vector - values: E[*] {bag} + Vector(size: int, initValue: E) + setValue(index: int, value: E) + getValue(index: int): E E: class

191 Holger Vogelsang Generische Klassen n Anmerkungen: public class Vector : ist der Platzhalter für eine Klasse. u Der Platzhalter steht immer für den Namen einer Klasse oder Schnittstelle: -Primitive Datentypen werden nicht unterstützt. -Intern speichert die Klasse Referenzen vom Typ Object ab. -Der Platzhalter dient zum typsicheren Zugriff, der zur Übersetzungszeit geprüft werden kann. -Der Platzhaltertyp kann fast wie ein normaler Datentyp innerhalb der Klasse verwendet werden. Ausnahmen: Objekterzeugung, Arrays Der cast-Operator im Konstruktor ist nicht geprüft. Deshalb wird die Warnung des Compilers unterdrückt. In Java können keine Arrays mit generischen Typen angelegt werden. Deshalb erzeugt der Vektor Object -Arrays kommt noch genauer. u Es dürfen mehrere Platzhalter verwendet werden. Beispiel: public class HashMap { /* … */ } Informatik 2 - Einführung in Java und UML191

192 Holger VogelsangInformatik 2 - Einführung in Java und UML192 Generische Klassen Eine konkrete Instanz einer generischen Klasse wird durch die folgende Schreibweise erzeugt: Klasse n Beispiel: Vector vector1 = new Vector<>(3, 0.0); Beispiel (der Compiler stellt sicher, dass die rot markierten Elemente vom Typ Double bzw. double sind): Vector v1 = new Vector<>(3, 0.0); v1.setValue(0, 2.0); double value = v1.getValue(); System.out.println(value); n Beispiel ohne generische Klasse (der Compiler kann keine Typprüfung vornehmen): Vector v1 = new Vector(3, 0.0); v1.setValue(0, 2.0); Double value = (Double) v1.getValue(); System.out.println(value); Falsche Werte (z.B. String ) werden zur Laufzeit bemerkt ( ClassCastException ). Kann anhand des Typs der Referenz erkannt werden.

193 Holger Vogelsang Generische Klassen Umsetzung in der virtuellen Maschine n Generische Klassen wurden erst mit Java 5 eingeführt. n Ziel war es, den Bytecode zu Java 1.4 kompatibel zu halten. n Wie lassen sich generische Klassen implementieren? u heterogen: Für jeden Typparameter wird eine neue Klasse erzeugt (C++-Ansatz). homogen: Es wird nur eine Klasse erzeugt. Der Typparameter wird durch die oberste Basisklasse Object ersetzt. Die Typparameter dienen nur zur Prüfung während der Übersetzungszeit (Java-Ansatz). n Der Compiler löscht also die Typ-Informationen (type erasure): u Der Bytecode bleibt kompatibel zu Java 1.4. u Die generischen Typen existieren nicht mehr zur Laufzeit führt zu Problemen: Vector v1 = new Vector<>(); if (v1 instanceof Vector ) // Compilerfehler, da Vector zur // Laufzeit nicht existiert! Korrekt wäre: Vector v1 = new Vector<>(); if (v1 instanceof Vector) // Vector existiert Informatik 2 - Einführung in Java und UML193

194 Holger Vogelsang Generische Klassen Umsetzung in der virtuellen Maschine u Damit sind die Klassen trotz unterschiedlicher Typparameter identisch: Vector v1 = new Vector<>(); Vector v2 = new Vector<>(); if (v1.getClass() == v2.getClass()) // true n Generische Klassen lassen sich auch ohne Typparameter verwenden (raw type): Vector v1 = new Vector (); Vector v2 = new Vector(); Die Verwendung führt aber z.B. bei setValue zu einer Compiler-Warnung. Informatik 2 - Einführung in Java und UML194

195 Holger VogelsangInformatik 2 - Einführung in Java und UML195 Generische Klassen Umsetzung in der virtuellen Maschine n Beispiel für die Umsetzung anhand des Vektors (Ausschnitt): public class Vector { private E[] values; //... public void setValue(int index, E value) { values[ index ] = value; } public E getValue(int index) { return values[ index ]; } Vector names = new Vector<>(); names.setValue(0, "Vogelsang"); String name = names.getValue(0); Definition im Quelltext Verwendung im Quelltext public class Vector { private Object[] values; //... public void setValue(int index, Object value) { values[ index ] = value; } public Object getValue(int index) { return values[ index ]; } Definition zur Laufzeit (fiktiv) Vector names = new Vector(); names.setValue(0, "Vogelsang"); String name = (String) names.getValue(0); Verwendung zur Laufzeit (fiktiv)

196 Holger Vogelsang Generische Klassen Arrays n Arrays mit generischen Typen haben einige Besonderheiten: u Die Deklaration ist problemlos möglich: private ArrayList [] al; u Aber eine Initialisierung klappt nicht intuitiv: private ArrayList [] al = new ArrayList<>[ 10 ]; // Compilerfehler n Lösungen: Verwendung des Platzhalters ? : private ArrayList [] al = (ArrayList []) new ArrayList [ 10 ]; u Erstellen einer Klasse für den Inhalt der Arrayzellen: public class MyList extends ArrayList { // notwendige Konstruktoren } private MyList[] al = new MyList[ 10 ]; Informatik 2 - Einführung in Java und UML196

197 Holger VogelsangInformatik 2 - Einführung in Java und UML197 Generische Methoden n Normale (nicht-generische) und generische Klassen dürfen generische Methoden besitzen. n Das wird häufig bei Hilfsklassen mit statischen Methoden eingesetzt: Beispiel: Methode asArrayList erzeugt aus einer variablen Anzahl Übergabewerte eine ArrayList (angelehnt an Klasse Arrays aus dem SDK) public class Arrays public static ArrayList asArrayList(T... a) { ArrayList result = new ArrayList<>(a.length); for (int i = 0; i < a.length; ++i) { result.add(a[ i ]); } return result; } Syntax: Zugriffsrecht Rückgabetyp Methodenname(Parameter)

198 Holger Vogelsang198 Generische Methoden Einschränkungen der Parametertypen n Die Typparameter lassen sich einschränken: u Basisklasse: Der Parametertyp muss von einer bestimmten oder mehreren Basisklassen erben. u Schnittstellen: Der Parametertyp muss eine bestimmte oder mehrere Schnittstellen implementieren. Beispiel, in dem der Vektor nur mit Klassen, die von Number erben, verwendet werden darf (weil der Vektor z.B. Zahlenoperationen durchführt), Vektor Version 4: public class Vector { private Number[] values; public double getSum() { // Summe alle Werte ermitteln double sum = 0.0; for (int i = 0; i < values.length; ++i) { sum += values[ i ].doubleValue(); } return sum; } //... } Informatik 2 - Einführung in Java und UML

199 Holger Vogelsang Generische Methoden Einschränkungen der Parametertypen n Es können auch mehrere Einschränkungen vorhanden sein. Bespiel: Der Typparameter des Vektors muss von Number erben und Cloneable implementieren: public class Vector n Syntax bei mehr als zwei Einschränkungen: public class Klasse n Achtung bei Vererbung: Vector ist keine Basisklasse von Vector ! Vector v1 = new Vector (); // Compilerfehler! Ansonsten ließe sich z.B. ein String in dem Vektor speichern. Die Methode public void dump(Vector v1) darf nicht mit einem Vector aufgerufen werden. Informatik 2 - Einführung in Java und UML199

200 Holger Vogelsang Generische Methoden Parametertypen und Vererbung n Ausweg: Wildcards erlauben es, einen Typ unbestimmt zu lassen. Beispiel: public void dump(Vector v1) ? ist ein unbekannter Typ, nicht Object. Die Methode dump darf jetzt mit jedem beliebigen Typparameter verwendet werden. n Wildcards unterstützen auch Typeinschränkungen (upper bound wildcards): u public void dump(Vector v1) Es können nur Vektoren übergeben werden, deren Inhalt von Number erbt. n Einschränkung des Typparameters nach unten: u public void dump(Vector v1) Es können nur Vektoren übergeben werden, deren Inhalt MyClass oder seine Basisklassen bzw. Schnittstellen sind. Klassen, die von MyClass erben, sind nicht erlaubt. u Diese Einschränkungen werden in der Praxis wenig verwendet. Informatik 2 - Einführung in Java und UML200

201 Holger Vogelsang Aufzähltypen Übersicht Informatik 2 - Einführung in Java und UML201 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

202 Holger VogelsangInformatik 2 - Einführung in Java und UML202 Aufzähltypen Einführung n Ein Aufzähltyp ist eine spezielle Klasse, von der benannte Objekte erzeugt werden. Beispiel für die Bewegungsrichtungen von Figuren in Pacman: public enum Direction { NONE, UP, DOWN, LEFT, RIGHT; } n Daraus erzeugt der Compiler eine Klasse, die ungefähr so aussieht: public class Direction extends Enum { public static final Direction NONE = new Direction("NONE", 0); public static final Direction UP = new Direction("UP", 1); public static final Direction DOWN = new Direction("DOWN", 2); public static final Direction LEFT = new Direction("LEFT", 3); public static final Direction RIGHT = new Direction("RIGHT", 4); private Direction(String name, int index) { super(name, index); } // Alle Werte ermitteln public static Direction[] values() { /*... */ } // weitere Methoden... } > Direction NONE UP DOWN LEFT RIGHT

203 Holger Vogelsang Aufzähltypen Einführung Vorteil von Aufzähltypen gegenüber finalen int -Werten: In einem switch -Block kann der Compiler testen, ob alle Werte eines Typs einen case - Block haben. u Der Benutzer kann anhand des Typs dessen Bedeutung erkennen. u Der Typ kann nur die erlaubten Werte annehmen. Was bietet die Basisklasse Enum noch (Auswahl)? public String name() : Name des Aufzählwertes (z.B. "LEFT" ) Beispiel: String name = Direction.LEFT.name(); public ordinal() : Index eines Wertes in der Aufzählung (z.B. 3 für der Wert Direction.LEFT, weil LEFT als dritter Wert angegeben ist) Beispiel: int index = Direction.LEFT.ordinal(); public static > valueOf(Class enumType, String name) : Ermittelt aus dem Namen den Aufzählwert Beispiel: Direction dir = Enum.valueOf(Direction.class, "UP"); Informatik 2 - Einführung in Java und UML203

204 Holger Vogelsang Aufzähltypen Einführung n Ein Aufzähltyp kann in Pacman für zwei Aufgaben eingesetzt werden: u Richtung, in die sich eine Figur bewegt public enum Direction { NONE, UP, DOWN, LEFT, RIGHT; } u Position einer Zelle, an der sich ein Rahmen befindet. -Problem: Eine Zelle kann an mehr als einer Position einen Rahmen haben. -Lösung: Bitkombination als zusätzlichen Wert dem Aufzähltyp übergeben ersetzt nicht den Index (Aufruf ordinal() ). public enum Direction { // noch unvollständig NONE(0), UP(1), DOWN(2), LEFT(4), RIGHT(8), ALL(15); } Die zweite Variante wird auch für die Richtung verwendet, wobei ALL unsinnig ist. n Beispiele: LEFT | UP | DOWN RIGHT Informatik 2 - Einführung in Java und UML204

205 Holger Vogelsang Aufzähltypen Methoden und Attribute n Wie funktioniert die Übergabe zusätzlicher Parameter an einen Aufzählwert genau? Dieses Beispiel ergibt Übersetzungsfehler, weil der entsprechende Konstruktor fehlt: public enum Direction { NONE(0), UP(1), DOWN(2), LEFT(4), RIGHT(8), ALL(15); } n Aufzähltypen dürfen zusätzliche Konstruktoren, Attribute und Methoden erhalten: public enum Direction { NONE(0), UP(1), DOWN(2), LEFT(4), RIGHT(8), ALL(15); private int value; protected Direction(int value) { this.value = value } public int getValue() { return value; } // weitere Methoden } Informatik 2 - Einführung in Java und UML205 Konstruktoraufruf

206 Holger Vogelsang Aufzähltypen Methoden und Attribute n Aufzähltypen dürfen auch Schnittstellen implementieren. Sie können aber nicht von Klassen erben, weil sie intern bereits Enum als Basisklasse besitzen. Informatik 2 - Einführung in Java und UML206

207 Holger Vogelsang Regeln und Hinweise Übersicht Informatik 2 - Einführung in Java und UML207 Überladen Gener. Klassen Aufzähl- typen Regeln Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

208 Holger VogelsangInformatik 2 - Einführung in Java und UML208 Regeln und Hinweise Wichtige Methoden und Operatoren einer Java-Klasse Welche Methoden und Operatoren haben eine besondere Bedeutung (kleine Auswahl, hier anhand der Klasse Ghost )? Methode/OperatorBedeutung Ghost() Standardkonstruktor. Wird immer dann automatisch erzeugt, wenn kein eigener Konstruktor geschrieben wurde. protected void finalize() Wird aufgerufen, bevor das Objekt gelöscht wird. public boolean equals(Object s) Kommt noch… public String toString() Wird aufgerufen, wenn eine String-Darstellung des Objektes benötigt wird.

209 Holger VogelsangInformatik 2 - Einführung in Java und UML209 Regeln und Hinweise Wichtige Methoden und Operatoren einer Java-Klasse Identität und Gleichheit zweier Objekte (hier anhand der Klasse Ghost ): Methode/OperatorBedeutung Ghost gh1 = new Ghost(); Ghost gh2 = new Ghost(); if (gh1.equals(gh2)) Inhaltlicher Vergleich der Objekte. Dazu sollte die Methode equals der Klasse Ghost überschrieben werden. Ghost gh1 = new Ghost(); Ghost gh2 = new Ghost(); if (gh1 == gh2) Identität der Objekte. Dazu werden die Referenzen auf die Objekte verglichen. Sind diese identisch, so handelt es sich um dasselbe Objekt.

210 Holger Vogelsang Regeln und Hinweise Wichtige Methoden und Operatoren – Vergleich von Objekten n Bedingungen für die Gleichheit zweier Objekte: u Die Gleichheitsprüfung ist reflexiv: A ist gleich A. u Die Gleichheitsprüfung ist symmetrisch: A ist gleich B ==> B ist gleich A. u Die Gleichheitsprüfung ist transitiv: A ist gleich B und B ist gleich C ==> A ist gleich C. n Jede Implementierung muss diese Bedingungen einhalten! n Problem: Wie sieht der Vergleich bei Vererbung aus? Informatik 2 - Einführung in Java und UML210 -xPos: int -yPos: int Figure +equals(o: Object): boolean -dangerous: boolean Ghost +equals(o: Object): boolean Die equals -Methode vergleicht die Positionen der Figuren Die equals -Methode vergleicht die Positionen und die Gefährlichkeit der Geister

211 Holger Vogelsang Regeln und Hinweise Wichtige Methoden und Operatoren – Vergleich von Objekten n Ohne Beweis: Der Vergleich von Objekten unterschiedlicher Klassen führt zur Verletzung mindestens einer Regeln. n Konsequenz: Nur Objekte identischer Klassen werden überhaupt auf Gleichheit überprüft. n Beispiel: Informatik 2 - Einführung in Java und UML211 public class Figure { private int xPos; private int yPos; public boolean equals(Object o) { if (o != null && o.getClass() == getClass()) { Figure f = (Figure) o; return xPos == f.xPos && yPos == f.yPos; } return false; } public class Ghost extends Figure { private boolean dangerous; public boolean equals(Object o) { return super.equals(o) && ((Ghost) o).dangerous == dangerous; }

212 Holger Vogelsang Regeln und Hinweise Wichtige Methoden und Operatoren – Vergleich von Objekten n Erklärung des Beispiels: Die Basisklasse Figure testet mit getClass() zunächst auf identische Klassen. u Nur dann werden die Attribute vergleichen. Die abgeleitete Klasse Ghost lässt die Basisklasse die Gleichheit feststellen und prüft dann das zusätzliche Attribut. n Anmerkung: u In der Praxis ist es manchmal auch sinnvoll, nur die Basisklasse ohne Test auf Klassengleichheit die Prüfung vornehmen zu lassen hängt von der Aufgabe ab. u Dann können eine Figur und ein Geist gleich sein! Informatik 2 - Einführung in Java und UML212

213 Holger Vogelsang Regeln und Hinweise Probleme bei Vererbung – Instabile Basisklasse n Und noch etwas gibt es bei Vererbung zu beachten, Beispiel: Die Klasse LoggingVector erbt von der Basisklasse Vector (Vererbung der Implementierung). LoggingVector protokolliert zusätzlich alle Aktionen von Vector. Die Methode clear wird nicht überschrieben, weil sie intern setValue aufruft. Informatik 2 - Einführung in Java und UML213 Vector +Vector(size: int) +setValue(index: int, value: E) +getValue(index: int): E +clear() LoggingVector +LoggingVector(size: int) +setValue(index: int: value: E) +getValue(index: int): E -values: E[*] setValue und getValue protokollieren die Aktion und rufen die Methoden der Basisklasse auf. public void clear() { for (int i = 0; i < values.length; i++) setValue(null, i); } E: class

214 Holger Vogelsang Regeln und Hinweise Probleme bei Vererbung – Instabile Basisklasse n Wo ist jetzt das Problem? n Eine Änderung an der Basisklasse führt dazu, dass die abgeleitete Klasse nicht mehr korrekt funktioniert. Beim Aufruf von clear erfolgt kein Logging mehr! Informatik 2 - Einführung in Java und UML214 Vector +Vector(size: int) +setValue(index: int, value: E) +getValue(index: int): E +clear() LoggingVector +LoggingVector(size: int) +setValue(index: int, value: E) +getValue(index: int): E -values: E[*] setValue und getValue protokollieren die Aktion und rufen die Methoden der Basisklasse auf. Kein Aufruf von setValue mehr public void clear() { for (int i = 0; i < values.length; i++) values[ i ] = null; } kein Aufruf E: class

215 Holger Vogelsang Regeln und Hinweise Probleme bei Vererbung – Instabile Basisklasse n Problem der instabilen Basisklassen (Fragile Base Class Problem): u Anpassungen an einer Basisklasse führen zu unerwartetem Verhalten von abgeleiteten Klassen. u Konsequenz: Anpassungen an Basisklassen können häufig nicht vorgenommen werden, ohne den Kontext der abgeleiteten Klassen mit einzubeziehen. u Problem: Die Wartung objektorientierter Systeme, die häufig die Vererbung der Implementierung nutzen, wird stark erschwert. u Konsequenz: Vererbung der Implementierung darf nicht eingesetzt wird, wenn spätere Änderungen an den Basisklassen wahrscheinlich sind. u Ziel: Reine Vererbung der Spezifikation. Die Vermeidung von Redundanzen, kann auch über Delegationsbeziehungen erreicht werden. n Anmerkung: Wenn die abgeleitete Klasse sich exakt an die Spezifikation der Basisklasse hält und die Spezifikation später auch nicht verändert wird, ist das Erben einer Implementierung problemlos möglich. n In der Praxis: Niemand spezifiziert das Verhalten exakt… Informatik 2 - Einführung in Java und UML215

216 Holger Vogelsang Regeln und Hinweise Probleme bei Vererbung – Instabile Basisklasse n Lösung mit Delegation: Informatik 2 - Einführung in Java und UML216 Vector +Vector(size: int) +setValue(index: int, value: E) +getValue(index: int): E +clear() LoggingVector +LoggingVector(size: int) +setValue(index: int, value: E) +getValue(index: int): E +clear() -values: E[*] -size: int > VectorInterface +setValue(index: int, value: T) +getValue(): E +clear() LoggingVector delegiert die Aufrufe an Vector weiter, nachdem die Log-Ausgaben erfolgt sind. E: class

217 Holger Vogelsang Regeln und Hinweise Probleme bei Vererbung – Instabile Basisklasse Unvollständige Implementierung des Beispiels: public class LoggingVector implements VectorInterface { private Vector vector; public LoggingVector(int size) { vector = new Vector (size); public void setValue(int index, E value) { // Log-Ausgaben, z.B. hier vereinfacht auf dem Bildschirm System.out.println("Neuer Wert " + value + " an Position " + index + " im Vektor"); vector.setValue(value, index); } // usw. } Änderungen an der Implementierung von Vector beeinflussen nicht die Funktionsfähigkeit von LoggingVector. Neue Methoden im Vector müssen auch in der Schnittstelle deklariert werden können so nicht in LoggingVector vergessen werden. Informatik 2 - Einführung in Java und UML217

218 Holger Vogelsang Regeln und Hinweise Probleme bei Vererbung – Instabile Basisklasse n Fazit: u Vererbung der Spezifikation ist sicherer in Bezug auf Änderungen. u Vererbung der Implementierung erfordert häufig weniger Code teilweise aber automatisch generierbar (z.B. in Eclipse). u Wenn sich Vererbung der Spezifikation leicht umsetzen lässt, ist diese Form der Vererbung vorzuziehen. Informatik 2 - Einführung in Java und UML218

219 Holger Vogelsang Klassendiagramme Übersicht Informatik 2 - Einführung in Java und UML219 Überladen Gener. Klassen Regeln Aufzähl- typen Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

220 Holger VogelsangInformatik 2 - Einführung in Java und UML220 Klassendiagramme Übersicht Einführung in Java und UML Arbeitsschritte und Software Imperative Aspekte Objektorientierte Programmierung Referenzen und dynamische Speicherverwaltung Vererbung Generische Klassen und Methoden Aufzähltypen Regeln und Hinweise Klassendiagramme Fehlerbehandlung mit Ausnahmen Pakete Annotationen Laufzeit-Typinformationen Ein- und Ausgabe Grafische Oberflächen und Animationen mit JavaFX Datenstrukturen Objektorientierter Entwurf

221 Holger VogelsangInformatik 2 - Einführung in Java und UML221 Klassendiagramme Modellierungswerkzeuge Leicht verfügbare Modellierungswerkzeuge n Visual Paradigm for UML u Frei verfügbare Community-Edition, Lizenz für die Professional-Edition im Ilias u u keine Code-Erzeugung in der Community-Edition n UML Lab u Kostenlose Studentenlizenz unter n ArgoUML u Open Source, nur UML 1.4 u u Start ohne lokale Installation: u Code-Erzeugung für Java, C++, PHP, …

222 Holger Vogelsang Klassendiagramme Modellierungswerkzeuge n Magicdraw u Frei verfügbare Community-Edition u u Code-Erzeugung für C++, C# und Java (nicht Community-Edition) n eUML u Auch als Open Source verfügbar, Eclipse-Plugin u u Code-Erzeugung nur für Java n Borland Together u u Lizenz bei Frau Knodel in LI 136 n Fujaba u Open Source u u Code-Erzeugung nur für Java Informatik 2 - Einführung in Java und UML222

223 Holger VogelsangInformatik 2 - Einführung in Java und UML223 Klassendiagramme Beziehungen zwischen Klassen Rückblick: Die UML-Darstellung einer Klasse Attribute Klassenname Operationen Account -number: int -balance: int -count: int +payOff(amount: int) +transfer(amount: int, number: int) +payIn(amount:int) statisches Attribut

224 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen Definition: Stereotyp Durch einen Stereotypen wird der Zweck oder die Rolle einer Klasse beschrieben. Einige vordefinierte Stereotypen: > : Diese Klasse unterstützt zentrale und wichtige Klassen des Modells Hilfsklasse. > : Diese Klasse stellt einen Teil der zentralen Logik der Anwendung dar. > : eine Schnittstelle (siehe früheres Kapitel) > : Von dieser Klasse gibt es keine Instanzen. Sie stellt lediglich (statische) Hilfsmethoden und -attribute zur Verfügung. > : neuer Datentyp, der nur bestimmte Werte annehmen kann Aufzähltyp n Es dürfen auch eigenen Stereotypen erstellt werden. Informatik 2 - Einführung in Java und UML224

225 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen Rückblick: Die UML-Darstellung eines Aufzähltyps n Java-Spezialitäten wie die Initialisierung der Werte durch Konstruktoren sind nicht vorgesehen. Informatik 2 - Einführung in Java und UML225 > Direction NONE UP DOWN LEFT RIGHT

226 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Geschachtelte Klassen n Klassen dürfen in anderen Klassen deklariert werden. n Die Schachtelung u erlaubt es der inneren Klasse, auf die Daten der äußeren zuzugreifen und u bietet die Möglichkeit, eine Klasse, die im Wesentlichen nur von einer anderen verwendet wird, auch in dieser zu deklarieren. Informatik 2 - Einführung in Java und UML226 Aussen > Innen -attribut: int public class Aussen { class Innen { int attribut; //... } //... }

227 Holger VogelsangInformatik 2 - Einführung in Java und UML227 Klassendiagramme Beziehungen zwischen Klassen n Zwischen Klassen können unterschiedliche Beziehungen bestehen. n Die Beziehungen lassen sich ja nach Aufgabe in unterschiedliche Kategorien einteilen. Kategorien in der UML: n Assoziation n Aggregation und Komposition (Teil und Ganzes) n Vererbung (von einer Spezifikation, von einer Implementierung)

228 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation Definition: Binäre Assoziation Eine binäre Assoziation beschreibt die semantische Beziehung zwischen zwei Klassen. Beispiel: Pacman und GameController kennen sich. n Beide Klassen können auf der jeweils anderen Operationen aufrufen. Informatik 2 - Einführung in Java und UML228 Assoziation GameControllerPacman

229 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation Leserichtung ( GameController steuert Pacman ): n Multiplizität (wie viele Objekte können gleichzeitig an der Beziehung beteiligt sein): Informatik 2 - Einführung in Java und UML229 Leserichtung GameControllerPacman steuert Name der Assoziation Der Controller steuert mindestens einen, max. beliebig viele Figuren. GameControllerFigure steuert max. Anzahl Controller im Spiel 11..*

230 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Rolle (sie beschreibt, welche Funktion/Rolle eine an einer Assoziation beteiligten Klasse einnimmt): u Zweck einer Rolle: -Besseres Verständnis der Assoziation -Name des Attributs in der Implementierung Informatik 2 - Einführung in Java und UML230 Grosshaendler Haendler -verkaeufer Sichtbarkeit der Rolle Endkunde -kaeufer Name der Rolle -verkaeufer -kaeufer

231 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Implementierungsbeispiel, in dem der Name der Rolle den Namen des Attributes ergibt: public class Haendler { private ArrayList verkaeufer; private ArrayList kaeufer; // Methoden usw. } n Im Falle einer automatischen Code-Erzeugung ergeben sich so lesbare Attributnamen im Quelltext. n Achtung: Eine Rolle mit privater Sichtbarkeit kann durch Getter- und Setter-Methoden von außen zugänglich gemacht werden. Informatik 2 - Einführung in Java und UML231

232 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Eigenschaft (ähnlich wie Eigenschaften von Attributen geben sie Eigenschaften von Assoziationen nähere Hinweise auf die Umsetzung der Assoziation): u Der Controller benötigt die Figuren in einer bestimmten Reihenfolge (ist in der Beispielimplementierung aber nicht der Fall). Informatik 2 - Einführung in Java und UML232 GameControllerFigure bearbeitet {ordered} Eigenschaft

233 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation u Eigenschaftstypen (unvollständig): -{subsets } : Die Menge der Objekte an diesem Assoziationsende ist eine Teilmenge der Objekte am Assoziationsende. -{union} : Die Menge der Objekte an diesem Assoziationsende ist die Vereinigung aller seiner subsets -Assoziationsenden. Beispiel (die Buchbestellung setzt sich aus den bereits gelieferten und den nicht verfügbaren Büchern zusammen): Informatik 2 - Einführung in Java und UML233 BestellungBuch geliefert {subsets bestellt} nicht_vorhanden {subsets bestellt} /bestellt {union} Die Menge bestellt ist aus allen Teilmengen abgeleitet. Es kommen keine weiteren Bücher hinzu.

234 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation -{ordered} : Die so markierten Objekte am Ende der Assoziation liegen sortiert vor. Duplikate sind nicht erlaubt. -{bag} : Dasselbe Objekt darf am Ende der Assoziation mehrfach erscheinen. -{seq} bzw. {sequence} : Das Ende der Assoziation verweist auf eine geordnete Menge von Objekten. Duplikate sind erlaubt. Informatik 2 - Einführung in Java und UML234

235 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Einschränkung (Teilnahme eines Objektes an einer Assoziation angeben). u Einschränkungstypen: -{or} : Das Objekt muss eine der beiden Assoziationen verwenden. -{xor} : Das Objekt darf nur eine der beiden Assoziationen verwenden. -{and} : Das Objekt muss an beiden Assoziationen teilnehmen lässt sich besser durch Kardinalität 1 ausdrücken. u Beispiel für ein Meilenkonto bei einer Fluggesellschaft: Informatik 2 - Einführung in Java und UML235 inhaber Ein Meilenkonto gehört entweder einer Firma oder einer Person. Person inhaber xor Anschrift or Meilenkonto Eine Person muss eine -Adresse oder eine Anschrift angeben. Firma

236 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation Implementierung einer xor -Einschränkung: -Programmgesteuert überprüfen -Durch Vererbung und Einführung einer weiteren Klasse: Informatik 2 - Einführung in Java und UML236 inhaber Person Firma JuristischePerson inhaber Person inhaber xor MeilenkontoFirma Meilenkonto 1

237 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Navigierbarkeit (erlaubt die Angabe, in welche Richtung eine Assoziation gelesen wird). Es werden folgende Arten unterstützt: Navigierbar: Die Klasse Field kennt die Klasse Pacman am Ende der Assoziation. Nicht navigierbar: Die Klasse Pacman kennt die Klasse Ghost am Ende der Assoziation nicht. u Unspezifiziert: Es wird keine Aussage über die Navigierbarkeit getroffen. In der Praxis wird das häufig als navigierbar interpretiert. u Bidirektionale Navigierbarkeit: Beide Klassen kennen sich gegenseitig und können so auch jeweils die Methoden des Anderen aufrufen. Informatik 2 - Einführung in Java und UML237 Pacman Field Ghost Pacman GameController Pacman GameController

238 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation u Verbot der Navigierbarkeit: Beide Klasse dürfen sich nicht kennen. Es besteht zwar eine logische Beziehung, die aber nicht durch eine Assoziation ausgedrückt werden soll nicht sehr gebräuchlich. u Unidirektionale Navigierbarkeit: Die Navigation ist in nur einer Richtung erlaubt. Teilweise Spezifikation der Navigation: Es ist offen gelassen, ob Pacman auch das Field kennt. Informatik 2 - Einführung in Java und UML238 Pacman Ghost Pacman Field Pacman Field

239 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Implementierung einer Assoziation: Informatik 2 - Einführung in Java und UML239 GameControllerFigure controls -figures -controller 1..* 1 public abstract class Figure { private GameController controller; //... } public class GameController { private ArrayList figures; //... }

240 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Reflexive Assoziation: Eine Assoziation einer Klasse zu sich selbst, ansonsten handelt es sich im eine normale Assoziation. u Der Vorgesetzte hat mindestens einen Untergebenen. u Jeder Untergebene hat maximal einen Vorgesetzten. Jeder Vorgesetzte kann also auch wieder Mitarbeiter sein. u Implementierungsmöglichkeit: public class Mitarbeiter { private Mitarbeiter vorgesetzter; private ArrayList untergebener; //... } Informatik 2 - Einführung in Java und UML240 -untergebener -vorgesetzter 0..1 * leitet Mitarbeiter

241 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation N-äre Assoziation Eine n-äre Assoziation ist die allgemeine Form einer Assoziation zwischen n Klassen. n Erklärung des Beispiels: Die drei Klassen stehen in einer Beziehung namens Menue. Nicht jedes Hauptgericht muss in einem Menü vorkommen (Multiplizität 0 ). Jedes Hauptgericht kann in beliebig vielen Menüs vorkommen (Multiplizität * ). Wenn ein Hauptgericht in mindestens einem Menü vorhanden sein muss, würde man am Hauptgericht die Multiplizität 1..* eintragen. Informatik 2 - Einführung in Java und UML241 Dessert Hauptgericht Vorspeise 0..* Menue Assoziationsname

242 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Wie kann eine n-äre Assoziation implementiert werden? n Ganz einfach durch Umsetzung in mehrere binäre Assoziationen: Informatik 2 - Einführung in Java und UML242 Dessert Hauptgericht Vorspeise 0..* Menue Dessert Hauptgericht Vorspeise 0..* Menue 1 1 1

243 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Qualifizierte Assoziation: u Eine qualifizierte Assoziation besitzt einen Qualifizierer, der eine Menge von Attributen besitzt, die das Objekt am anderen Ende der Assoziation eindeutig referenziert. u Eine qualifizierte Assoziation ist nur für binäre Assoziationen definiert. n Beispiel: Jeder Mitarbeiter in einer Firma wird über seine Personalausweisnummer eindeutig identifiziert. Nicht zu jeder Ausweisnummer gibt es einen Mitarbeiter (Multiplizität 0..1 ). Ein Mitarbeiter darf für beliebig viele Firmen arbeiten, hat aber in jeder dieselbe Personalausweisnummer (Multiplizität 1..* ). Informatik 2 - Einführung in Java und UML * 0..1 Qualifizierte Assoziation Firma Mitarbeiter persNummer Lohnzahlung Qualifizierer -persNummer: int

244 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Vergleich zu einer normalen Assoziation: Informatik 2 - Einführung in Java und UML * 0..1 Firma Mitarbeiter persNummer Lohnzahlung -persNummer: int 1..* Firma Mitarbeiter Lohnzahlung -persNummer: int n-zu-m-Beziehung Die Beziehung zum Mitarbeiter wird genauer spezifiziert Fremdschlüsselkonzept in Datenbanken.

245 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Implementierung einer qualifizierten Assoziation: Informatik 2 - Einführung in Java und UML245 public class Mitarbeiter { private int persNummer; //... } // persNummer ist der Index im Vektor public class Firma { private ArrayList mitarbeiter; //... } // persNummer ist der Schlüssel in // einer Hashtabelle oder einem Baum // (kommen noch...) public class Firma { private HashMap mitarbeiter; //... }

246 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Assoziationsklasse: Eine Assoziationsklasse ist eine Assoziation, die neben Attributen auch Operationen wie bei einer Klasse aufnehmen kann: u Die Namen der Assoziation und ihrer Klasse müssen identisch sein. u Einsatz: Zusätzliche Attribute können logisch keinem der Enden der Assoziation zugeordnet werden Ablage in der Assoziationsklasse. n Beispiel: Die Auftragsnummer kann weder der Firma noch dem Kunden zugeordnet werden. Informatik 2 - Einführung in Java und UML * Firma Kunde Auftrag -nummer: int Assoziationsklasse

247 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Implementierung: Weder C++ noch Java kennen Assoziationsklassen Einführung einer Zwischenklasse: n Der Kunde erteilt beliebig viele Aufträge. n Eine Firma kann beliebig viele Aufträge ausführen. Informatik 2 - Einführung in Java und UML * Firma Kunde Auftrag -nummer: int 1 FirmaKunde Auftrag -nummer: int 1..* 1 fuehrtAuserteilt

248 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Assoziation n Implementierung einer Assoziationsklasse: Informatik 2 - Einführung in Java und UML248 public class Auftrag { private int nummer; private Kunde kunde; private Firma firma; //... } public class Firma { private ArrayList auftraege; //... } public class Kunde { private ArrayList auftraege; //... }

249 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Aggregation Definition: Aggregation Eine Aggregation ist eine spezielle Form einer binären Assoziation. Sie beschreibt eine Teil- Ganzes-Beziehung zwischen genau zwei Klassen. n Beispiel: Informatik 2 - Einführung in Java und UML * Field Figure 0..1 Ganzes Teil Aggregation Das Teil kennt das Ganze nicht (Pfeilspitze).

250 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Aggregation n Eigenschaften einer Aggregation: u Die Lebensdauer des Ganzen ist von der Lebensdauer der Teile unabhängig. u Die Lebensdauer der Teile ist von der Lebensdauer des Ganzen unabhängig. u Teile können in mehreren Ganzen gleichzeitig verwendet werden. u Die Teile kennen das Ganze häufig nicht. n Einsatzgebiete für Aggregation: u Das Ganze handelt als Stellvertreter für seine Teile. u Es nimmt Aufträge entgegen und delegiert diese an die Teile. u Beispiel: Pacman -Ganzes: Spielfeld -Teile: Einzelne Figuren in der Zeichenfläche -Auftrag: Anforderung, sich neu zu zeichnen -Delegation: Jedes Teil erhält den Auftrag, sich selbst neu zu zeichnen. Informatik 2 - Einführung in Java und UML250

251 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Aggregation n Implementierung einer Aggregation: n Hinweise: u Das Ganze erzeugt und löscht die Teile i.d.R. nicht selbst. u Das Ganze besitzt häufig Methoden zum Hinzufügen und Entfernen von Teilen sowie zum Besuchen aller Teile. Informatik 2 - Einführung in Java und UML251 public class Field { private ArrayList figures; //... } public abstract class Figure { //... }

252 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Komposition Definition: Komposition Eine Komposition ist eine starke Form der Aggregation. Hier sind das Ganze und seine Teile untrennbar miteinander verbunden. n Beispiel: Informatik 2 - Einführung in Java und UML * GameController Figure Ganzes Teil Komposition, Multiplizität ist 1 Das Teil kennt das Ganze nicht (Pfeilspitze).

253 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Komposition n Eigenschaften einer Komposition: u Die Lebensdauer des Ganzen ist von der Lebensdauer der Teile unabhängig. Beim Löschen eines Teils bleibt das Ganze bestehen. u Die Lebensdauer der Teile ist von der Lebensdauer des ganzen abhängig: Beim Löschen des Ganzen werden die Teile auch gelöscht. u Teile können nicht in mehreren Ganzen gleichzeitig verwendet werden. u Die Teile kennen das Ganze häufig nicht. n Einsatzgebiete für Komposition siehe Aggregation Informatik 2 - Einführung in Java und UML253

254 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Komposition Spezialfall der Komposition: Multiplizität 0..1 n Figuren dürfen außerhalb und ohne Bezug zum Controller erzeugt werden. n Sie werden dann als Teile am Controller registriert und gehören ab diesem Zeitpunkt zum Controller. n Figuren dürften auch an einen anderen Controller übertragen werden. Informatik 2 - Einführung in Java und UML * GameController Figure

255 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Komposition n Implementierung einer Komposition (in Java wie bei einer Aggregation): n Hinweise: u Häufig ist es sinnvoll, dass das Ganze die Teile selbst erzeugt und löscht: Die Teile können nicht so versehentlich auch ohne das Ganze verwendet werden. u Das Ganze besitzt i.d.R. Methoden zum Erzeugen und Entfernen von Teilen sowie zum Besuchen aller Teile. Informatik 2 - Einführung in Java und UML255 public class GameController { private ArrayList figures; //... } public abstract class Figure { //... }

256 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Hinweise zur Auswahl n Wann wird ein bestimmter Beziehungstyp verwendet? u Existenzabhängige Teil-Ganzes-Beziehung: Komposition u Logische Einheit, die nicht existenzabhängig ist: Aggregation u Kaskadierende Methodenaufrufe: Aggregation (z.B. Pacman-Spiel, in dem die Spielfläche die Aufrufe zum Neuzeichnen an die Figuren weiter leitet) u Rumbaugh: Think of Aggregation as a modeling placebo. Informatik 2 - Einführung in Java und UML256

257 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Abhängigkeit Definition: Abhängigkeit Eine Abhängigkeit zeigt, dass eine Klasse (Client) eine andere (Supplier) zur Erfüllung ihrer Aufgaben benötigt. Die Abhängigkeit dient nur der Dokumentation. Beispiel ( Bewerber ruft eine Methode der Klasse Firma auf): n Implementierung: public class Bewerber { public void bewerben(Firma firma) { firma.bewerben(this); } Informatik 2 - Einführung in Java und UML257 Firma +bewerben() Bewerber +bewerben() > SupplierClient

258 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Abhängigkeit n Abhängigkeitstypen werden durch sogenannte Stereotypen beschrieben. Vordefiniert sind (unvollständig): > : Der Client ruft mindestens eine Methode des Suppliers auf. > : Der Client erzeugt Supplier-Objekte. > : Der Client ist logisch aus dem Supplier abgeleitet. Er kann beispielsweise dieselbe Funktionalität wie der Supplier erfüllen, wurde aber aus Geschwindigkeitsgründen anders implementiert. > : Der Supplier gewährt dem Client Zugriff auf private Daten. > : Der Client kann den Supplier (ohne dass es eine Vererbung zwischen ihnen gibt) direkt ersetzen. > : Der Client benötigt den Supplier für seine Funktion. Informatik 2 - Einführung in Java und UML258

259 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Implementierung Definition: Vererbung von einer Implementierung (Generalisierung) Die Vererbung beschreibt eine Beziehung zwischen einer Basisklasse und einer abgeleiteten Klasse. Details: Siehe vorherige Kapitel n Beispiel: Informatik 2 - Einführung in Java und UML259 Figure Diskriminator (optional) GhostCherry Pacman passive Figur steuerbare Figur

260 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Implementierung n Der Diskriminator kann bei Gleichheit auch so notiert werden: n Durch den Diskriminator können u Gruppen zusammengehöriger Klassen erkannt werden u weitere Eigenschaften einer Vererbung gegeben werden. Informatik 2 - Einführung in Java und UML260 gilt für beide Klassen Figure GhostCherry Pacman passive Figursteuerbare Figur

261 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Implementierung n Eigenschaften von Diskriminatoren: {complete, disjoint} : Die Klassen an dem Diskriminator sind vollständig. Sie decken alle möglichen Objekte ab ( complete ). Ein Objekt kann nicht gleichzeitig Pacman und Geist sein ( disjoint ). Informatik 2 - Einführung in Java und UML261 {complete, disjoint} Eigenschaft Figure GhostCherry Pacman Typ

262 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Implementierung {incomplete, disjoint} : Die Gruppe des Diskriminators ist unvollständig ( incomplete ), da beispielsweise die Kirschen fehlen. Ein Pacman kann nicht gleichzeitig Geist sein ( disjoint ). Ohne Angabe wird {disjoint} angenommen. n Die Vererbung von einer abstrakten Basisklasse und einer nicht-abstrakten Basisklasse erfolgt genau gleich. Informatik 2 - Einführung in Java und UML262 {incomplete, disjoint} Figure Ghost Pacman Typ

263 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Mehrfachvererbung n Mehrfachvererbung einer Implementierung: Eine Klasse hat mehr als eine direkte Basisklasse (in Java nicht möglich). Informatik 2 - Einführung in Java und UML263 HSAngehoeriger StudentDozent Taetigkeit {incomplete, overlapping} Tutor

264 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Mehrfachvererbung n Diskriminatoren (Fortsetzung): {incomplete, overlapping} : Die Gruppe des Diskriminators ist unvollständig ( incomplete ). Ein Objekt kann Instanz von mehr als einer Basisklasse sein ( overlapping ). {complete, overlapping} : Die Gruppe des Diskriminators ist vollständig ( complete ). Ein Objekt kann Instanz von mehr als einer Basisklasse sein ( overlapping ). Informatik 2 - Einführung in Java und UML264

265 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Spezifikation Definition: Vererbung von einer Spezifikation Diese Art der Vererbung beschreibt die Implementierung einer Schnittstelle. Details: Siehe vorherige Kapitel n Beispiel: Informatik 2 - Einführung in Java und UML265 > Comparable +compareTo(o: T): int String +compareTo(o: String): int Integer +compareTo(o: Integer): int Schnittstellen- implementierung T: class

266 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Spezifikation Alternative Darstellung mit Ball-Symbol (die Klasse String implementiert die Schnittstelle Comparable ): n Algorithmen und Datenstrukturen operieren häufig nur auf Schnittstellen: u Klassendiagramme einer Beziehung genau wie bei einer Abhängigkeit zwischen Klassen notwendig u Hier: Klasse benötigt eine Schnittstelle Informatik 2 - Einführung in Java und UML266 String +compareTo(o: String): int Comparable Schnittstellenname implementierte Schnittstelle SortedContainer benötigte Schnittstelle > Comparable +compareTo(o: T): int > T: class

267 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung von einer Spezifikation n Alternative Darstellung mit dem Ball-Symbol: n Gemeinsame Darstellung: Schnittstelle, implementierende Klasse und Klasse, die die Schnittstelle benötigt, in der Ball-Darstellung: n Implementierung: public class SortedContainer { private Comparable [] elements; //... } Informatik 2 - Einführung in Java und UML267 SortedContainer benötigte Schnittstelle Comparable Schnittstellenname SortedContainer Comparable String +compareTo(o: String): int

268 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Generische Klassen n Zwischen generischen und konkreten Klassen als Instanzen der generischen Klassen existieren auch Beziehungen. n Erinnerung: Generische Klasse in UML Informatik 2 - Einführung in Java und UML268 Vector -values: E[*] {bag} +Vector(size: int, initValue: E) +setValue(index: int, E: value) +getValue(index: int): E E: class

269 Holger Vogelsang Klassendiagramme Beziehungen zwischen Klassen: Vererbung einer Assoziation n Die Vererbung von Assoziationen wird meist in folgenden Szenarien verwendet: u Es besteht bereits eine Assoziation zwischen zwei Basisklassen. u Es soll ausgedrückt werden, dass die Assoziation einer abgeleiteten Klasse immer nur mit der Assoziation einer anderen abgeleiteten Klasse hergestellt werden soll. n Beispiel: Informatik 2 - Einführung in Java und UML269 ArtikelPerson schreibt -autor 1 -artikel * FachartikelRedakteur Nur der Redakteur kann Fachartikel schreiben Eine Assoziation kann z.B. nicht von einer normalen Person zum Fachartikel führen.

270 Holger Vogelsang Klassendiagramme Anmerkungen im Klassendiagramm Definition: Anmerkung Eine Anmerkung beinhaltet einen Kommentar für ein beliebiges UML-Sprachelement. n Beispiel: Informatik 2 - Einführung in Java und UML270 Figure +paint() Die Figur ist das zentrale Element in einer Zeichenfläche. Anmerkung Zuordnung

271 Holger Vogelsang Klassendiagramme Übersicht zu Klassendiagramm (vereinfacht) Darstellung der wichtigsten Elemente durch MagicDraw: Informatik 2 - Einführung in Java und UML271

272 Holger VogelsangInformatik 2 - Einführung in Java und UML272 Klassendiagramme Klassen im Pacman-Spiel (unvollständig)

273 Holger Vogelsang Klassendiagramme Beispiel aus der Klausur WS 2012/2013 n Fiktives Flugbuchungssystem: u Kunde: Name, Anschrift, -Adresse, Angabe (privat/geschäftlich), Login-Name, Passwort u Flug: Flugnummer, Datum, Uhrzeit, Start- und Endflughafen, Gebühr, abhängig vom Startflughafen, Preis, abhängig von der Klasse (1. Klasse, Business-Klasse, 2. Klasse). Es werden alle Sitze einer Klasse zum selben Preis angeboten. u Buchung: Jeder Kunde kann beliebig viele Flugbuchungen gleichzeitig vornehmen. Eine Buchung kann mehrere Sitzplätze in derselben Klasse umfassen. Die Zahlungsart müssen Sie nicht berücksichtigen. u Reservierung: Ist sich ein Kunde noch nicht ganz sicher, ob er einen Flug buchen möchte, dann kann er sich diesen für einen Zeitraum von 24 Stunden kostenlos reservieren. u Zusatzoptionen bei der Buchung: Zu einem Flug können optionale Leistungen hinzugebucht werden, für die aber zusätzliche Kosten anfallen (Reiserücktrittsversicherung, Sitzplatz am Notausstieg, Übergepäck, eventuell weitere (je nach Fluggesellschaft und Flugzeugtyp). Informatik 2 - Einführung in Java und UML273

274 Holger Vogelsang Fehlerbehandlung mit Ausnahmen Übersicht Informatik 2 - Einführung in Java und UML274 Überladen Gener. Klassen Regeln Aufzähl- typen Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

275 Holger VogelsangInformatik 2 - Einführung in Java und UML275 Fehlerbehandlung mit Ausnahmen Motivation n Welche Arten von Fehlern gibt es? n Wie können Laufzeitfehler sicher gefunden werden? n Wie sollten Laufzeitfehler einer Methode dem Aufrufer mitgeteilt werden?

276 Holger Vogelsang Informatik 2 - Einführung in Java und UML276 Fehlerbehandlung mit Ausnahmen Fehlerklassifikation n Erwartete Fehler durch Aufruf einer prinzipiell unsicheren Methode u Auftreten: Es muss bei jedem Aufruf mit dem Fehler gerechnet werden. u Beispiel: Versuch, eine Datei zum Lesen zu öffnen, die nicht existiert u Vermeidung: nicht möglich u Behandlung: ja n Unerwartete Fehler durch Programmierfehler oder mangelnde Systemressourcen u Auftreten: Eigentlich sollte der Fehler nie auftreten. u Beispiel: zu wenig Hauptspeicher vorhanden, Stacküberlauf u Vermeidung: nur begrenzt möglich (intensive Programmtests) u Behandlung: nur begrenzt möglich (z.B. Datensicherung vor der Programmbeendigung)

277 Holger Vogelsang Informatik 2 - Einführung in Java und UML277 Fehlerbehandlung mit Ausnahmen Fehlerklassifikation n Sonderfall: Erwarteter oder unerwarteter Fehler während der Fehlerbehandlung u Auftreten: siehe erwarteter und unerwarteter Fehler u Beispiel: Die Fehlermeldung kann wegen fehlender Schreibrechte oder zu geringen freien Hauptspeichers nicht in eine Datei geschrieben werden. u Vermeidung: nur bei sehr einfacher Fehlerbehandlung möglich u Behandlung: hängt vom Fehler ab

278 Holger Vogelsang Informatik 2 - Einführung in Java und UML278 Fehlerbehandlung mit Ausnahmen Reaktionen auf Fehler n Sofort behandelbarer Fehler u Auswirkung: Das Programm kann auf den Fehler reagieren und seine Arbeit (eventuell eingeschränkt) fortsetzen. u Reaktion: ignorieren (wenn sinnvoll möglich), alternativen Programmablauf starten u Beispiel: Bei fehlender Eingabedatei werden immer Standardwerte angenommen. n Nicht sofort behandelbarer Fehler u Auswirkung: Der Fehler kann an der Stelle, an der er auftritt, nicht behandelt werden. u Reaktion: Fehlermeldung an den Aufrufer der Methode u Beispiel: Datei existiert nicht sollen Standardwerte verwendet werden/soll der Benutzer gefragt werden? Kann eventuell an der Stelle des Fehlers nicht entschieden werden. n Nicht sinnvoll behandelbarer Fehler u Auswirkung: sinnvolle Programmfortsetzung nicht möglich u Reaktion: i.d.R. Programmbeendigung mit vorheriger Datensicherung (sofern möglich) u Beispiel: Stacküberlauf, schwere Programmierfehler

279 Holger VogelsangInformatik 2 - Einführung in Java und UML279 Fehlerbehandlung mit Ausnahmen Exceptions – Idee n Fehlerbehandlung bisher: Ein Methode m1 stellt einen Fehler fest und liefert ein Ergebnis, das diesen Fehler beschreibt. Die aufrufende Methode m1 der Methode m2 stellt fest, dass m2 einen Fehler zurückliefert und beendet die eigene Arbeit mit der Rückgabe eines Fehlers. u usw... n Schlechte Lösung, da sich eventuell große Teile einer Methode mit der Fehlerbehandlung befassen. Eine Trennung von Fehler- und Normalfall ist nicht vorhanden. n Fehler werden häufig über viele Aufrufebenen hinweg nach oben weitergereicht, ohne dass die Fehler direkt bearbeitet werden. n Java bietet das Konzept der Ausnahme (Exception) zur besseren Fehlerbehandlung. Damit muss nicht der Rückgabewert einer Methode zur Fehlerübermittlung missbraucht werden.

280 Holger VogelsangInformatik 2 - Einführung in Java und UML280 Fehlerbehandlung mit Ausnahmen Exceptions – Idee Einsatzgebiete n Meldung von Fehlern, die nicht lokal am Ort der Entstehung behoben werden konnten: u Beispielsweise kann der Autor einer Bibliothek Laufzeitfehler (Datei existiert nicht etc.) zwar erkennen, er ist aber selten in der Lage, diese im Kontext des aufrufenden Programms richtig zu behandeln. u Der Anwender der Bibliothek dagegen weiß, wie er mit den Fehlern umgehen soll. n Die Behandlung von anderswo gefundenen Fehlern. n Syntax: try { // versuche, eine Aufgabe zu lösen } catch (Fehlerklasse fehler) { // behandle Fehler des Typs "Fehlerklasse" }

281 Holger VogelsangInformatik 2 - Einführung in Java und UML281 Fehlerbehandlung mit Ausnahmen Exceptions – Idee Beispiel (Zugriff auf den Vektor, angelehnt an ArrayList ): public class Vector { private E[] values; private int size; //... public E getValue(int index) { if (index >= size || index < 0) throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); return values[ index ]; } public static void main(String[] args) { Vector vector = new Vector<>(3, 0.0); try { System.out.println(vector.getValue(0)); System.out.println(vector.getValue(4)); } catch (IndexOutOfBoundsException ex) { System.err.println("Oops" + ex.getMessage()); }

282 Holger VogelsangInformatik 2 - Einführung in Java und UML282 Fehlerbehandlung mit Ausnahmen Mehrere Exceptions Behandlung mehrerer Ausnahmen n Syntax: try { // versuche, eine Aufgabe zu lösen } catch (FehlerTyp1 ex1) { // behandle Fehler-Typ1 } catch (FehlerTyp2 ex2) { // behandle Fehler-Typ2 } n Unbehandelte Ausnahmen: u Beendigung der Methode u Auslösung der Ausnahme in der aufrufenden Methode u Dieses Spiel funktioniert solange, bis eine Methode die Ausnahme abfängt oder das Programm beendet wurde.

283 Holger Vogelsang Fehlerbehandlung mit Ausnahmen Mehrere Exceptions n Es dürfen auch mehrere, unabhängige Fehler durch ein sogenanntes multi-catch abgefangen werden: n Syntax: try { // versuche, eine Aufgabe zu lösen } catch (FehlerTyp1 ex1 | FehlerTyp2 ex2) { // behandle Fehler-Typ1 und Fehler-Typ 2 } Informatik 2 - Einführung in Java und UML283

284 Holger VogelsangInformatik 2 - Einführung in Java und UML284 Fehlerbehandlung mit Ausnahmen Mehrere Exceptions Ausnahmen werden in den catch -Blöcken in der Reihenfolge ihres Auftretens ausgewertet. n Abfangen aller möglichen Ausnahmen: try { // versuche, eine Aufgabe zu lösen } catch (FehlerTyp1 ex) { // behandle Fehler-Typ1 } catch (Throwable thr) { // Alle unbehandelten Fehler // behandle alle anderen Fehler } Ausnahmen können auch im catch -Block ausgelöst werden: try { // versuche, eine Aufgabe zu lösen } catch (FehlerTyp1 ex) { // behandle Fehler-Typ1 throw ex;// Fehler weitermelden }

285 Holger VogelsangInformatik 2 - Einführung in Java und UML285 Fehlerbehandlung mit Ausnahmen Exceptions mit Klassenhierarchien n Exception-Klassen können ganze Klassenhierarchien bilden. Im catch -Block kann auch die Basisklasse einer Ausnahme angegeben werden, um eine Ausnahme einer abgeleiteten Klasse abzufangen. n Beispiel: public class FileNotFoundException extends IOException { //... } Eine FileNotFoundException kann jetzt auch durch die Angabe ihrer Basisklasse abgefangen werden: public void m() { try { // … throw new FileNotFoundException(); } catch (IOException ex) { // … }

286 Holger VogelsangInformatik 2 - Einführung in Java und UML286 Fehlerbehandlung mit Ausnahmen Exceptions mit Klassenhierarchien Es können auch mehrere catch -Blöcke vorhanden sein, die sowohl die abgeleitete Klasse als auch die Basisklasse der Ausnahme abfangen. Achtung Reihenfolge: public void m() { try { //... throw new FileNotFoundException(); } catch (IOException ex1) { //... } catch (Throwable thr) { //... } Wird erst Throwable abgefangen, dann wird der catch -Block von IOException nie betreten.

287 Holger Vogelsang Fehlerbehandlung mit Ausnahmen Exceptions: Hinweise Generelle Ausräumarbeiten nach einem erfolgreichem try oder einer Ausnahme mit finally. Beispiel: public void m() { try { //... throw new FileNotFoundException(); } catch (IOException ex1) { //... } finally { // Wird immer betreten } n Ein echtes Beispiel folgt im nächsten Kapitel. Seit Java 7 gibt es ein erweitertes try -Konstrukt siehe Kapitel zur Ein- /Ausgabebehandlung. Informatik 2 - Einführung in Java und UML287

288 Holger Vogelsang Fehlerbehandlung mit Ausnahmen Exceptions mit Klassenhierarchien n Arten der Ausnahmen: n gelb n gelb: unerwartete und in der Regel nicht sinnvoll behandelbare Fehler n grün n grün: unerwartete und in der Regel nicht sinnvoll behandelbare Fehler (Programmierfehler) rot rot: erwartete und sofort oder später behandelbare Fehler (erben direkt von Exception, nicht von RuntimeException ) Informatik 2 - Einführung in Java und UML288

289 Holger VogelsangInformatik 2 - Einführung in Java und UML289 Fehlerbehandlung mit Ausnahmen Eigenschaften und Deklaration erwarteter Fehler n Erwartete und sofort oder später behandelbare Fehler (rot markiert): u Einem Anwender einer Methode muss die Art der Ausnahme, die diese auslösen kann, angegeben werden. u Syntax: ret-type method-name(params) throws Exceptions Beispiel: public int readFromFile(String name) throws FileNotFoundException, EOFException { Beispiel durch Angabe der Basisklasse IOException ( FileNotFoundException und EOFException erben davon): public int readFromFile(String name) throws IOException { u Ohne Spezifikation kann die Methode nur unerwartete oder gar keine Ausnahmen auslösen. Beispiel: public int getValue(int index) {

290 Holger Vogelsang Pakete Übersicht Informatik 2 - Einführung in Java und UML290 Überladen Gener. Klassen Regeln Aufzähl- typen Java und UML Schritte, Software Imperative Aspekte Klassen- diagramme Pakete Objekt- orientierung Klassen, Objekte Fehler Zusicher- ungen Ausnah- men Über- schreiben Vererbung

291 Holger VogelsangInformatik 2 - Einführung in Java und UML291 Pakete Motivation n Was passiert, wenn zwei Hersteller Klassen mit demselben Namen erstellt haben und beide Klassen in einem Projekt zusammen benutzt werden sollen? n Wie können logisch zusammengehörige Klassen gruppiert werden?

292 Holger VogelsangInformatik 2 - Einführung in Java und UML292 Pakete Idee n Ein Paket sollte eine Anzahl logisch zusammengehöriger Klassen, Schnittstellen, Ausnahmen, Fehler, Aufzähltypen und Annotationen beinhalten. Beispiel: u alle Klassen, die mathematische Berechnungen durchführen u alle Klassen, die Text formatieren n Der Paketname entspricht einem Verzeichnis im Dateisystem. Beispiel: Klasse Complex im Paket de.hska.iwii.math : Sowohl die Quelltextdatei Complex.java als auch die Bytecode-Datei Complex.class sollten in in einem Unterverzeichnis de/hska/iwii/math liegen. Festlegung der Paket-Zugehörigkeit einer Klasse: Anweisung in der Klasse der Form package Paket-Name;. Diese Anweisung sollte die erste in der Datei sein.

293 Holger VogelsangInformatik 2 - Einführung in Java und UML293 Pakete Idee n Verwendung einer Klasse eines anderen Pakets: Variante 1: import Paketname.*; Beispiel: import de.hska.iwii.math.*;// Bindet alle Klassen des Pakets // de.hska.iwii.math ein //... Complex value = new Complex(); Variante 2: import Paketname.Klassenname; Beispiel: import de.hska.iwii.math.Complex;// Bindet Complex des Pakets // de.hska.iwii.math ein. //... Complex value = new Complex(); u Variante 3: Verwendung des vollständigen Klassennamens. Beispiel: //... de.hska.iwii.math.Complex value = new de.hska.iwii.math.Complex(); n Nach Aussage von Oracle sollte Variante 1 vermieden werden. Das Paket java.lang des JDK ist immer automatisch eingebunden.

294 Holger VogelsangInformatik 2 - Einführung in Java und UML294 Pakete Aufbau n Allgemeiner Aufbau eines Namens (kann variieren): Organisation.Paketname.Klassenname.Methodenname Beispiele: de.hska.ss2012.project2.math.Complex.add() com.mycompany.math.Complex.add() javax.swing.table.DefaultTableModel.getDataVector() PaketKlasseMethode LandHoch- schule KA SemesterProjektTeil des Projektes Kommer- ziell FirmaTeil des Projektes PaketKlasseMethode Zusatz- klasse des JDK GUI- Paket Tabelle PaketKlasseMethode

295 Holger VogelsangInformatik 2 - Einführung in Java und UML295 Pakete Inhalte eines Pakets Innerhalb eines Pakets müssen die Namen eindeutig sein: Es darf eine Klasse Complex mehrfach geben, solange sie in unterschiedlichen Paketen liegt. Beispiel: java.util.Timer und javax.swing.Timer n So ganz stimmt die Aussage nicht: u Der komplette Paketname (der Pfad inkl. Klassenname) darf mehrfach vorkommen, wenn die Pakete durch unterschiedliche Klassenlader (Classloader) geladen werden. u Also: Klassenlader + Paketname muss eindeutig sein! n Es ist mindestens ein Klassenlader in der virtuellen Maschine aktiv: u Er kennt mehrere Dateipfade oder jar-Dateien, aus denen er die Klassen und Schnittstellen lädt. u Weitere Klassenlader können erstellt und verwendet werden.


Herunterladen ppt "Prof. Dr.-Ing. Holger Vogelsang Informatik 2 Einführung in Java und UML."

Ähnliche Präsentationen


Google-Anzeigen