Nead wyjaśnienie dla następującego kodu:
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);
To zostanie wydrukowane w B
taki sposób, że dowody sample
i referToSample
obiekty odnoszą się do tego samego odniesienia do pamięci.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
sample.append("A");
referToSample.append("B");
System.out.println(referToSample);
Spowoduje to wydrukowanie, AB
które również dowodzi tego samego.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
referToSample.append("A");
System.out.println(sample);
Oczywiście to się wyrzuci, NullPointerException
ponieważ próbuję wywołać append
odwołanie zerowe.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
sample.append("A");
System.out.println(sample);
Więc oto moje pytanie, dlaczego ostatni przykład kodu nie jest rzucany, NullPointerException
ponieważ to, co widzę i rozumiem z pierwszych dwóch przykładów, to jeśli dwa obiekty odnoszą się do tego samego obiektu, to jeśli zmienimy jakąkolwiek wartość, to również odbije się to na innej, ponieważ oba wskazują to samo odniesienie do pamięci. Dlaczego więc ta zasada nie ma tutaj zastosowania? Jeśli przypiszę null
do referToSample, sample również powinno mieć wartość null i powinno zgłaszać wyjątek NullPointerException, ale go nie zgłasza, dlaczego?
sample
jest nadalsample
. Tylko się zmieniłeśreferToSample
.