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