Am Anfang der früheren Abschnitte fanden
Sie in der Regel ein Bild zum Thema.
Im Jahre 2008 ist das Internet 15 Jahre alt
geworden, und so soll eine Webseite - sagen wir die aktuelle - unser
Ausgangspunkt und damit das Startbild sein!
Was sind die wesentlichen Attribute einer HTML-Seite?
Diese Attribute sind ganz eng mit
Funktionalitäten (Methoden) verbunden:
Ein derartiges Webseiten-Objekt findet sich in
folgender
Java Klasse
wieder:
Eingangs sind die vier Attribute aufgelistet;
danach folgen die zugehörigen Methoden: für das Lesen unserer
Webseite ist zuständig die GetWebText-Methode, welche auch den Zähler verändert (Zeilen 19
bis 22).
Es ist
also nicht sinnvoll, den Zähler direkt zu verändern; dieser Zugriff
ergibt sich ausschließlich über die
entsprechenden Methoden.
Für das Lesen von
Datum oder Zähler werden drei entsprechende Get-Methoden angeboten.
Unbedingt erwähnenswert ist die sog. Konstruktormethode WebSite: Diese ist namensgleich mit der Klasse und
legt die Startwerte bei Erzeugung des Objektes
fest (z.B. initialisiere den Zähler mit 25; vgl. Zeilen 12 bis 17).
Insgesamt stellt die Klasse eine Art Bauplan, eine Schablone für die Objekte dar.
Mit folgendem kleinen Testprogramm erzeugen wir
ein Objekt der Klasse WebSite:
in Zeile 6
generiert das Objekt page
der Klasse WebSite.
Zugriff auf die Methoden erhält page
über den Selektorpunkt; also z.B:
Ausgabe:
Entstehungsdatum: 1.5.08
Aktualisierungsdatum: 6.5.08
Text der Web Seite: ZUM_Kopf Thema
Zugriffszaehler: 26
Der Zähler hat sich zwangsläufig erhöht.
Wie angekündigt verwenden wir zum Editieren
der Quelltexte jetzt Eclipse.
Alle Klassen, die sich gegenseitig nutzen,
schreiben wir in ein sog. Package (-Verzeichnis; aber das
regelt Eclipse).

|
Datenkapselung
Werfen wir nochmals einen Blick auf den Quelltext der Klasse WebSite:
In der Klasse werden Eigenschaften und Verhalten eines Objektes
"gekapselt"; um einen Klassen-Quelltext zu verstehen, ist es
also nicht nötig, sich zur gegebenen Datenstruktur die zugehörigen Prozeduren
zusammen-
zusuchen:
In den jeweiligen Klassen sind Daten und
entsprechende Methoden für das Klassenobjekt zusammengefasst.

|
Zugriffsschutz über Modifier
Das Objekt page im Testprogramm konnte über den Selektorpunkt auf die Methoden der Klasse WebSite
zugreifen: Als Beispiel hatten wir page.getZugriffsZaehler(); genannt.
Grundsätzlich wäre es möglich, page über den Selektorpunkt auch auf die Attribute zugreifen zu lassen;
also etwa:
page.zugriffsZaehler = 100;
System.out.printf("Zugriffszaehler: %d", page.zugriffsZaehler);
Dies wäre aber im Widerspruch zur Problemspezifikation, wonach der Zähler nur durch Lesezugriffe auf die
Webseite erhöht werden kann...
Die Daten müssen also vor Zugriff von außen geschützt werden; dies gelingt durch den Modifier private

Die Anpassungen für die Klasse WebSite wurden hier nur teilweise durchgeführt; durch den Modifier private
sind die Elemente des Typs nur in der Klasse selbst sichtbar. Der Modifier public hingegen erlaubt den
freien Zugriff ohne Beschränkung ( also für alle Klassen; sogar außerhalb des Package).

|
Vererbung
Die Klasse WebSite bietet dem Autor der Seite noch keine ausreichenden Möglichkeiten, insbesondere noch
keinen Schreibzugriff; andererseits soll er auch die Möglichkeiten von WebSite nutzen, ohne dass alle Attribute und
Methoden nochmals vereinbart werden müssen:
Als Lösung planen wir eine neue Klasse WebSiteAuthor, welche alle Funktionalität von WebSite übernimmt ("erbt")
und um zusätzliche Attribute und Operationen erweitert wird; außerdem ist es möglich, Methoden von WebSite
neu zu definieren (zu überschreiben).
Hinzugekommen ist das Attribut mail in Zeile 4, wobei die Autorenpost mit der getMail-Methode gelesen werden
kann; außerdem gibt es jetzt Methoden, um auf die Webseite zu schreiben und den Zähler willkürlich zu ändern.
Die Vererbung ist geregelt durch
Alle Komponenten von WebSite stehen also
weiterhin zur Verfügung, wobei hier noch keine Methode überschrieben
(ersetzt) wurde.
Besondere Erwähnung findet wieder der Konstruktor (vgl. Zeilen 6 bis 9): Dieser ist mit einem
formalen Parameter
für die Mail ausgestattet; der aktuelle Parameter ergibt sich im Hauptprogramm bei der Erzeugung des Objektes.
Die
Initialisierung für die anderen Attribute wird mit super()
von der Vaterklasse WebSite übernommen.
Ein Objekt der Klasse WebSiteAuthor erzeugen wir mit folgendem
Testprogramm:

Leider liefert das Programm beim Start
u.a. folgende Fehlermeldung:
Exception in thread "main" java.lang.Error:
Unresolved compilation problems:
The field WebSite.webText is not visible
The field WebSite.datumAktuell is not visible
...???
(Eclipse zeigt
übrigens schon beim Editieren das Problem an).
Wie eigentlich bei allen Facetten des Zugriffsschutzes straft
sich der Entwickler zunächst selbst am meisten:
In der Basisklasse WebSite hatten wir die Attribute mit dem Modifier
private
versehen, um sie vor
direktem
Zugriff zu schützen;
Durch private
sind die Daten allerdings nur in der eigenen
Klasse
sichtbar; auch die Tochterklassen können nicht zugreifen...
Um das Vererbungskonzept zu retten, steht der Modifier protected
zur Verfügung, welcher die
Sichtbarkeit in
allen abgeleiteten Klassen regelt. Die Attribute in WebSite erscheinen
also in folgender endgültigen Form:

Das Testprogramm liefert jetzt die
Ausgabe:
Entstehungsdatum:
1.5.08
Aktualisierungsdatum: 6.5.08
Text der Web Seite: ZUM_Kopf Thema
Neuer Text der Web Seite: ZUM_Kopf Thema Thema2
Aktualisierungsdatum: 16.5.08
Zugriffszaehler: 27
Mail: Glückwunsch zur Web Site!
Man beachte wieder die
Entwicklung des Zugriffszählers.
Grundsätzlich hätte man alle Methoden der Klasse WebSite in den Quelltext
der Tochterklasse kopieren
können; bei einer Änderung in WebSite müsste man
dann aber auch alle Unterklassen anpassen... Somit ergibt sich der
besondere Nutzen des Vererbungsprinzipes.
Zum Abschluss dieses Abschnittes eine Tabelle zur besseren Übersicht
über die Modifier:
Zugriffsmodifier |
Sichtbarkeit |
public |
in allen Packages |
ohne Modifier |
im aktuellen Package |
protected |
in allen abgeleiteten Klassen und im
aktuellen Package |
private |
nur innerhalb der eigenen Klasse |

|
Überschreiben
und überladen von Methoden
Ein wichtiger Aspekt beim Vererben von
Methoden ist, dass man diese Operationen nicht nur übernehmen , sondern
auch ändern kann, wenn man Namen und Parameter genau belässt (auch die
Reihenfolge und der Typ der Parameter müssen genau übereinstimmen).
Beim Überschreiben
muss also der Methodenkopf, die sog. Signatur, korrekt übertragen
werden.
Wo kann man dies nutzen in unserer abgeleiteten Klasse WebSiteAuthor?
Wenn z.B. der Autor seine Webseite testet, ist es nicht erforderlich,
beim Lesen den Zugriffszähler zu bedienen;
folglich wird diese Klasse
mit einer
eigenen getWebText -Methode ausgestattet (vgl. Zeilen 29 bis 31):
Aus Bequemlichkeit (guter
Programmierstil?) erscheint es praktisch, die Parameter nach den
Attributen zu benennen; die Attribute kennzeichnet man dann mit
this
Der Konstruktor sieht dann so
aus:

Während
this
immer auf das aktuelle Objekt der Klasse verweist, zeigt
super
auf die übergeordnete
Klasse.
In Zeile 12 entdecken wir noch einen
zweiten Konstruktor für eine Objekterzeugung ohne Parameter; auch
hier kann
man mit this
auf den eigentlichen Konstruktor
in Zeile 7 verweisen und diesem einen aktuellen Parameter
zuweisen, ohne den Konstruktor ganz neu editieren zu müssen. Grundsätzlich kann jede Methode mit unterschiedlichen Parameterlisten
vereinbart werden; beim Aufruf muss der
Compiler jeweils untersuchen,
welche Variante am besten zu der aktuellen Parameterliste passt. Man
nennt dies
Überladen von Methoden.
In unserem Testprogramm erzeugen wir zwei Objekte der Klasse
WebSiteAuthor2, um beide Konstruktoren
anzusprechen. Ebenso wird verdeutlicht:
- keine Erhöhung des Zählers beim
Lesezugriff (die Methode von WebSite ist überschrieben)
- Der Autor kann über eine für ihn
zugängliche Methode den Zugriffszähler manipulieren .

Ausgabe:
Erster Konstruktor: Die Mail
ist Glückwunsch zur Web Site!
Zweiter Konstruktor: Die Mail ist Die
Seite ist klasse
ZUM_Kopf Thema
Zugriffszaehler: 25
Der Zugriffszähler wird willkürlich auf 1000 gesetzt:
Zugriffszaehler: 1000
Falls die überschriebene Methode getWebText doch benötigt wird, kann man
noch folgende Operation vereinbaren:

Ein ausführliches Testprogramm für die Klasse WebSiteAuthor2 findet man hier.

|
Übungen
|
|
In meiner
Jugendzeit hatte ich noch ein sog. Postgirokonto: Da die
damalige Staatspost den Banken keine Konkurrenz machen sollte,
durfte ein solches Konto nicht überzogen werden.
Modellieren Sie eine derartige Kontoklasse in Java, welche
Abheben und Einzahlen zulässt.
Sie benötigen die Attribute Kapital und Kontonummer sowie Methoden für
Auszahlung, Einzahlung und Kontostand abfragen; testen Sie Ihre Klasse
mit einem geeigneten Testprogramm.
- Ein übliches Girokonto darf man um
einen gewissen Betrag überziehen, und dafür rechnet die Bank einen
entsprechenden Überziehungszinssatz.
Das "riecht" nach zwei weiteren Attributen; außerdem
wird eine Methode für die Berechnung der Tageszinsen gebraucht. Ansonsten
passt die Funktionalität unseres "Grundkontos" aus a).
Deshalb sollte man hier das Vererbungskonzept nutzen.
- Durch nochmalige Vererbung ist ein
Girokonto zu realisieren, welches auch einen Guthabenzinssatz
einräumt.
- Hier geht es um ein Sparkonto; bei einem
Sparbuch kommt man nie ins Minus, und es wird nie komplett geräumt
(Guthaben wenigstens 1€); höchstens 2000€ darf man abheben
(pro Monat); außerdem gibt es einen Guthabenzinssatz.
Als Basisklasse für die Vererbung dient das Grundkonto aus a);
u.a. wird wieder eine Methode für die Tageszinsen benötigt; die
Monatsfrist (gesetzliche Kündigung) muss nicht abgefragt werden.

Oberklasse Konto und Unterklassen
Lösungsvorschläge mit Erläuterungen,
Testumgebungen und Testläufen:
Übung
a
Übung
b
Übung
c
Übung
d
|
|
|
Quellen
- Vorlesung "Einführung in die
Programmierung" von Prof.
Dr. Herbert Göttler im WS 2007 / 2008 an der Universität
Mainz.
- Vorlesung "Einführung in die
Softwareentwicklung" von
Dr. A. Winter
im SS 2008 an der
Universität
Mainz
- Herrn Mahdi D-Manesh
/ Universität
Mainz / Fachbereich Informatik bin ich
für die Durchsicht der Vorlage und die
hilfreichen Anregungen sehr dankbar.
- Reinhard
Schiedermeier — Programmieren mit Java ISBN: 978-3-8273-7116-4
480 Seiten; Sprache: Deutsch; € 39,95 [D]
- Heide Balzert: Lehrbuch der Objektmodellierung,
Analyse und Entwurf.
2. Auflage, Elsevier, München, 2005 ISBN: 3-8274-1162-9
(bis Seite 61).

|
Weitere
Literaturempfehlungen
finden Sie hier
|