Nead Klarstellung für folgenden Code:
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);
Dies wird gedruckt, Bso dass Beweise sampleund referToSampleObjekte 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, NullPointerExceptionweil ich versuche, appendeine 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, NullPointerExceptiondenn 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 nullreferToSample zuweise, sollte sample ebenfalls null sein und eine NullPointerException auslösen, aber es wird keine ausgelöst. Warum?
sampleund referToSampleals 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.




sampleist immer nochsample. Du hast dich nur verändertreferToSample.