Upload
vandiep
View
218
Download
0
Embed Size (px)
Citation preview
Kapitel 19:Klassen und Unterklassen
Felix FreilingLehrstuhl für Praktische Informatik 1Universität Mannheim
Vorlesung Praktische Informatik Iim Herbstsemester 2009
Folien nach einer Vorlage von H.-Peter Gumm, Philipps-Universität Marburg
Übersicht
� Unterklassen
� Vererbung, super, over-riding
� Applets
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 2
� Applets
Rückblick: Klasse Konto
Konto
Felder:static int naechsteKontonummerprivate int kontostandprivate String inhaberprivate int nummer
Methoden:
� Modelliert ein Bankkonto
� Enthält Felder für � Kontostand, Inhaber, Kontonummer
� Felder sind private� Von außerhalb der Klasse nicht
zugreifbar
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 3
Methoden:getter
int getKontostand()int getInhaber()int getNummer()
…setter
void einzahlen(int)void überweisen(Konto, int)void abheben (int)
...
� Methoden zum Lesen und Verändern der Felder� getter/Observer� setter/Mutator
Spezielle Klassen� Wir wollen spezielle Konten implementieren
� Girokonten
� Man kann überziehen, muss dann aber Zinsen zahlen� Es gibt keine Habenzinsen
� Sparkonten
� man erhält Zinsen, � man kann nicht überziehen� man kann von Sparkonten nicht überweisen
� Wir könnten separat jeweils neue Klassen mit allen Feldern und Methoden schreiben
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 4
class Sparkonto {...
int nummer;String inhaber;static int sparZinssatz = 3;
int getInhaber(){return inhaber;
}...
}
class Girokonto {... int nummer;String inhaber;static int kreditZinssatz = 13;int limit=10000;...int getInhaber(){
return inhaber;}...
}
Modellierung als Unterklassen
� Immer wenn man Funktionalität in anderen Klassen wiederverwenden möchte, sollte man über Unterklassen und Vererbung nachdenken� Wiederverwendung der Basisfunktionalität der Klasse Konto
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 5
� Sparkonten und Girokonten sind spezielle Konten
� Jedes GiroKonto kann benutzt werden wie ein Konto� Die Klasse GiroKonto ist eine Unterklasse der Klasse Konto
� Jedes SparKonto kann benutzt werden wie ein Konto� Die Klasse SparKonto ist eine Unterklasse der Klasse Konto
Vererbung / Erweiterung� Unterklassen und ihre Objekte haben zusätzliche Eigenschaften
� Sie „erben“ alle (nicht privaten) Felder und Methoden der Oberklasse
� Sowohl Sparkonten als auch Girokonten haben automatisch� Die Felder nummer, kontostand, inhaber� Die Methoden getKontostand, einzahlen, abheben
� Sie können zusätzliche Felder habenSparkonten
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 6
� Sparkonten � Was ist der sparZinssatz� Wann wurde letztmals Zins gutgeschrieben
� Girokonten� Was ist der Überziehungszins � Was ist das Überziehungslimit� Seit wann ist überzogen
� Sie können zusätzliche Methoden haben� Sparkonten
� Zinsen gutschreiben� Girokonten
� Gebühr abziehen
Unterklassen in Java
� Mit dem Schlüsselwort extends beerbt eine Klasse eine andere Klasse:
class SparKonto extends Konto{...
static int sparZinssatz = 3;int letzterZinsTag;
class GiroKonto extends Konto{...
static int kreditZinssatz = 13;int letzterRechnungsTag;
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 7
int letzterZinsTag;
int getSparZinsSatz(){return sparZinsSatz;
}
void zahleZinsen(){. . .
int letzterRechnungsTag;int limit=10000;
int getLimit(){return limit;
}
void berechneGebühr(){. . .
Zugriff auf Oberklasse
Konto
Felder:static protected int zinssatzprotected int kontostandString inhaberprivate int nummer
Methoden:
� private Felder sind privat
� auch aus der Unterklasse aus nicht zugreifbar
� getter und setter sollten genügen
� protected Felder sind
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 8
Methoden:getter
int getKontostand()int getInhaber()int getNummer()
…setter
void einzahlen(int)void überweisen(Konto, int)void abheben (int)
...
� zugreifbar aus der Unterklasse� nicht zugreifbar aus anderen Klassen
� ungeschützte Felder sind
� zugreifbar von allen Klassen des gleichen Pakets
� nicht zugreifbar aus Klassen anderer Pakete
� „package private“
Zugriffe aus der UnterklasseKonto
Felder:protected int kontostandString inhaberprivate int nummer
Methoden:getter
);
class SparKonto extends Konto{
void zahleZinsen(){einzahlen( kontoStand * sparZinsSatz);
} // o.k.
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 9
getterint getKontostand()int getInhaber()int getNummer()
…setter
void einzahlen(int)void überweisen(Konto, int)void abheben (int)
...
} // o.k.
void druckeAuszug(){System.out.println(inhaber); //o.k.System.out.println(nummer); //falschSystem.out.println(kontoStand); //o.k.
}
Die Unterklasse in BlueJ
Diese Pfeile zeigen an, dass SparKonto und Girokonto Unterklassen von Konto sind.
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 10
und Girokonto Unterklassen von Konto sind.
Jedes Objekt der Teilklasse - hat zusätzliche Methoden- erbt alle Methoden der Oberklasse:
Eine Klasse mit UnterklassenKlasse Konto mit Unterklassen
GiroKonto undSparKonto
und eine Klasse, die die letzteren benutzt.
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 11
Overriding: über-definieren
� Methoden der Oberklasse können in der Unterklasse verändert werden:� z.B. kann die Methode abheben in der Unterklasse Sparkonto neu definiert werden:
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 12
class Sparkonto extends Konto{ ...
void abheben(int betrag){if (getKontoStand() >= betrag)super.abheben(betrag);
}. . .
Nur falls ( if )(kontoStand ≥ betrag )
ist führe die Aktion aus.
Die Methode abheben der Oberklasse, hier Konto.
Klasse - Unterklasse� Wann sollte man eine Klasse als Unterklasse
einer bestehenden Klasse modellieren?� Nur wenn es begrifflich Sinn macht
� Jeder Kreis ist eine Figur, � jede Figur ist ein geometrisches Objekt, � jedes Sparkonto ist ein Konto, � jeder PKW ist ein Fahrzeug
„... ist ein ...“≈
„...kann benutzt werden wie...“
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 13
� Nur wenn jedes Objekt der neuen Klasse als spezielles Objekt der bereits bestehenden Klasse angesehen werden kann
� Quadrat ist ein spezielles Rechteck, � ein Kreis ist eine spezielle Ellipse, � ein Sparkonto ist ein spezielles Konto, � eine ganze Zahl ist eine spezielle rationale Zahl
� Nur wenn die Methoden der Oberklasse auch in der Unterklasse Sinn machen.
� makeVisible() der Klasse Figur macht auch Sinn für jeden Kreis, länge(), breite() und fläche() der Klasse Rechteck machen auch Sinn für Quadrate, referenzPunkt() der Klasse GeometrischesObjekt macht auch Sinn für Kreise
super� verweist von der Unter- in die Oberklasse
class Sparkonto extends Konto{
// Wir übernehmen den // Konstruktor der Oberklasse
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 14
SparKonto(String x){ super(x);letzterZinsTag = 0;
}...
}
Fallstricke� In vielen Fällen haben Objekte der Unterklasse zusätzliche Felder
� Ein SparKonto ist ein Konto mit zusätzlichen Feldern, z.B. sparZins, letzterZinstag, ...
� Ein PKW ist ein Fahrzeug mit zusätzlichen Feldern, z.B. personenZahl, ...
� Eine MusikCD bzw. ein Film ist ein spezielles MedienKunstwerk, die neben autor, titel und herstellungsJahr noch titelListe und musikGenre bzw. schauspielerListe und kameramann hat.
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 15
musikGenre bzw. schauspielerListe und kameramann hat.
� Allein die Tatsache, dass Objekte der Klasse B mehr Felder haben, als Objekte der Klasse A macht B noch nicht zur Unterklasse von A
� Ein Quadrat hat eine länge, ein Rechteck hat länge und breite. Ein Rechteck ist aber kein spezielles Quadrat – ganz im Gegenteil !
� Eine RationaleZahl hat zähler und nenner, eine GanzeZahl nur zähler. RationaleZahlen sind aber nicht spezielle GanzeZahlen –im Gegenteil !
Eingebaute Java-Klassen erweitern� Klassen erweitern, heißt Unterklassen bilden
� Unterklasse erbt alle Felder und Methoden der Oberklasse� Sparkonto und Girokonto erben Funktionalität von Konto
� Java hat eine umfangreiche Klassen-Bibliothek
� Fast jede )* der Klassen kann man erweitern:
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 16
� Fast jede )* der Klassen kann man erweitern:
� Um ein Applet zu schreiben beerbt man die Klasse Applet. Sie stellt Methoden bereit,
� ein Applet im Browser darzustellen� es zu starten bzw. zu stoppen, wenn das
Browserfenster verändert wird� Auf der Leinwand des Applets zu schreiben,
zeichnen, Buttons und Menüs anzubringen
� Um User-Interfaces zu schreiben beerbt man die Klassen� Graphics, Event, Menu, Color, Window, Button, ... (siehe Kapitel 20)
... die sich in dem in dem Paket java.awt befinden.)* alle Klassen, die nicht als final deklariert wurden
Die Klasse Applet� WWW-Browser benutzen die Klasse Applet
� Der Browser erzeugt zunächst ein Applet new Applet( … )
� das Applet wird initialisiert durch die Methodeinit()
� und gestartet mitstart()
� Wechselt der Browser zu einer anderen Webseite, so ruft er die Methode
stop()
init()
start()
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 17
stop()� Kommt er zurück, erfolgt wieder ein
start()
� Jedesmal, wenn das Applet neu zu zeichnen ist� beim Start� wenn das Browserfenster Größe oder Position ändert,ruft der Browser die als public erklärte Methode
paint()mit Signatur void paint(Graphics g) auf.
� Ein Applet programmieren heißt: � Einige der genannten Methoden re-definieren.
stop()
destroy()
paint()
Wir beerben die Klasse Applet� Die Methoden (paint, init, start, stop, destroy) werden von außen – von
dem Browser – aufgerufen. � Klasse und ihre Methoden müssen daher public sein
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 18
� Wir beerben die Klasse � java.applet.Applet
� Wir redefinieren � paint()
� Wir benutzen die Klassen� java.awt.Graphics� java.awt.Color
Ausführen in BlueJ� Nach dem
Kompilieren hat das Kontextmenü der Klasse „Äpfelchen“ eine Auswahl: Run Applet
� wir wählen eine Dimension aus und
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 19
� sehen das Ergebnis per appletviewerdargestellt
Applet in Webpage einbinden
� Ein Applet lässt sich leicht in eine Webseite einbinden
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 20
Webseite einbinden
� HTML-Marke: <Applet> </Applet>
� Wichtigste Parameter: code, width, height
� Code-Datei hier:Äpfelchen.class
Nicht gerade spektakulär ...Die HTML-Datei - in verschiedenen Browsern
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 21
Übersicht
� Unterklassen
� Vererbung, super, over-riding
� Applets
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 22
� Applets
� Ausblick: Kapitel 20, Verwendung von Vererbung zur Programmierung einer grafischen Benutzerschnittstelle
� Mehr zu Objektorientierung in der Vorlesung “Wirtschaftsinformatik II”
Fallstudie zur Vererbung: PersonendatenbankPersonendatenbankAnhang zu Kapitel 19 der Vorlesung “Praktische Informatik I”
Fallstudie: Datenbank
� Basiert auf dem BlueJ-Beispielprojekt people
� Modelliert eine Datenbank für eine Uni� Datenbank enthält
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 24
� Datenbank enthält Studierende, Mitarbeiter und andere Personen
� Studierende und Mitarbeiter als Unterklassen von Person modelliert
Entwurf: Klasse Person
� Eine Person hat einen Namen und ein Geburtsjahr� Objektfelder name und geburtsjahr, beide private
� Anonyme Personen sollen erlaubt sein
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 25
� Anonyme Personen sollen erlaubt sein
� Man kann beide Felder lesen und setzen
� Man kann eine Person in eine Zeichenkette umwandeln� Re-Definition der Methode toString()
Entwurf: Klasse Student
� Ein Student kann auch wie eine Person benutzt werden� Unterklasse von Person
� Hat zusätzlich eine Matrikelnummer
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 26
� Hat zusätzlich eine Matrikelnummer� Zusätzliches privates Objektfeld String matrikelnummer
� Hat zusätzlich Methoden, die die Matrikelnummer lesen
� Soll auch in eine Zeichenkette umgewandelt werden können
Entwurf: Klasse Mitarbeiter
� Ähnlich wie Student, als Erweiterung der Klasse Person� Hat zusätzlich ein Büro
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 27
� privates Feld String bueroBezeichnung
� Hat Methoden, um dieses Feld zu lesen und zu setzen
� Soll auch in eine Zeichenkette umgewandelt werden können
Implementierung: Person
� Standard-Konstruktor:
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 28
Implementierung: Person� Speziellere Konstruktoren
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 29
Implementierung: Student
� Standard-Konstruktor:
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 30
Implementierung: Student
� Erweiterter Konstruktor:
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 31
In Zeichenkette umwandeln
� In der Klasse Person
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 32
In Zeichenkette umwandeln
� In der Klasse Student:
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 33
Vorteile abgeleiteter Klassen
� Man kann die Klasse Person verwenden, ohne zu wissen, wie sie implementiert ist
� Erspart einem die Definition und Behandlung der Felder, die eine Person hat
Praktische Informatik I, HWS 2009, Kapitel 19 Seite 34
Felder, die eine Person hat
� Ähnliches kann man auch mit den Standard-Java-Klassen machen � Siehe Beispiel Applet in Kapitel 19