Der beste Weg, dies zu verstehen, ist zu verstehen, was Variablen sind; Variablen sind, einfach gesagt, Platzhalter, die Werte halten.
Also was genau ist dieser Wert? Bei einem Referenztyp ist der in der Variablen gespeicherte Wert die Referenz (die Adresse sozusagen) zu einem gegebenen Objekt. Bei einem Werttyp ist der Wert das Objekt selbst.
Wenn Sie AnyType y = x;
tun, was wirklich passiert ist, dass eine Kopie des gespeicherten Wertes in x
hergestellt und dann in y
gespeichert.
Wenn also x
ein Referenztyp ist, zeigen sowohl x
als auch y
auf dasselbe Objekt, da beide identische Kopien der gleichen Referenz enthalten. Wenn x
ein Werttyp ist, dann werden sowohl x
als auch y
zwei identische, aber verschiedene Objekte enthalten.
Sobald Sie das verstanden haben, sollte es Sinn machen, warum Ihr Code sich so verhält wie er.Lets study es Schritt für Schritt:
Person person_1 = new Person();
Ok wir erstellen eine neue Instanz eines Werttyps. Nach dem, was ich zuvor erklärt habe, speichert der Wert in person_1
das neu erstellte Objekt selbst. Wenn dieser Wert gespeichert wird (Heap oder Stack), handelt es sich um ein Implementierungsdetail, das überhaupt nicht relevant ist, wie sich der Code verhält.
person_1.name = "Person 1";
Jetzt setzen wir die Variable name
, die ein Feld von person_1
sein geschieht. Der Wert von name
ist wiederum eine Referenz, die auf irgendwo im Speicher zeigt, wo die string "Person 1"
gespeichert ist. Auch hier ist der Wert oder die Zeichenfolge irrelevant.
Person person_2 = person_1;
Ok, das ist der interessante Teil. was geschieht hier? Nun, eine Kopie des in person_1
gespeicherten Wertes wird gemacht und in person_2
gespeichert. Da der Wert eine Instanz eines Werttyps ist, wird eine neue Kopie dieser Instanz erstellt und in person_2
gespeichert. Diese neue Kopie hat ihr eigenes Feld name
und der in dieser Variablen gespeicherte Wert ist wiederum eine Kopie des in person_1.name
gespeicherten Wertes (eine Referenz auf "Person 1"
).
person_2.name = "Person 2";
Nun werden wir einfach die Variable person_2.name
neu zuweisen. Dies bedeutet, dass wir eine neue Referenz speichern, die auf eine neue string
irgendwo im Speicher verweist. Zu beachten ist, dass person_2.name
ursprünglich ein kopieren des Wertes gespeichert in person_1.name
so gehalten, was auch immer Sie tun, um person_2.name
keine Wirkung auf den Wert, in person_1.name
gespeichert wird, weil Sie einfach ändern ... ja genau, ein kopieren. Und deshalb verhält sich Ihr Code so, wie er es tut.
Als Übung versuchen Sie auf ähnliche Weise, wie sich Ihr Code verhalten würde, wenn Person
ein Referenztyp wäre.
Ich bin ... verwirrt aswell ... Sie setzen buchstäblich die Werte der Namen, richtig? Was ist dann falsch mit dem Ergebnis? –
@IanH OP verwirrend, wenn die Referenz mutiert wird (wodurch sie sich vollständig auf ein anderes Objekt bezieht), wenn das Objekt, auf das sich die Referenz bezieht, mutiert wird. String ist ein schlechtes Beispiel, weil es unveränderlich ist. –
@RaymondChen Ah, ich denke, ich bekomme es wissen, danke :) –