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

Aufbau der Klasse

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