Nead Klarstellung für folgenden Code:
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);
Dies wird gedruckt, B
so dass Beweise sample
und referToSample
Objekte auf dieselbe Speicherreferenz verweisen.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
sample.append("A");
referToSample.append("B");
System.out.println(referToSample);
Dies wird gedruckt AB
, was auch das gleiche beweist.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
referToSample.append("A");
System.out.println(sample);
Offensichtlich wird dies werfen, NullPointerException
weil ich versuche, append
eine Nullreferenz aufzurufen .
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
sample.append("A");
System.out.println(sample);
Hier ist meine Frage, warum das letzte Codebeispiel nicht ausgelöst wird, NullPointerException
denn was ich aus den ersten beiden Beispielen sehe und verstehe, ist, wenn zwei Objekte auf dasselbe Objekt verweisen und wenn wir einen Wert ändern, wird es auch auf andere reflektiert, weil beide auf zeigen gleiche Speicherreferenz. Warum gilt diese Regel hier nicht? Wenn ich null
referToSample zuweise, sollte sample ebenfalls null sein und eine NullPointerException auslösen, aber es wird keine ausgelöst. Warum?
sample
und referToSample
als Objekte, aber sie sind keine Objekte, sondern Variablen. Eine Variable kann einen Verweis auf ein Objekt enthalten, ist jedoch selbst kein Objekt. Es ist eine subtile Unterscheidung, aber es ist im Grunde die Essenz Ihrer Verwirrung.
volatile
, final
, =
, ==
...) bei der Anwendung auf eine Objektvariablen beeinflußt die Zeiger , nicht das Objekt , das es sich bezieht.
sample
ist immer nochsample
. Du hast dich nur verändertreferToSample
.