Java für Computerlinguisten 2. Objektorientierte Programmierung Christian Scheible Institut für Maschinelle Sprachverarbeitung 28. Juli 2009 Christian Scheible Java für Computerlinguisten 28. Juli 2009 1 / 56 Heute: 1 Besprechung der Übungen vom Montag 2 Objektorientierte Programmierung Christian Scheible Java für Computerlinguisten 28. Juli 2009 2 / 56 Objektorientierte Programmierung • Grundlagen • Klassen • Sichtbarkeit • Statische Methoden/Attribute • Vererbung • Schnittstellen • Wrapper Christian Scheible Java für Computerlinguisten 28. Juli 2009 3 / 56 Grundlagen Warum Klassen/Objekte? • Anschaulichkeit: Menschen sind mit Objekten vertraut • Zusammenfassung von Funktionen und Daten • Wiederverwendbarkeit • Klasse: Vorlage • Objekt: Bisher • Klasse war nur Rahmen für unsere Programme • Nicht benutzt: Klasse als Vorlage für Objekte Christian Scheible Java für Computerlinguisten 28. Juli 2009 4 / 56 Grundlagen Aufbau eines Objekts class Regal Color farbe; float hoehe; float breite; float tiefe; ... void aufbauen(); void ablegen(Object gegenstand, int x, int y) Object herausnehmen(int x, int y); ... Christian Scheible Java für Computerlinguisten Attribute (Variablen) Methoden (Funktionen) 28. Juli 2009 5 / 56 Grundlagen Begriffe in der Objektorientierten Programmierung • Abstraktion • Kapselung • Polymorphie • Vererbung • Feedback • Persistenz Christian Scheible Java für Computerlinguisten 28. Juli 2009 6 / 56 Grundlagen Abstraktion • Wiederverwendbare Vorlagen → Objekt: Instanz einer Klasse class Regal Regal braunesRegal Christian Scheible Regal weissesRegal Java für Computerlinguisten 28. Juli 2009 7 / 56 Grundlagen Kapselung • Daten sind im Objekt enthalten • Daten sind von außen nicht zugänglich • Objekt bietet Methoden zur Veränderung der Daten Wozu? • Interne Variablen, die der Benutzer der Klasse nicht braucht • Variablen, die der Benutzer nicht verändern darf Christian Scheible Java für Computerlinguisten 28. Juli 2009 8 / 56 Grundlagen class Schwein private float gewicht; private float alter; ... public void fuettern(); private void wachsen (int laenge); ... Christian Scheible Java für Computerlinguisten 28. Juli 2009 9 / 56 Grundlagen Polymorphie • Methoden reagieren verschieden abhängig von • Aufruf • Klassenzugehörigkeit Feedback Interaktion zwischen Objekten Persistenz Objekt existiert so lange, bis es zerstört wird Christian Scheible Java für Computerlinguisten 28. Juli 2009 10 / 56 Grundlagen Vererbung • Neue Klassen können unter Benutzung alter Klassen definiert werden • Die neue Klasse (Tochterklasse) erhält alle Attribute und Methoden der Mutterklasse class Fahrzeug class Moebel class Regal class Sitzmoebel class Stuhl Christian Scheible class Bank Java für Computerlinguisten 28. Juli 2009 11 / 56 Klassen Attribute class Buch { String name; // String author; // Attribute int pubDate; // } Attribut: Variable, die dem Objekt zugehört. Christian Scheible Java für Computerlinguisten 28. Juli 2009 12 / 56 Klassen Methoden class Buch { String name; String author; int pubDate; void read() // Eine Methode { // ... } int countPages() // Noch eine Methode { // ... } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 13 / 56 Klassen Instanzen class Buecherei { public static void main (String argv[]) { Buch buch1 = new Buch(); Buch buch2 = new Buch(); // ... buch1.name = "The Catcher in the Rye"; buch1.author = "J. D. Salinger"; buch1.pubDate = 1951; buch1.read(); } } Punkt (.) für Zugriff auf Inhalt des Objekts Christian Scheible Java für Computerlinguisten 28. Juli 2009 14 / 56 Klassen Konstruktor Was passiert beim Aufruf von new Buch()? Der Konstruktor liefert ein neues Objekt. class Buch { String name; Buch () {} // Konstruktor ohne Argument Buch (String name) // Konstruktor mit Argument { this.name = name; } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 15 / 56 Klassen this • this: Referenz für das Objekt, in dem wir uns befinden • Beispiel: Unterscheidung zwischen Parameter und Objektvariable class Buch { String name; void setName (String name) { this.name = name; } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 16 / 56 Sichtbarkeit Einschränkung des Zugriffs von anderen Klassen aus → Kapselung Sichtbarkeitsstufen • Öffentlich (public) • Privat (private) • Paketsichtbar • Geschützt (protected) Christian Scheible Java für Computerlinguisten 28. Juli 2009 17 / 56 Sichtbarkeit Öffentlich public: Auf das Element darf von außen ohne Einschränkung zugegriffen werden. com.ikea.Regal public void aufbauen(); Christian Scheible BeliebigeAndereKlasse ... Java für Computerlinguisten 28. Juli 2009 18 / 56 Sichtbarkeit Privat private: Auf das Element darf nur aus der selben Klasse zugegriffen werden. X de.aldi.Aushilfe ... com.ikea.Regal private void aufbauen(); com.ikea.Mitarbeiter ... X Christian Scheible Java für Computerlinguisten 28. Juli 2009 19 / 56 Sichtbarkeit paketsichtbar Standard: Auf das Element darf nur aus dem selben Paket zugegriffen werden, aber nicht aus anderen Paketen. In der Praxis: Wenn die Klasse im gleichen Verzeichnis liegt. X de.aldi.Aushilfe ... com.ikea.Regal void aufbauen(); com.ikea.Mitarbeiter ... Christian Scheible Java für Computerlinguisten 28. Juli 2009 20 / 56 Sichtbarkeit Geschützt protected: Auf das Element darf der selben Klasse und davon abgeleiteten Klassen zugegriffen werden. → Vererbung Christian Scheible Java für Computerlinguisten 28. Juli 2009 21 / 56 Sichtbarkeit class Buch { private String name; boolean gelesen; public void lesen () { gelesen = true; } } class Bibliothek { public static void main (String [] args) { Buch buch1 = new Buch(); buch1.lesen(); buch1.gelesen = false; // erlaubt buch1.name = "The Third Policeman"; // nicht erlaubt! --> Compilerfehler } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 22 / 56 Statische Attribute class Fahrrad { String marke; Fahrrad (String marke) { this.marke = marke; } } Normale Variable • Variable gehört zu einem Objekt • Jedes Objekt bekommt eine eigene Instanz der Variable • Wert der Variablen kann in jedem Objekt unterschiedlich sein • Beispiel: String marke; Christian Scheible Java für Computerlinguisten 28. Juli 2009 23 / 56 Statische Attribute class Fahrrad { String marke; static int anzahl_fahrraeder = 0; // statische Variable Fahrrad (String marke) { this.marke = marke; anzahl_fahrraeder += 1; } } Statische Variable • Variable gehört zu einer Klasse • Jedes Objekt benutzt die selbe Instanz der Klasse • Wert der Variablen ist in jedem Objekt gleich • Beispiel: static int anzahl_fahrraeder (Instanzzähler) Christian Scheible Java für Computerlinguisten 28. Juli 2009 24 / 56 Statische Methoden class Fahrrad { static boolean equal (Fahrrad f1, Fahrrad f2) { // ... } void fahren () { // ... } } • Normaler Aufruf: f1.fahren() → Methode einem bestimmten Objekt zugeordnet f1, das vorher erstellt worden sein muss • Statischer Aufruf: Fahrrad.equal(f1, f2) → Methode keinem bestimmten Objekt zugeordnet, sondern der Klasse Christian Scheible Java für Computerlinguisten 28. Juli 2009 25 / 56 Vererbung Benutze vorhandene Klasse als Grundlage für neue Klassen class Fahrzeug class Moebel class Regal class Sitzmoebel class Stuhl Christian Scheible class Bank Java für Computerlinguisten 28. Juli 2009 26 / 56 Vererbung Syntax class Tochterklasse extends Mutterklasse {} Christian Scheible Java für Computerlinguisten 28. Juli 2009 27 / 56 class Moebel { float gewicht; void aufbauen () { System.out.println("Wir bauen ein Moebelstueck!"); } } class Regal extends Moebel // Regal erbt von Moebel { float ablagevolumen; Regal (float gewicht, float ablagevolumen) { this.gewicht = gewicht; // Variablen von Moebel werden uebernommen this.ablagevolumen = ablagevolumen; } void aufbauen () { System.out.println("Wir bauen ein Regal!"); } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 28 / 56 Vererbung Konstruktor • Konstruktoren werden nicht mitvererbt • Zugriff auf den Konstruktor der Mutterklasse? class Moebel { Moebel () { System.out.print("Moebel wird gebaut") } } class Regal extends Moebel // Regal erbt von Moebel { Regal () { super(); } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 29 / 56 Vererbung Typhierarchie Object ↑ Moebel ↑ Schrank • Object ist immer die oberste Klasse • Standard: Klasse erbt automatisch von Object Christian Scheible Java für Computerlinguisten 28. Juli 2009 30 / 56 Vererbung Automatische Typanpassung Regal regal1 = new Regal(); Moebel regal2 = new Regal(); Object regal3 = new Regal(); Moebel moebel1 = new Moebel(); Object moebel2 = new Moebel(); • Erlaubt: Vom niedrigeren zum höheren Typ • Verboten: Vom höheren zum niedrigeren Typ Christian Scheible Java für Computerlinguisten 28. Juli 2009 31 / 56 Vererbung Typecasting Object regal1 = new Regal(); Moebel regal2 = (Moebel) regal1; Regal regal3 = (Regal) regal1; Moebel regal4 = (Regal) regal1; • Typ testen: variable instanceof Typ Christian Scheible Java für Computerlinguisten 28. Juli 2009 32 / 56 Vererbung Methoden überschreiben • Mutterklasse und Tochterklasse haben Methode mit gleicher Signatur: → Methode der Tochterklasse überschreibt die der Mutterklasse • Einschränkungen • Sichtbarkeit muss gleich oder schwächer sein • Rückgabetyp kann verschieden sein Christian Scheible Java für Computerlinguisten 28. Juli 2009 33 / 56 Vererbung class A { public String toString () { return "Instanz von Klasse A"; } } class B extends A { public String toString () { return "Instanz von Klasse B"; } } toString(): Wird benutzt, wenn System.out.print aufgerufen wird. Christian Scheible Java für Computerlinguisten 28. Juli 2009 34 / 56 Vererbung Annotation: @Override @Override public String toString () { return "Ich bin es." } • Bedeutung: Die annotierte Methode muss eine andere überschreiben → Verhindert Fehler, z.B. @Override public String tostring () Christian Scheible Java für Computerlinguisten 28. Juli 2009 35 / 56 Vererbung Finale Methoden public final String getName () { return } final: Methode darf von Unterklassen nicht überschrieben werden Christian Scheible Java für Computerlinguisten 28. Juli 2009 36 / 56 Vererbung Finale Klassen final class Regal extends Moebel { // ... } final: Von dieser Klasse darf man nicht erben Christian Scheible Java für Computerlinguisten 28. Juli 2009 37 / 56 Vererbung Dynamische Bindung → Polymorphie • Methoden werden mitvererbt • Geerbte Methoden können wir überschreiben • Methoden können nicht wieder verloren werden Christian Scheible Java für Computerlinguisten 28. Juli 2009 38 / 56 Vererbung Dynamische Bindung Regal moebel1 = new Regal(); Moebel moebel2 = new Regal(); moebel1.aufbauen(); moebel2.aufbauen(); • Prüfung zur Laufzeit: welche Implementierung von aufbauen() soll benutzt werden • Variablen haben die Typen Object und Moebel • Benutzt wird die Methode aus Regal Christian Scheible Java für Computerlinguisten 28. Juli 2009 39 / 56 Abstrakte Klassen • Bisher: Wir können von jeder Klasse ein Objekt erstellen. • Problem: Manchmal nicht so sinnvoll. • Beispiel: Was für ein Objekt erzeugt Moebel? • Lösung: Abstrakte Klasse abstract class Moebel {} • Verboten: Moebel moebel1 = new Moebel(); • Weiter Erlaubt: Moebel moebel1 = new Regal(); Christian Scheible Java für Computerlinguisten 28. Juli 2009 40 / 56 Abstrakte Klassen abstract class Moebel { String name; float gewicht; public abstract void aufbauen (); public void setName(String name) { this.name = name; } } • Abstrakte Methode aufbauen(): → Unterklasse muss diese Methode implementieren • Nicht-abstrakte Methoden dürfen vorkommen (setName()) Christian Scheible Java für Computerlinguisten 28. Juli 2009 41 / 56 Abstrakte Klassen Umgang mit abstrakten Methoden aus der Oberklasse • Implementieren • Abstrakt lassen (unsere Klasse ist selbst abstrakt!) Christian Scheible Java für Computerlinguisten 28. Juli 2009 42 / 56 Interfaces (Schnittstellen) class Eins { void x() { System.out.println("A") } } class Zwei { void x() { System.out.println("B") } } class EinsZwei extends Eins, Zwei { // sehr verboten! } • Abstrakte Klasse bestimmt Voraussetzungen, die Unterklasse erfüllen muss • Idee: Von mehreren Klassen erben, um Voraussetzungen zu verbinden • Problem: Welche Methode wird vererbt bei gleicher Signatur? (Oben: Methode x) → Mehrfachvererbung verboten! Christian Scheible Java für Computerlinguisten 28. Juli 2009 43 / 56 Interfaces (Schnittstellen) Lösung: Interfaces interface KaufbarerGegenstand { public static int konstante = 0; public void kaufen(); } Unterschied zu abstrakten Klassen: • Interface darf keine Implementierung enthalten • Eine Klasse darf von mehreren Interfaces erben (eigentlich: Eine Klasse darf mehrere Interfaces implementieren) → implements statt extends • Variablen müssen static und final sein Christian Scheible Java für Computerlinguisten 28. Juli 2009 44 / 56 abstract class Moebel { float gewicht; abstract void aufbauen (); } interface Buyable { void kaufen(); } class Regal extends Moebel implements Buyable { void aufbauen () { System.out.println("baue Regal ..."); } public void kaufen() { System.out.println("Kaufe Regal zum Preis von" + this.preis); } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 45 / 56 Generische Klassen • Generisch: Bekannt aus Ada? • Implementierung der Klasse abhängig vom Typ class Liste<T> { public void einfuegen(T wert){ // ... } } Liste<Integer> l1 = new Liste<Integer>(); Christian Scheible Java für Computerlinguisten 28. Juli 2009 46 / 56 Arbeiten mit Objekten Getter/Setter • Manchmal wollen wir den direkten Zugriff auf Attribute nicht erlauben • Kontrollierter Zugriff • Methoden für Zugriff • Auslesen: get() • Schreiben: set() class ComplexNumber { private float real, imaginary; public float getReal() { return real; } public void setReal(float real) { this.real = real; } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 47 / 56 Arbeiten mit Objekten toString • Identifikation eines Objekts • Gibt Namen und Eigenschaften des Objekts aus • Gibt nicht unbedingt den kompletten Inhalt aus • Rückgabetyp: String, Sichtbarkeit: public class ComplexNumber { float real, imaginary; @Override public String toString() { return getClass().getName() + String.format("[real=%f,imaginary=%f]", real, imaginary); } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 48 / 56 Arbeiten mit Objekten class ComplexNumber { float real, imaginary; @Override public String toString() { return getClass().getName() + String.format("[real=%f,imaginary=%f]", real, imaginary); } } Aufruf ComplexNumber c1 = new ComplexNumber(); System.out.println(c1); // geht wegen toString Christian Scheible Java für Computerlinguisten 28. Juli 2009 49 / 56 Arbeiten mit Objekten equals • Methode stellt Gleichheit mit einem anderen Objekt fest • Beispiel: "a".equals("b") • Rückgabetyp: boolean, Argumenttyp: Object class ComplexNumber { float real, imaginary; @Override public boolean equals (Object obj) { ComplexNumber that = (ComplexNumber) obj; return (this.real == that.real) && (this.imaginary == that.imaginary); } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 50 / 56 Arbeiten mit Objekten • Zuweisung mit = bei Referenztypen erzeugt keine Kopie • Andere Methode zur Vervielfältigung nötig Copy-Konstruktor class ComplexNumber { float real, imaginary; ComplexNumber (ComplexNumber that) { this.real = that.real; this.imaginary == that.imaginary; } } ComplexNumber a = ComplexNumber(1,3); ComplexNumber b = ComplexNumber(a) Christian Scheible Java für Computerlinguisten 28. Juli 2009 51 / 56 Arbeiten mit Objekten – Garbage Collection Idee: Wir wollen Speicher sparen • Daten bleiben so lange im Speicher, bis sie nicht mehr gebraucht werden • Problem: Wann werden sie nicht mehr gebraucht? Lösung: Garbage Collector • Sucht regelmäßig nach solchen Objekten • Methode: Generationeller Zähler Christian Scheible Java für Computerlinguisten 28. Juli 2009 52 / 56 Arbeiten mit Objekten finalize • Garbage Collector löscht überflüssige Objekte • Was passiert beim Löschen? → finalize • Exceptions werden ignoriert, Garbage Collector läuft weiter • Objekte mit finalize kosten Zeit! • Nicht vergessen: super.finalize() class X { public void finalize() { super.finalize(); System.out.println("Loesche ein X"); } } Christian Scheible Java für Computerlinguisten 28. Juli 2009 53 / 56 Wrapper • Wrapper: Klasse, die etwas umschließt (z.B. Objekt, andere Klasse) • Ziel: Bestimmte Spezifikationen erfüllen, Methoden • Primitive Wrapper: Für die primitiven Datentypen (int, float, ...) → Dadurch als Objekte verfügbar! • Autoboxing/-unboxing: Java konvertiert primitive Variablen zu Objekten, wenn nötig Primitiv byte short int long float double char boolean Wrapper Byte Short Integer Long Float Double Character Boolean Christian Scheible Java für Computerlinguisten 28. Juli 2009 54 / 56 Wrapper Methoden (Integer) equals() intValue() toString() parseInt() Gleichheit Konversion nach int Konversion nach String Konversion von String Integer.toString(new Integer(70)); // "70" Integer.parseInt("12345"); // 12345 Christian Scheible Java für Computerlinguisten 28. Juli 2009 55 / 56 Literatur Sun. JDK 6 Documentation. http://java.sun.com/javase/6/docs/. Sun. The Java Tutorials. http://java.sun.com/docs/books/tutorial/. C. Ullenboom. Java ist auch eine Insel. Galileo Press, 2003. http://openbook.galileocomputing.de/javainsel8/. Christian Scheible Java für Computerlinguisten 28. Juli 2009 56 / 56