# Referenztypen-Übungsaufgabe in OOP



## JKK (7. Dez 2020)

Hallo euch allen,

für diese Frage habe ich mich hier angemeldet (aber es werden sicherlich viele weitere folgen):

Ich studiere seit diesem Semester Informatik (neben meinem Master in Sozialwissenschaften) und dank Corona haben wir ein Onlinemodul, das uns die Programmierung beibringen soll. In diesem Modul war eine Übungsaufgabe:


```
class Name {
   String firstName;
   String surname;

   public void setFirstName (String firstName) {
      this.firstName = firstName;
   }

   public String getFirstName () {
      return this.firstName;
   }
}

...
Name obj = new Name();
obj.setFirstName("John");
Name obja = obj;
obja.setFirstName("Florian");
Name objb = obj;
Name objc = obja;
obja.setFirstName("Michel");
```

Die Aufgabe war, auszuwählen (Single Chioce), welchen Wert die Methoden obja.getFirstName, objb.getFirstName, objc.getFirstName liefern. Meine Annahme (Michel, John, Florian) war falsch. Offenbar liefern alle drei Methoden den Wert Michel.

Ich habe jetzt unterschiedliche Hypothesen aufgestellt, um mir das zu erklären (da ich meinen Denkfehler nicht finde), die aber z.T. unsinnig sind:
1) Es werden zuerst die Methodenzeilen des Programms und dann erst die Zuweisungen durchgeführt (was absolut doof wäre, spätestens bei einem mehrere hundert Zeilen langen Programm)

2) Über das _this _in der setter-Methode wird nicht das Attribut _firstName_ der einzelnen Variablen/Objekte adressiert, welchen gerade ein neuer Wert für ihr Attribut zugewiesen wird, sondern die Klasse. Ergo wird in der Klassendefinition diesem Attribut ein Wert zugewiesen, was sich dann nachträglich auf ALLE Objekte, die bereits aus dieser Klasse erzeugt wurden, überträgt (so eine Art "Generalschlüssel", um zeitgleich die Werte aller Objekte auf ein und denselben Wert zu setzen)

3) nur "obj" wurde als neues, eigenständiges Objekt mittels "new" erstellt- Ergo wurde den anderen Variablen(die halt Variablen, keine Objekte sind -> obja, objb, objc) nicht das das Attribut bzw. ein neuer Wert für das Attribut zugewiesen, sondern die Speicherstelle von obj, sodass in den Methoden erst obja/objb/objc als Variable abgerufen wurde, die nur als Verweis auf obj dient. Ergo wurde bei allen Zuweisungen nicht z.B. objc ein Wert zugewiesen, sondern obj, welches über den Inhalt der Variable objc "erreichbar" ist (im Rahmen der Zuweisung). Umgekehrt wird dann halt bei der getter-Methode immer der Wert von "obj" Aufgerufen über die Weiterleitungen durch die in den Variablen enthaltenen "Weiterleitungen"

Wenn alle drei Hypothesen Mist sind (was ich mir gut vorstellen kann): könnte mir jemand erklären, was der korrekte Gedankengang ist+(was mir helfen würde, das Problem nicht nur fachlich, sondern inhaltlich zu verstehen) Zeile für Zeile erklären, welche Werte sich wie verändern?

Ich danke euch jetzt schon einmal dafür, dass ihr euch die Zeit genommen habt, bis hierher zu lesen und eventuell sogar darüber nachdenkt, zu antworten


----------



## kneitzel (7. Dez 2020)

Also da ist nichts wirklich rund.
Der erste Wichtige Punkt ist: Java amcht extrem viel mit Werten. Also Aufrufe sind immer Call by Value. Bei so zuweisungen wird ein Wert kopiert.

Dann ist die Frage: Wie können wir uns eine Referenz vorstellen? Das ist wie ein Zettel, auf dem drauf steht, welche Instanz man gerade im Auge hat. Das kann ein leerer Zettel sein ("null") aber auch z.B. bei einer Referenz auf eine Geldbörse: "Das ist die Geldbörse die bei mir im Haus (mit genauer Adresse) in meinem Zimmer (klar beschrieben) auf meinem Schreibtisch liegt (ganz exakter Ort, also x mm vom rechten rand und y mm vom linken Rand)".

Dann kannst Du diese Referenz zuweisen. Das bedeutet aber: Das, was auf dem Zettel steht, wird kopiert.

Das heißt also: Referenz1 = Referenz2: Beide Variablen referenzieren das gleiche Objekt.

Also wie ein Auto, das an einer bestimmten Stelle steht:
Da ist ein Zettel mit Überschrift "Vorname" drin. Nun gibt es verschiedene Personen, die bekommen den Ort des Autos genannt. Und jeder geht hin und radiert den Namen auf dem Zettel Vornamen aus und schreibt einen anderen Namen hin.
Der Name, der zuletzt drauf geschrieben wurde, der steht dann da.

(Wobei das mit dem Zettel auch nicht ganz stimmt, denn Strings sind auch nur Referenzen, d.h. auf dem Zettel steht nicht "Michel" sondern es ist nur eine Referenz auf ein "Michel" String vorhanden.)

So ist es also auch hier: Du hast nur eine einzige Instanz von Name.
Diese Instanz wird dann in diversen Variablen Referenziert. Aber es ist immer die gleiche Instanz.

Daher ist dann die letzte Zuweisung in der Instanz gespeichert. Und das ist nun einmal "Michel".

Was Du in 2 angesprochen hast, das gibt es teilweise auch: Klassenvariablen. Das wäre aber nicht "this" - this ist die aktuelle instanz innerhalb einer Instanz-Methode. Klassenvariablen wurden hier aber nicht verwenden (wären durch das static Schlüsselwort erkennbar).


----------



## JKK (7. Dez 2020)

Danke dir @kneitzel, dann habe ich das Problem verstanden


----------

