"Grundkurs Programmieren in Java - (6. Auflage, 2011)"
2001-2011, Carl Hanser Verlag
Lösungsvorschlag zu Aufgabe 8.12 (Version 3.0)
(c) 2001-2011 D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger
a)
b)
Es wird ein Objekt, eine Instanz der Klasse Patient,
erzeugt. Durch Patient maier wird allerdings nur eine
Referenzvariable maier erzeugt, die den Wert null besitzt.
Erst maier = new Patient()
legt das referenzierte Objekt an.
c)
Ein Konstruktor für die Klasse Patient
könnte z.B. wie folgt aussehen:
public Patient (String name, int alter) {
this.name = name;
this.alter = alter;
}
Der Default-Konstruktor ohne Argumente ist nicht mehr vorhanden, wenn er nicht
explizit geschrieben worden ist, da er nur automatisch ergänzt wird, wenn kein
anderer Konstruktor implementiert wurde.
d)
public Patient vorherDran = null; // Vorgaenger in der Warteliste
public int nummer; // Nummer in der Warteliste
e)
Eine solche Erweiterung der Klasse Patient wäre z.B.
public static int folgeNummer = 1; // Naechste Nummer
so dass die erste zu vergebende Nummer die Eins wäre.
f)
Konstruktoren für die Klasse Patient wären z.B.
public Patient (String name, int alter) {
this.name = name;
this.alter = alter;
nummer = folgeNummer++;
}
public Patient (String name, int alter, Patient vorherDran) {
this.name = name;
this.alter = alter;
this.vorherDran = vorherDran;
nummer = folgeNummer++;
}
g)
Nach der Anweisung
Patient maier = new Patient("H. Maier", 68);
hat nummer im Objekt maier den Wert 1 und folgeNummer
hat den Wert 2. Nach der Anweisung
Patient schmid = new Patient("G. Schmid", 45, maier);
hat nummer im Objekt schmid den Wert 2 und folgeNummer
sowohl für das Objekt maier als auch für das Objekt schmid
den Wert 3. Nach der Anweisung
Patient berger = new Patient("I. Berger", 36, schmid);
hat nummer im Objekt berger den Wert 3 und folgeNummer
sowohl für das Objekt berger als auch für das Objekt schmid
als auch für das Objekt maier den Wert 4.
h)
Eine Realisierung der Methode istErster könnte wie folgt aussehen:
public boolean istErster () {
return (vorherDran == null);
}
Das Programmstück
System.out.println(maier.istErster());
System.out.println(schmid.istErster());
System.out.println(berger.istErster());
würde somit die Werte true, false und false ausgeben.
i)
Das Programmstück
System.out.println(maier);
System.out.println(schmid);
System.out.println(berger);
die Zeilen
H. Maier (1)
G. Schmid (2) kommt nach H. Maier (1)
I. Berger (3) kommt nach G. Schmid (2) kommt nach H. Maier (1)
ausgeben.
j)
Man muss die Variablen nummer und folgeNummer für den
Anwender der Klasse verbergen. Dies geschieht dadurch, dass man die Variablen als
private deklariert. Einen lesenden Zugriff auf die Identifikationsnummern
kann man mit neuen Methoden ermöglichen.
private int nummer; // Nummer in der Warteliste
private static int folgeNummer = 1; // Naechste Nummer
public int nr () {
return nummer;
}
public int folgeNr () {
return folgeNummer;
}
Damit wären im Anwenderprogramm z.B. die Anweisungen
System.out.println("Nummer H. Maier: " + maier.nr());
System.out.println("Naechste zu vergebende Nummer: " + schmid.folgeNr());
möglich.
Quelltext:
Patient.java