Modellierung und Implementierung von Klassen
Die Schulbibliothek deiner Gesamtschule in Bonn verleiht Hunderte Bücher an Hunderte Schülerinnen und Schüler. Niemand schreibt für jedes Buch ein eigenes Programmstück. Wie beschreibt man viele ähnliche „Dinge“ mit einem einzigen Bauplan, und wie sorgt man dafür, dass niemand diese Dinge versehentlich kaputt macht? Genau darum geht es in der objektorientierten Modellierung.
Objekte und Klassen
Bei der Analyse eines Problems suchst du zuerst die Objekte: die Dinge, mit denen das System arbeitet. In der Bibliothek sind das zum Beispiel ein bestimmtes Buch, eine Leserin oder eine Ausleihe.
Jedes Objekt hat Attribute (Eigenschaften mit Werten) und kann Operationen ausführen oder erleidet sie (später: Methoden).
Objekt buch1 |
Objekt buch2 |
|
|---|---|---|
| Titel | „Krabat“ | „Tintenherz“ |
| Autor | Otfried Preußler | Cornelia Funke |
| verliehen | false | true |
Beide Objekte gehören zur Klasse Buch. Sie haben dieselben Attribute, aber unterschiedliche Werte. Die Klasse ist also der Bauplan, die Objekte sind die gebauten Exemplare.
Die Gesamtschule Bonn verwaltet ihre Bibliothek mit einem Programm. Nennen Sie drei Objekte, die in diesem System vorkommen können, und geben Sie jeweils zwei Attribute…
Die Gesamtschule Bonn verwaltet ihre Bibliothek mit einem Programm. Nennen Sie drei Objekte, die in diesem System vorkommen können, und geben Sie jeweils zwei Attribute mit Beispielwerten an. Erklären Sie außerdem den Unterschied zwischen einem Objekt und einer Klasse.
Klassendiagramm und Sichtbarkeit
Ein Klassendiagramm stellt eine Klasse als Rechteck mit drei Bereichen dar: Klassenname, Attribute (mit Datentyp), Methoden.
- bedeutet private, + bedeutet public. Die Sichtbarkeit legt fest, wer auf ein Element zugreifen darf:
-
private: nur Code innerhalb der eigenen Klasse. -
public: Code in jeder Klasse.
Warum? Eine Klasse soll ihren Zustand selbst schützen. Eine set-Methode kann ungültige Werte abweisen, ein direkter Zugriff nicht (Prinzip der Kapselung, siehe unten).
Gegeben ist die Klasse Schueler mit den Attributen name (String), klasse (String) und alter (int) sowie den Methoden getName() und setKlasse(String neueKlasse). a)…
Gegeben ist die Klasse Schueler mit den Attributen name (String), klasse (String) und alter (int) sowie den Methoden getName() und setKlasse(String neueKlasse).
- a) Zeichnen Sie das zugehörige Klassendiagramm (als Tabelle mit drei Bereichen: Klassenname, Attribute, Methoden).
- b) Geben Sie an, welche Attribute und Methoden Sie als
privateund welche alspublicdeklarieren würden, und begründen Sie Ihre Wahl kurz.
Klassen in Java implementieren
Aus dem Diagramm wird Quellcode. Eine Klasse besteht aus Attributen, einem Konstruktor (setzt den Anfangszustand beim Erzeugen) und Methoden.
/** Ein Sparbuch-Konto. */
public class Konto {
private String inhaber;
private double kontostand;
public Konto(String inhaber) {
this.inhaber = inhaber;
this.kontostand = 0.0;
}
public void einzahlen(double betrag) {
if (betrag > 0) {
kontostand = kontostand + betrag;
}
}
public double getKontostand() {
return kontostand;
}
}
Der Konstruktor trägt den Namen der Klasse und hat keinen Rückgabetyp. this.inhaber meint das Attribut des Objekts, inhaber allein den Parameter. Ein Objekt entsteht mit new:
Konto k = new Konto("Lena");
k.einzahlen(50);
k ist eine Referenz: Sie verweist auf das Objekt. Der Punkt ruft eine Methode des Objekts auf.
Methoden mit Ergebnis haben einen Rückgabetyp und return; Methoden ohne Ergebnis sind void.
public boolean abheben(double betrag) {
if (betrag <= kontostand) {
kontostand = kontostand - betrag;
return true;
}
return false;
}
Gegeben ist der folgende Java-Quelltext: a) Nennen Sie Klassenname, Attribute, Konstruktor und Methoden. b) Ein Objekt wird mit Fahrrad f = new Fahrrad("Lena"); erzeugt,…
Gegeben ist der folgende Java-Quelltext:
public class Fahrrad {
private String besitzer;
private int gang;
public Fahrrad(String besitzer) {
this.besitzer = besitzer;
this.gang = 1;
}
public void hochschalten() {
gang = gang + 1;
}
}
- a) Nennen Sie Klassenname, Attribute, Konstruktor und Methoden.
- b) Ein Objekt wird mit
Fahrrad f = new Fahrrad("Lena");erzeugt, danach wird zweimalf.hochschalten();aufgerufen. Geben Sie den Objektzustand (Attributwerte) nach diesen Anweisungen an.
Implementieren Sie in Java eine Klasse Konto für eine Sparkasse in Dortmund mit dem privaten Attribut kontostand (double, Anfangswert 0,0), dem privaten Attribut inhaber…
Implementieren Sie in Java eine Klasse Konto für eine Sparkasse in Dortmund mit
-
dem privaten Attribut
kontostand(double, Anfangswert 0,0), -
dem privaten Attribut
inhaber(String), -
einem Konstruktor, der den Inhaber setzt,
-
der Methode
einzahlen(double betrag), die nur positive Beträge akzeptiert, -
der Methode
abheben(double betrag), dietruezurückgibt und den Betrag abbucht, wenn der Betrag positiv ist und der Kontostand ausreicht, sonstfalseund keine Änderung, -
der Methode
getKontostand().
Dokumentieren Sie die Methode abheben mit einem Javadoc-Kommentar.
Dokumentation und Kommunikation zwischen Objekten
Objekte arbeiten zusammen, indem sie sich gegenseitig Methoden aufrufen („Nachrichten senden“). Eine Methode kann dazu ein anderes Objekt als Parameter erhalten:
public boolean ueberweisen(Konto ziel, double betrag) {
if (abheben(betrag)) {
ziel.einzahlen(betrag);
return true;
}
return false;
}
Bei k1.ueberweisen(k2, 80) ruft k1 bei sich selbst abheben auf und bei k2 die Methode einzahlen. Hatte k1 120 € und k2 50 €, so hat danach k1 40 € und k2 130 €.
Damit andere die Methoden nutzen können, ohne den Code zu lesen, dokumentiert man sie mit einem Javadoc-Kommentar:
/**
* Hebt Geld vom Konto ab.
* @param betrag der abzuhebende Betrag in Euro (positiv)
* @return true, wenn abgebucht wurde; false, wenn das Guthaben nicht reicht
*/
public boolean abheben(double betrag) { ... }
Die Dokumentation beschreibt Zweck, Parameter, Rückgabe und gegebenenfalls Vorbedingungen, nicht jede einzelne Codezeile.
Ein Objekt k1 der Klasse Konto aus einer Sparkasse hat den Kontostand 120,00 €, ein Objekt k2 den Kontostand 50,00 €. Die Klasse besitzt die Methode ueberweisen(Konto…
Ein Objekt k1 der Klasse Konto aus einer Sparkasse hat den Kontostand 120,00 €, ein Objekt k2 den Kontostand 50,00 €. Die Klasse besitzt die Methode ueberweisen(Konto ziel, double betrag), die vom eigenen Konto abhebt und beim Zielkonto einzahlt.
- a) Geben Sie die Kontostände von
k1undk2nachk1.ueberweisen(k2, 80);an.
- b) Geben Sie die Kontostände nach einem weiteren Aufruf
k1.ueberweisen(k2, 80);an, wenn die Methode bei zu geringem Guthaben nichts ausführt.
- c) Erklären Sie, wie hier die Kommunikation zwischen den Objekten abläuft.
Assoziation
Klassen stehen oft in Beziehung. Ein Verein hat Mannschaften, eine Mannschaft hat Mitglieder. Das nennt man Assoziation. Im Diagramm zeichnet man eine Linie und schreibt die Kardinalitäten an die Enden: Wie viele Objekte stehen auf der anderen Seite?
Gelesen: Eine Mannschaft hat viele Mitglieder; ein Mitglied gehört zu genau einer Mannschaft (1 : n). In Java setzt man die Assoziation um, indem eine Klasse ein Attribut vom Typ der anderen oder ein Feld (Array) davon enthält, z. B. private Mitglied[] mitglieder; in Mannschaft und private Mannschaft mannschaft; in Mitglied.
Ein Sportverein in Münster möchte seine Mitglieder und Mannschaften verwalten. Ein Mitglied hat Name, Geburtsjahr und Beitrag (in €). Eine Mannschaft hat einen Namen und…
Ein Sportverein in Münster möchte seine Mitglieder und Mannschaften verwalten. Ein Mitglied hat Name, Geburtsjahr und Beitrag (in €). Eine Mannschaft hat einen Namen und mehrere Mitglieder; jedes Mitglied gehört zu genau einer Mannschaft.
- a) Ermitteln Sie die Klassen und ihre Attribute.
- b) Beschreiben Sie die Assoziation zwischen den Klassen einschließlich der Kardinalitäten (1 : n).
- c) Zeichnen Sie das Klassendiagramm (Textdarstellung genügt) mit Assoziation.
Vererbung und Kapselung
Lehrkräfte und Schülerinnen und Schüler haben beide Name und Geburtsdatum. Statt das doppelt zu schreiben, legt man eine Oberklasse Person an. Die Unterklassen Lehrkraft und Schueler erben deren Attribute und Methoden und ergänzen eigene. Im Diagramm zeigt ein Pfeil mit leerer Spitze von der Unterklasse zur Oberklasse („ist ein“).
public class Person {
private String name;
private String geburtsdatum;
public Person(String name, String geburtsdatum) {
this.name = name;
this.geburtsdatum = geburtsdatum;
}
}
public class Schueler extends Person {
private String klasse;
public Schueler(String name, String geburtsdatum, String klasse) {
super(name, geburtsdatum);
this.klasse = klasse;
}
}
extends stellt die Vererbung her. super(...) ruft den Konstruktor der Oberklasse auf und muss in der ersten Zeile stehen. Vorteile: Gemeinsames steht nur einmal (weniger Code, Änderungen an einer Stelle), und die Unterklassen sind klar als Spezialfälle von Person modelliert.
Eine Unterklasse erbt private-Attribute zwar, kann aber nicht direkt darauf zugreifen. Sie nutzt dafür die public-Methoden der Oberklasse.
Für eine Schulverwaltung in Köln sollen Personen modelliert werden. Es gibt Lehrkräfte (mit Kürzel und Fächern) und Schülerinnen und Schüler (mit Klasse und…
Für eine Schulverwaltung in Köln sollen Personen modelliert werden. Es gibt Lehrkräfte (mit Kürzel und Fächern) und Schülerinnen und Schüler (mit Klasse und Notendurchschnitt). Beide haben Name und Geburtsdatum.
- a) Entwerfen Sie ein Klassendiagramm mit einer Oberklasse
Personund zwei Unterklassen. Begründen Sie die Verteilung der Attribute.
- b) Schreiben Sie die Java-Köpfe der drei Klassen einschließlich der
extends-Beziehung und der Konstruktoren (Aufruf vonsuper).
- c) Erläutern Sie zwei Vorteile der Vererbung gegenüber getrennten, unabhängigen Klassen.
Gegeben ist: a) Ein Entwickler schreibt in einer anderen Klasse z.wert = 5;. Erklären Sie, warum dies zu einem Übersetzungsfehler führt, und beschreiben Sie das Prinzip…
Gegeben ist:
public class Zaehler {
private int wert;
public Zaehler() { wert = 0; }
public void erhoehe() { wert++; }
public int getWert() { return wert; }
}
- a) Ein Entwickler schreibt in einer anderen Klasse
z.wert = 5;. Erklären Sie, warum dies zu einem Übersetzungsfehler führt, und beschreiben Sie das Prinzip der Kapselung.
- b) Erweitern Sie die Klasse um eine Methode
setzeZurueck()und einen Konstruktor mit Startwert, der negative Startwerte durch 0 ersetzt.
- c)
Zaehler a = new Zaehler(); Zaehler b = a; a.erhoehe(); b.erhoehe();Geben Siea.getWert()an und begründen Sie das Ergebnis mit dem Unterschied zwischen Objekt und Referenz.
Ein Verleih in Hamburg vermietet Fahrräder und E-Bikes. Ein Kunde kann mehrere Fahrzeuge gleichzeitig ausleihen; ein Fahrzeug ist zu einem Zeitpunkt höchstens an einen…
Ein Verleih in Hamburg vermietet Fahrräder und E-Bikes. Ein Kunde kann mehrere Fahrzeuge gleichzeitig ausleihen; ein Fahrzeug ist zu einem Zeitpunkt höchstens an einen Kunden verliehen. E-Bikes haben zusätzlich einen Akkustand in Prozent.
- a) Ermitteln Sie die Klassen, Attribute, wichtigsten Methoden, Vererbungs- und Assoziationsbeziehungen und stellen Sie sie in einem Klassendiagramm dar (Textdarstellung).
- b) Geben Sie für die Methode
ausleihen(Fahrzeug f)der KlasseKundeeine Dokumentation (Zweck, Parameter, Rückgabe, Vorbedingung) an.
- c) Beurteilen Sie, ob der Akkustand
publicsein sollte, und begründen Sie Ihre Antwort.
Auf einen Blick
Zurück zum Anfang: Der Bauplan Buch beschreibt alle Bibliotheksbücher, und weil Attribute privat sind, ändert nur die Bibliothek selbst den Ausleihstatus.