Java für Computerlinguisten - Institut für Maschinelle

Werbung
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
Herunterladen