34
Kapitel 19: Klassen und Unterklassen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter Gumm, Philipps-Universität Marburg

Kapitel 19: Klassen und Unterklassen - News | IT ... · java.awt.Color. Ausführen in BlueJ Nach dem Kompilieren hat das Kontextmenü der Klasse „Äpfelchen“ eine Auswahl: Run

  • 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