4. Objektorientierung I Grundlagen der Programmierung 1 (Java) Fachhochschule Darmstadt Haardtring 100 D-64295 Darmstadt Prof. Dr. Bernhard Humm FH Darmstadt, 11. Oktober 2005 Einordnung im Kontext der Vorlesung 1. Einführung 10. Software-Qualität 2. Einfache Programme 11. Algorithmen und Datenstrukturen II 3. Kontrollstrukturen 12. Objektorientierung II 4. Objekt-Orientierung I 13. Komponenten 5. Algorithmen und Datenstrukturen I 14. Design 6. Interfaces 15. Die Java Klassenbibliothek I 7. Rekursion 16. Die Java Klassenbibliothek II 8. Pakete 17. Software-Kategorien 9. Fehler und Ausnahmen Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 2 Agenda Agenda Klassen Klassen und undObjekte Objekte Vererbung Eclipse Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 3 Klassen und Objekte Wiederholung: Datentypen Datentyp = Wertebereich + Operationen Äpfel können nicht mit Birnen verglichen werden Zentrales Konzept der Informatik Bekannt aus der Mathematik: Gruppen, Körper, Ringe, Algebren Auch Datenstruktur, abstrakter Datentyp genannt In Programmiersprache zusätzlich: Darstellung im Speicher Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 4 Klassen und Objekte Objektorientierung = Programmierung mit Datentypen (Klassen und Objekte) Beispiel: Bruchzahlenklasse class Fraction { f1.mult(f2); int z; // Zähler int n; // Nenner void mult (Fraction f) { this.z = this.z * f.z; this.n = this.n * f.n; } void add (Fraction f) { this.z = this.z * f.n + f.z * this.n; this.n = this.n * f.n; } mult z add n abgeschlossener Baustein } • mult und add sind lokal zu Fraction (können auf Fraction-Objekte angewendet werden) • this bezeichnet "dieses Objekt", auf das die Operation angewendet wird Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 5 Klassen und Objekte Klassen und Objekte cd Fraction Klasse = Datentyp (wiederkehrendes Muster einzelner Objekte) Fraction 3/4 Objekt = einzelnes Exemplar (Instanz) Objekte werden instanziiert Objekte haben eine Identität (welche Objekte sind gleich?) Fraction - numerator: int denominator: int + + add(Fraction) : void mult(Fraction) : void Fraction 6/8 Fraction 42/42 Notation: UML (Unified Modeling Language) Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 6 Klassen und Objekte Instanziierung von Klassen: Konstruktoren Spezielle Methoden, die beim Erzeugen eines Objekts automatisch aufgerufen werden class Fraction { int z, n; Fraction (int z, int n) { this.z = z; this.n = n; } • • • • • dienen zur Initialisierung eines Objekts heißen wie die Klasse ohne Funktionstyp und ohne void können Parameter haben können überladen werden Fraction () { z = 0; n = 1; } void mult (Fraction f) {...} void add (Fraction f) {...} } Aufruf Fraction f = new Fraction(3, 5); Fraction g = new Fraction(); • legt neues Fraction-Objekt an • ruft für dieses Objekt den Konstruktor auf Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 7 Klassen und Objekte Attribute (Member Variablen): die Daten des Datentyps Attribute sind die Daten des Datentyps class Fraction { int z; // Zähler int n; // Nenner Sie werden deklariert wie die Variablen in einer Methode: Typ Variable [= Ausdruck]; void mult (Fraction f) { this.z = this.z * f.z; this.n = this.n * f.n; } Type kann ein primitiver Datentyp sein oder eine Klasse void add (Fraction f) { this.z = this.z * f.n + f.z * this.n; this.n = this.n * f.n; } Sie werden verwendet mit der Punktnotation: Objekt.Variable this (Schlüsselwort) referenziert das aktuelle Objekt Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 } 11.10.2005, Seite 8 Klassen und Objekte Weglassen von this class Fraction { int z, n; void mult (Fraction f) { z = z * f.z; n = n * f.n; } z und n sind eindeutig. Compiler fügt this automatisch ein void add (Fraction n) { z = z * n.n + this.n * n.z; this.n = this.n * n.n; } n wäre nicht eindeutig. Qualifikation mit this nötig } this kann weggelassen werden, wenn der restliche Name eindeutig ist Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 9 Klassen und Objekte Methoden: die Operationen des Datentyps Methoden können ausschließlich im Kontext von Klassen deklariert werden: alles bisher gesagte über Methoden gilt class Fraction { int z; // Zähler int n; // Nenner Deklaration: Modifier Rückgabetyp Name (Parameterliste) {Anweisungen} void mult (Fraction f) { this.z = this.z * f.z; this.n = this.n * f.n; } Aufruf mit Punktnotation: Objekt.Methode(aktuelle Parameter) void add (Fraction f) { this.z = this.z * f.n + f.z * this.n; this.n = this.n * f.n; } } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 10 Klassen und Objekte Senden von Nachrichten: Hey object, do something! Der Aufruf von Methoden wird auch als „Senden von Nachrichten“ bezeichnet cd Account Vorstellung: Objekte sind wie Personen der realen Welt, die bestimmte Fähigkeiten haben und Befehle ausführen können withdraw (42) myAccount Customer Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 11 Klassen und Objekte Objektorientierung: Simulation der realen Welt Objektorientes Design und Programmierung bedeutet Objekte der realen Welt modellieren Idee von Simula, der Großmutter aller objektorientierten Sprachen: Simulation der realen Welt Sprachen wie UML erlauben die Modellierung der realen Welt mit graphischen Mitteln Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 cd Bank Account Customer Inv oice Product 11.10.2005, Seite 12 Klassen und Objekte Geheimnisprinzip (Information Hiding): eines der wichtigsten Konzepte des Software Engineering Information Hiding (D.L. Parnas, 1972): – Implementierung komplexer Datenstrukturen soll in einer Klasse (Modul) verborgen werden – Nutzer erhalten nur eine abstrakte Sicht auf die Daten (abstrakte Datenstrukturen) – Datenzugriff nur über die Methoden (Encapsulation = Kapselung) Gekapselte (abstrakte) Datenstrukturen besitzen einen Zustand ("Gedächtnis"), der durch Zugriffsprozeduren geändert werden kann Die Datenkapselung hat folgende Vorteile: – Gekapselte Datenstrukturen sind einfacher nutzbar (reduzierte Komplexität) – Sie können ohne Auswirkung auf andere Klassen geändert werden Es bestehen jedoch auch Nachteile: – Zugriff etwas weniger effizient – Eingeschränkte Flexibilität des Zugriffs, da nur über Prozeduren der Schnittstelle auf die Daten zugegriffen werden kann Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 13 Klassen und Objekte Steuerung der Sichtbarkeit: Modifier Modifier: – private: nur innerhalb der Klasse sichtbar class Fraction { private int z; // Zähler private int n; // Nenner – public: überall sichtbar public int getZ () { return this.z; } – protected, package scope: Mischformen (später) public int getN () { return this.n; } Gilt für Variablen und Methoden Variablen sollten in der Regel private deklariert werden. Soll lesender und / oder schreibender Zugriff explizit erlaubt werden, dann über Getter / SetterMethoden Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 … } 11.10.2005, Seite 14 Klassen und Objekte Identität und Referenzen Ein Konstruktor-Aufruf stellt Speicherplatz für die Variablen bereit, initialisiert eventuell und gibt stets eine Referenz auf das Objekt zurück (Uniform Reference Semantics) Referenzen sind stets implizit (keine Pointer Arithmetik wie in C / C++) Zuweisung (=) von Objekten ist Zuweisung ihrer Referenzen Gleichheit (==) von Objekten ist Gleichheit der Referenzen Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 class Fraction { int z, n; Fraction (int z, int n) { this.z = z; this.n = n; } … boolean equals (Fraction f) { return (z == f.z)&&(n==f.n) } } Fraction f1, f2, f3; boolean b1, b2, b3; f1 = new Fraction(3, 4); f2 = new Fraction(3, 4); f3 = f1; b1 = f1 == f2; // true oder false? b2 = f1 == f3; b3 = f1.equals(f2); 11.10.2005, Seite 15 Klassen und Objekte null: Die Referenz auf kein Objekt null (Schlüsselwort) ist die Referenz auf kein Objekt null kann jeder Variable vom Referenztyp zugewiesen werden null belegt den gleichen Speicherplatz wie eine Objektreferenz Wird eine Methode auf null aufgerufen, so erkennt das der Compiler i. A. nicht Fehler NullPointerException Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 class Fraction { private int z; // Zähler private int n; // Nenner Fraction (int z, int n) { this.z = z; this.n = n; } public int getZ () { return this.z; } } Fraction f = null; // auch implizit f.getZ() // NullPointerException! f = new Fraction(3, 4); f.getZ() // 3 11.10.2005, Seite 16 Klassen und Objekte Call-by-value und Uniform Reference Semantics Wiederholung Methodenaufruf: aktuelle Parameter werden an formale Parameter gebunden (call-by-value) Was ist, wenn der aktuelle Parameter ein Objekt ist? Dann wird die Referenz an den formalen Parameter gebunden (ist nach wie vor call-by-value, wirkt aber wie call-by-reference) Unerwünschte Seiteneffekte können nur passieren, wenn die Objekte nicht gekapselt sind Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 class Weird { void doSideEffect (Fraction f) { int tmp = f.z; f.z = f.n; f.n = tmp; } } Fraction f = null; Weird w = null; int z = 0; boolean b = false; f = new Fraction(3, 4); z = f.z w = new Weird(); w.doSideEffect(f); b = (z == f.z) // true oder false? 11.10.2005, Seite 17 Klassen und Objekte Überladen von Methoden Signatur = Methodenname + Parameterliste class Fraction { private int z; // Zähler private int n; // Nenner Zwei oder mehrere Methoden können innerhalb eines Gültigkeitsbereichs denselben Namen besitzen, void mult (Fraction f) { this.z = this.z * f.z; this.n = this.n * f.n; } – wenn sie eine unterschiedliche Anzahl von Parametern besitzen oder – wenn sich die Parametertypen an entsprechender Stelle unterscheiden Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 void mult (Fraction f1, Fraction f2) { this.z = this.z * f1.z * f2.z; this.n = this.n * f1.n * f2.n; } } 11.10.2005, Seite 18 Klassen und Objekte Klassenvariablen und -methoden Bisher betrachtete Variablen und Methoden beziehen sich auf die einzelne Objekte Instanzvariablen / -methoden class Customer { // class variables public static int numberOfCustomers; // instance variables private String name; … Variablen, Konstanten und Methoden, die sich auf alle Objekte beziehen Klassenvariablen / Methoden // class methods public static Customer makeCustomer (String name, …) {…} public static Customer findCustomer (int number) {…} Typische Beispiele: Instanziierung, Suche Keyword in Java: static Häufig werden statt dessen auch Managerklassen verwendet Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 // instance methods public void changeAddress (String newAdress) {…} } 11.10.2005, Seite 19 Klassen und Objekte Klassen, Objekte, Klassenvariablen, Klassenmethoden, Instanzvariablen, Instanzmethoden – Was ist was? Kunde nimm Kredit auf Kundennummer Kredit Konto suche Kunden drucke Kontoauszug Zahlungslauf Kontoauszugsdrucker Mehrwertsteuersatz Anzahl der Kunden rechne in Fremdwährung um führe Zahlungslauf durch Betrag hebe Geld ab Währung zahle Geld ein Bank lege neuen Kunden an IP-Adresse Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 20 Klassen und Objekte Beispiel: Stack und Queue Stack (Kellerspeicher) push(x); x = pop(); fügt x hinten an den Stack an entfernt und liefert hinterstes Stackelement push(3); 3 push(4); 3 x = pop(); 3 LIFO-Datenstruktur (last in first out) 4 // x == 4 // y == 3 y = pop(); Queue (Puffer, Schlange) put(x); x = get(); fügt x hinten an die Queue an entfernt und liefert vorderstes Queueelement put(3); 3 put(4); 3 x = get(); y = get(); FIFO-Datenstruktur (first in first out) 4 4 // x == 3 // y == 4 Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 21 Klassen und Objekte Klasse Stack class Stack { int[] data; int top; Stack (int size) { data = new int[size]; top = -1; } void push (int x) { if (top >= data.length) Out.println("-- overflow"); else data[++top] = x; } int pop () { if (top < 0) { Out.println("-- underflow"); return 0; } else return data[top--]; } } Deklaration eines Array data top Instanziierung eines Array Schreibender Zugriff auf ein Array Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 Lesender Zugriff auf ein Array Benutzung Stack s = new Stack(10); s.push(3); s.push(6); int x = s.pop() + s.pop(); // x == 9 11.10.2005, Seite 22 Klassen und Objekte Klasse Queue class Queue { int[] data; int head, tail; Queue (int size) { data = new int[size]; head = 0; tail = 0; } void put (int x) { if ((tail+1) % data.length == head) Out.println("-- overflow"); else { data[tail] = x; tail = (tail+1) % data.length; } } int get () { if (head == tail) { Out.println("-- underflow"); return 0; } else int x = data[head]; head = (head+1) % data.length; return x; } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 } data head tail data tail head Benutzung Queue q = new Queue(10); q.put(3); q.put(6); int x = q.get(); // x == 3 int y = q.get(); // y == 6 11.10.2005, Seite 23 Klassen und Objekte Ausblick zum Weiterdenken Wie werden Objekte auf dem Runtime Stack abgelegt? Was ist ein Heap? Was ist Garbage Collection und wie funktioniert es? Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 24 Agenda Agenda Klassen und Objekte Vererbung Vererbung Eclipse Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 25 Vererbung Klassifikation Dinge der realen Welt lassen sich oft klassifizieren z.B. Artikel eines Web-Shops Artikel Buch HardCover SoftCover eBook Audio CD Cassette ... Kamera Digital Analog Man beachte Vererbung • Ein eBook hat alle Eigenschaften eines Buchs; zusätzlich hat es ... Ein Buch hat alle Eigenschaften eines Artikels; zusätzlich hat es ... • CD und Cassette lassen sich gleichermaßen als Audio behandeln Buch, Audio und Kamera lassen sich gleichermaßen als Artikel behandeln Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 26 Vererbung Vererbung class Article { int code; int price; boolean available() {...} void print() {...} Article(int c, int p) {...} } Oberklasse Basisklasse class Book extends Article { String author; String title; void print() {...} Book(int c, int p, String a, String t) {...} } Unterklasse Article code price available() print() Article(c, p) erbt: code, price, available, print ergänzt: author, title, Konstruktor überschreibt: print Book author title print() Book(c, p, a, t) Wenn keine Oberklasse angegeben wird, ist sie Object Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 27 Vererbung Überschreiben von Methoden class Article { ... void print() { Out.print(code + " " + price); } Article(int c, int p) { code = c; price = p; } } Benutzung Book book = new Book(code, price, author, title); ⇒ erzeugt Book-Objekt ⇒ Book-Konstruktor ⇒ Article-Konstruktor (code = c; price = p;) author = a; title = t; book class Book extends Article { ... void print() { super.print(); Out.print(" " + author + ": " + title); } Book(int c, int p, String a, String t) { super(c, p); author = a; title = t; } code price author title book.print(); ⇒ print aus Book ⇒ print aus Article ⇒ Out.print(...); code price author: title Ausgabe: code price author: title } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 28 Vererbung Klassenhierarchien Article code price Jedes Buch ist ein Artikel Aber: nicht jeder Artikel ist ein Buch available() print() Book Audio Camera author title songs supplier print() print() print() ... CD Cassette tracks lengh print() print() Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 ... 11.10.2005, Seite 29 Vererbung Kompatibilität zwischen Klassen Unterklassen sind Spezialisierungen ihrer Oberklassen Book-Objekte können Article-Variablen zugewiesen werden Article a = new Book(code, price, author, title); a code price author title if (a instanceof Book) Book b = (Book) a; b code price author title nur Article-Felder sind über a zugreifbar a.code a.price // Laufzeittyptest // Typumwandlung mit Laufzeittypprüfung alle Book-Felder sind über b zugreifbar b.code b.price b.author b.title Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 30 Vererbung Dynamische Bindung Heterogene Datenstruktur Article Article[] a; available() print() Book CD Book Camera CD Alle Varianten können als Artikel behandelt werden void printArticles() { for (int i = 0; i < a.length; i++) { if (a[i].available()) { a[i].print(); } } } Book Audio Camera print() print() print() ruft geerbtes available() aus Article auf ruft je nach Artikelart das print() aus Book, CD oder Camera auf Dynamische Bindung obj.print() ruft die print-Methode des Objekts auf, auf das obj gerade zeigt Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 31 Agenda Agenda Klassen und Objekte Vererbung Eclipse Eclipse Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 32 Eclipse Die integrierte Enwicklungsumgebung Eclipse http://www.eclipse.org/ Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 11.10.2005, Seite 33