Übungsaufgaben zu Referenztypen

Aufgabe 1: Überladene Methoden

  1. Diese Aufgabe ist eine Wiederholung der entsprechenden Aufgabe aus Programmieren 1 in erweiterter Form.

    Legen Sie in Ihrem Hauptprogramm eine neue Klasse Summation an und in dieser die folgenden Varianten einer Methode

    static int sum(...)

    für das Summieren von Zahlenwerten. Dabei stehen die Punkte ... im Methodenkopf oben für die unterschiedlichen Parametermengen der Varianten.

    1. Variante: Diese besitzt zwei Parameter: z1 und z2 vom Typ int. Die Aufgabe der Methode besteht darin, die in diesen Parametern übergebenen Werte zu addieren und das Ergebnis mit return an die Aufrufumgebung, d. h. den Programmcode, in den der Aufruf der Methode eingebettet ist, zurückzugeben.

    2. Variante: Diese besitzt drei Parameter: z1, z2 und z3 vom Typ int. Entsprechend zur ersten Variante besteht die Aufgabe der Methode wieder darin, die in diesen Parametern übergebenen Werte zu addieren und das Ergebnis mit return an die Aufrufumgebung zurückzugeben.

    3. Wie oben angegeben, besitzen beide Varianten den gleichen Methodennamen.

      Testen Sie die Varianten der Methode in Ihrem Hauptprogramm durch das Übergeben einiger Zahlenwerte, wie z. B. 1, 2, 3 usw. als Parameterwerte und das Ausgeben der jeweils berechneten Methodenwerte.

    4. Variante: Erweitern Sie Ihre Lösung um eine weitere gleichen Namens. Diese besitzt nur einen Parameter: ein Feld z[] von Integer-Zahlen. Die Methode liefert die Summe der Feldelementwerte an die Aufrufumgebung zurück.

      Testen Sie die Variante der Methode in Ihrem Hauptprogramm durch das Übergeben eines Felds als Argument.

Aufgabe 2: Wert- und Referenzparameter

Testen Sie die drei unterschiedlichen Varianten der Methode in Ihrem Hauptprogramm durch Übergeben einiger Zahlenwerte. Im Fall der 2. Variante müssen sie hierfür zwei Objekte vom Typ IntVal instanzieren. Geben Sie die Zahlenwerte in den übergebenen Variablen jeweils vor und nach dem Methodenaufruf aus. Was stellen Sie dabei fest und wie lässt sich das Verhalten jeweils erklären?

Aufgabe 3: Containerobjekt

Erweitern Sie Ihr Programm um eine neue Java-Datei mit dem Namen NumberContainer.java, die die Definition einer Klasse NumberContainer enthält. Die Klasse soll über vier public-Klassenvariablen verfügen, die Speicherplätze für max. drei zu sortierende int-Werte bieten. In der vierten Variable wird die Anzahl der in der Klasse tatsächlich gespeicherten Zahlenwerte abgelegt.

class NumberContainer {  

  public int ...

  NumberContainer() {
    // Alle Klassenvariablen mit 0 initialisieren
  }

  NumberContainer(int num1, int num2) {
    // Klassenvariablen mit num1 und num2 
    // initialisieren
  }
	
  NumberContainer(int num1, int num2, int num3) {
    // Klassenvariablen mit num1 bis num3 initialisieren
  }
}

Statten Sie ihre Klasse mit drei überladenen Konstruktoren aus, mit denen sich bei der Instanzierung der Klasse 0, 2 oder 3 umzudrehende Zahlenwerte übergeben lassen. Werden bei der Instanzierung keine Werte übergeben, so initialisiert der zugehörende Konstruktor alle Variablen mit dem Wert 0.

Eine Instanz dieser Klasse stellt nun im Hauptprogramm das Objekt dar, mit dem die umzudrehenden Zahlen an eine passend definierte reverse-Methode übergeben werden können.

Fügen Sie Ihrer Array-Klasse diese neue Variante der Methode reverse hinzu, bei der die Zahlen mit Hilfe eines NumberContainer-Objekts an die Methode übergeben werden. Die Methode liest zunächst die Anzahl der zu verarbeitenden Zahlenwerte aus und behandelt dann den passenden der zwei möglichen Fälle (2 oder 3 übergebene Zahlen). Die Zahlenwerte werden nach dem Umdrehen in das NumberContainer-Objekt zurückgeschrieben und nicht mit println() auf die Konsole ausgegeben. Ausgegeben werden Sie im Hauptprogramm und zu diesem Zweck aus dem Objekt ausgelesen.

Testen Sie die unterschiedlichen Varianten der Methode wieder in Ihrem Hauptprogramm durch Übergeben von zwei verschiedenen NumberContainer-Objekten, die mit einigen Zahlenwerten initialisiert wurden. Geben Sie die Zahlenwerte aus den NumberContainer-Objekten jeweils nach dem Aufruf der Methode reverse in das Ausgabefenster aus.

Wird ein Objekt an eine Methode übergeben, so geschieht dies genauso durch call by value, wie bei primitiven Datentypen. Der Datenwert wird also kopiert. Bei einem primitiven Datentyp, wie z. B. int, ist dies ein Zahlenwert. Bei einem Objekt ist dies die Adresse des Objekts im Hauptspeicher. Über diese Adresse ist es möglich, auf das Objekt zuzugreifen und in dessen öffentlich zugängliche Klassenvariablen zu schreiben sowie öffentlich zugängliche Methoden aufzurufen. Bei Objekten haben wir also trotz des call by value-Prinzips die Möglichkeit, das Objekt abzuändern bzw. dieses in einen neuen Zustand zu versetzen.

Aufgabe 4: Containerobjekt als Rückgabewert

Objekte können nicht nur als Parameterwert übergeben, sondern auch als Rückgabewert von einer Methode geliefert werden. Dies können wir nutzen, um das NumberContainer-Objekt, in welchem die zu sortierenden Zahlenwerte an die Methode übergeben werden, unverändert zu lassen. Anstatt die umgedrehten Zahlen in dieses Objekt zu schreiben, können wir in der Methode ein neues NumberContainer-Objekt anlegen, dieses mit den Werten füllen und eine Referenz auf dieses Objekt an das Hauptprogramm zurückgeben.

Erweitern Sie Ihre Array-Klasse um die Methode
static NumberContainer reverseReturn(NumberContainer n).
Diese leistet dasselbe wie die Methode aus der vorigen Aufgabe. Im Unterschied zu dieser werden die umgedrehten Zahlenwerte in einem neuen NumberContainer-Objekt gespeichert, welches im Rumpf der Methode erzeugt und einer Variable, z. B. mit dem Namen newnc, zugewiesen wird. Der Wert der Variable, der einer Referenz auf das Objekt entspricht, wird dann mit return an das Hauptprogramm geliefert und dort wieder in einer passenden Variable abgelegt.

Rufen Sie die neue Methode in ihrem Hauptprogramm mit einem NumberContainer, der ein paar Zahlenwerte enthält, auf. Lesen Sie dann die umgedrehten Zahlenwerte aus dem zurückgegebenen Objekt aus und geben Sie diese in der üblichen Weise in das Ausgabefenster aus.

Aufgabe 5: Glühbirnen vergleichen

Erweitern Sie die LightBulb-Klasse aus dem Fach Programmieren 1, wie auf den Vorlesungsfolien beschrieben, durch folgende Eigenschaften:

Schreiben Sie ein Hauptprogramm, in dem zwei Glühbirnen gleicher Farbe erzeugt werden. Vergleichen Sie zunächst mit == die Referenzen der Glühbirnen miteinander und danach die Objekte durch Aufruf der equals-Methoden. Der erste Vergleich sollte false liefern und der zweite true. Geben Sie die Vergleichsergebnisse in das Ausgabefenster aus.

Farbe Glühbirne 1: rot
Farbe Glühbirne 2: rot
Gleiche Objekte: false
Objekte mit gleichen Eigenschaften: true