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 Btaki sposób, że dowody samplei referToSampleobiekty 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, ABktó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, NullPointerExceptionponieważ próbuję wywołać appendodwoł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, NullPointerExceptionponieważ 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ę nulldo referToSample, sample również powinno mieć wartość null i powinno zgłaszać wyjątek NullPointerException, ale go nie zgłasza, dlaczego?




samplejest nadalsample. Tylko się zmieniłeśreferToSample.