Прояснение Nead для следующего кода:
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);
Это напечатает B
, чтобы доказать, что объекты sample
и referToSample
относятся к одной и той же ссылке на память.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
sample.append("A");
referToSample.append("B");
System.out.println(referToSample);
Это будет печатать AB
, что также доказывает то же самое.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
referToSample.append("A");
System.out.println(sample);
Очевидно, что это вызовет NullPointerException
, потому что я пытаюсь вызвать append
по нулевой ссылке.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
sample.append("A");
System.out.println(sample);
Итак, вот мой вопрос: почему последний пример кода не бросает NullPointerException
, потому что то, что я вижу и понимаю из первых двух примеров, - это если два объекта ссылаются на один и тот же объект, то, если мы изменим какое-либо значение, то оно также будет отражать другое, потому что оба указывают на одну и ту же память. Так почему же это правило не применяется здесь? Если я назначу null
на referToSample, тогда образец также должен быть пустым, и он должен вызывать исключение NullPointerException, но он не выбрасывает его, почему?