Startseite Informatik-Rheinland-Pfalz


[an error occurred while processing this directive]

Rheinland-Pfalz;  Informatik                                 

2008; letzte Aktualisierung:  19.6.2014; Claus Schmitt

 

 

Zurück zur Startseite Informatik / Rheinland-Pfalz

 

 Klassen und Objekte

Java Klasse

Datenkapselung

Zugriffsschutz über Modifier

Vererbung

Überschreiben und überladen von Methoden

Übungen

Fachbegiffe suchen für alle Java-Seiten (Index)

Alle Java-Quelltexte

Quellen

 zurück zur Jav
Startseite

 

                    

 

 


 Klassen und Objekte 

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?

  • Im einfachsten Fall  ein informativer Text

  • Das Entstehungsdatum

  • Das Datum der letzten Aktualisierung

  • Ein Zugriffszähler

Diese Attribute sind ganz eng mit Funktionalitäten (Methoden) verbunden:

  • Ein Lesezugriff (im Browser) - und nur dieser! - setzt den Zugriffszähler hoch

  • Ein Schreibzugriff (im Editor) - passt das Datum an.

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).

zum Anfang der Seite    Begriffe Suchen

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.

 

zum Anfang der Seite    Begriffe Suchen

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).

zum Anfang der Seite    Begriffe Suchen

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

zum Anfang der Seite    Begriffe Suchen

Ü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

zum Anfang der Seite    Begriffe Suchen

Übungen

  1. 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.
     
  2. 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.
     
  3. Durch nochmalige Vererbung ist ein Girokonto zu realisieren, welches auch einen Guthabenzinssatz einräumt.

  4. 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

zum Anfang der Seite    Begriffe Suchen

Quellen

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

zum Anfang der Seite    Begriffe Suchen

Weitere Literaturempfehlungen
    finden Sie hier

 


Zurück zur Startseite Informatik / Rheinland-Pfalz
Startseite Informatik-Rheinland-Pfalz

Ergänzungen und Anregungen bitte an Claus Schmitt
 

Impressum · Datenschutz