2. Objektorientierte Programmierung Christian Scheible · • Wert der Variablen ist in jedem...

Preview:

Citation preview

Java fur Computerlinguisten2. Objektorientierte Programmierung

Christian Scheible

Institut fur Maschinelle Sprachverarbeitung

28. Juli 2009

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 1 / 56

Heute:

1 Besprechung der Ubungen vom Montag

2 Objektorientierte Programmierung

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 2 / 56

Objektorientierte Programmierung

• Grundlagen

• Klassen

• Sichtbarkeit

• Statische Methoden/Attribute

• Vererbung

• Schnittstellen

• Wrapper

Christian Scheible Java fur 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 fur unsere Programme

• Nicht benutzt: Klasse als Vorlage fur Objekte

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 4 / 56

Grundlagen

Aufbau eines Objekts

void aufbauen();void ablegen(Object gegenstand, int x, int y)Object herausnehmen(int x, int y);...

Color farbe;float hoehe;float breite;float tiefe;...

class Regal

Attribute(Variablen)

Methoden(Funktionen)

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 5 / 56

Grundlagen

Begriffe in der Objektorientierten Programmierung

• Abstraktion

• Kapselung

• Polymorphie

• Vererbung

• Feedback

• Persistenz

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 6 / 56

Grundlagen

Abstraktion• Wiederverwendbare Vorlagen

→ Objekt: Instanz einer Klasse

class Regal

Regal braunesRegal Regal weissesRegal

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 7 / 56

Grundlagen

Kapselung

• Daten sind im Objekt enthalten

• Daten sind von außen nicht zuganglich

• Objekt bietet Methoden zur Veranderung der Daten

Wozu?• Interne Variablen, die der Benutzer der Klasse nicht braucht

• Variablen, die der Benutzer nicht verandern darf

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 8 / 56

Grundlagen

public void fuettern();private void wachsen (int laenge);...

private float gewicht;private float alter;...

class SchweinAttribute(Variablen)

Methoden(Funktionen)

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 9 / 56

Grundlagen

Polymorphie

• Methoden reagieren verschieden abhangig von• Aufruf• Klassenzugehorigkeit

Feedback

Interaktion zwischen Objekten

Persistenz

Objekt existiert so lange, bis es zerstort wird

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 10 / 56

Grundlagen

Vererbung

• Neue Klassen konnen unter Benutzung alter Klassen definiert werden

• Die neue Klasse (Tochterklasse) erhalt alle Attribute und Methodender Mutterklasse

class Fahrzeug

class Moebel

class Regal class Sitzmoebel

class Stuhl class Bank

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 11 / 56

Klassen

Attribute

class Buch

{

String name; //

String author; // Attribute

int pubDate; //

}

Attribut: Variable, die dem Objekt zugehort.

Christian Scheible Java fur 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 fur 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 (.) fur Zugriff auf Inhalt des Objekts

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 15 / 56

Klassen

this• this: Referenz fur 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 fur Computerlinguisten 28. Juli 2009 16 / 56

Sichtbarkeit

Einschrankung des Zugriffs von anderen Klassen aus→ Kapselung

Sichtbarkeitsstufen

• Offentlich (public)

• Privat (private)

• Paketsichtbar

• Geschutzt (protected)

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 17 / 56

Sichtbarkeit

Offentlich

public: Auf das Element darf von außen ohne Einschrankung zugegriffenwerden.

com.ikea.Regalpublic void aufbauen();

BeliebigeAndereKlasse...

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 18 / 56

Sichtbarkeit

Privat

private: Auf das Element darf nur aus der selben Klasse zugegriffenwerden.

com.ikea.Regalprivate void aufbauen();

X de.aldi.Aushilfe...

Xcom.ikea.Mitarbeiter

...

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 19 / 56

Sichtbarkeit

paketsichtbar

Standard: Auf das Element darf nur aus dem selben Paket zugegriffenwerden, aber nicht aus anderen Paketen.In der Praxis: Wenn die Klasse im gleichen Verzeichnis liegt.

com.ikea.Regalvoid aufbauen();

com.ikea.Mitarbeiter...

X de.aldi.Aushilfe...

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 20 / 56

Sichtbarkeit

Geschutzt

protected: Auf das Element darf der selben Klasse und davonabgeleiteten Klassen zugegriffen werden.

→ Vererbung

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 22 / 56

Statische Attribute

class Fahrrad {

String marke;

Fahrrad (String marke) {

this.marke = marke;

}

}

Normale Variable• Variable gehort 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 fur 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 gehort zu einer Klasse

• Jedes Objekt benutzt die selbe Instanz der Klasse

• Wert der Variablen ist in jedem Objekt gleich

• Beispiel: static int anzahl_fahrraeder (Instanzzahler)

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 25 / 56

Vererbung

Benutze vorhandene Klasse als Grundlage fur neue Klassen

class Fahrzeug

class Moebel

class Regal class Sitzmoebel

class Stuhl class Bank

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 26 / 56

Vererbung

Syntax

class Tochterklasse extends Mutterklasse {}

Christian Scheible Java fur 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 fur 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 fur 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 fur 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 hoheren Typ

• Verboten: Vom hoheren zum niedrigeren Typ

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 32 / 56

Vererbung

Methoden uberschreiben• Mutterklasse und Tochterklasse haben Methode mit gleicher

Signatur:

→ Methode der Tochterklasse uberschreibt die der Mutterklasse

• Einschrankungen• Sichtbarkeit muss gleich oder schwacher sein• Ruckgabetyp kann verschieden sein

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 34 / 56

Vererbung

Annotation: @Override

@Override public String toString ()

{

return "Ich bin es."

}

• Bedeutung: Die annotierte Methode muss eine andere uberschreiben→ Verhindert Fehler, z.B.

@Override public String tostring ()

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 35 / 56

Vererbung

Finale Methoden

public final String getName ()

{

return

}

final: Methode darf von Unterklassen nicht uberschrieben werden

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 37 / 56

Vererbung

Dynamische Bindung

→ Polymorphie

• Methoden werden mitvererbt

• Geerbte Methoden konnen wir uberschreiben

• Methoden konnen nicht wieder verloren werden

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 38 / 56

Vererbung

Dynamische Bindung

Regal moebel1 = new Regal();

Moebel moebel2 = new Regal();

moebel1.aufbauen();

moebel2.aufbauen();

• Prufung zur Laufzeit: welche Implementierung von aufbauen() sollbenutzt werden

• Variablen haben die Typen Object und Moebel

• Benutzt wird die Methode aus Regal

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 39 / 56

Abstrakte Klassen

• Bisher: Wir konnen von jeder Klasse ein Objekt erstellen.

• Problem: Manchmal nicht so sinnvoll.

• Beispiel: Was fur ein Objekt erzeugt Moebel?

• Losung: Abstrakte Klasse

abstract class Moebel {}

• Verboten:

Moebel moebel1 = new Moebel();

• Weiter Erlaubt:

Moebel moebel1 = new Regal();

Christian Scheible Java fur 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 durfen vorkommen (setName())

Christian Scheible Java fur 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 fur 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 erfullenmuss

• 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 fur Computerlinguisten 28. Juli 2009 43 / 56

Interfaces (Schnittstellen)

Losung: 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 mussen static und final sein

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 45 / 56

Generische Klassen

• Generisch: Bekannt aus Ada?

• Implementierung der Klasse abhangig vom Typ

class Liste<T> {

public void einfuegen(T wert){

// ...

}

}

Liste<Integer> l1 = new Liste<Integer>();

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 46 / 56

Arbeiten mit Objekten

Getter/Setter

• Manchmal wollen wir den direkten Zugriff auf Attribute nicht erlauben

• Kontrollierter Zugriff

• Methoden fur 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 fur 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

• Ruckgabetyp: 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 fur 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 fur Computerlinguisten 28. Juli 2009 49 / 56

Arbeiten mit Objekten

equals

• Methode stellt Gleichheit mit einem anderen Objekt fest

• Beispiel: "a".equals("b")

• Ruckgabetyp: 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 fur Computerlinguisten 28. Juli 2009 50 / 56

Arbeiten mit Objekten

• Zuweisung mit = bei Referenztypen erzeugt keine Kopie

• Andere Methode zur Vervielfaltigung notig

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 fur 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 gebrauchtwerden

• Problem: Wann werden sie nicht mehr gebraucht?

Losung: Garbage Collector

• Sucht regelmaßig nach solchen Objekten

• Methode: Generationeller Zahler

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 52 / 56

Arbeiten mit Objekten

finalize• Garbage Collector loscht uberflussige Objekte

• Was passiert beim Loschen?

→ finalize

• Exceptions werden ignoriert, Garbage Collector lauft 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 fur Computerlinguisten 28. Juli 2009 53 / 56

Wrapper

• Wrapper: Klasse, die etwas umschließt (z.B. Objekt, andere Klasse)

• Ziel: Bestimmte Spezifikationen erfullen, Methoden

• Primitive Wrapper: Fur die primitiven Datentypen (int, float, ...)

→ Dadurch als Objekte verfugbar!

• Autoboxing/-unboxing: Java konvertiert primitive Variablen zuObjekten, wenn notig

Primitiv Wrapperbyte Byteshort Shortint Integerlong Longfloat Floatdouble Doublechar Characterboolean Boolean

Christian Scheible Java fur Computerlinguisten 28. Juli 2009 54 / 56

Wrapper

Methoden (Integer)

equals() GleichheitintValue() Konversion nach inttoString() Konversion nach StringparseInt() Konversion von String

Integer.toString(new Integer(70)); // "70"

Integer.parseInt("12345"); // 12345

Christian Scheible Java fur 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 fur Computerlinguisten 28. Juli 2009 56 / 56

Recommended