first
является ссылкой на объект типа StringBuilder
. То есть first
хранит значение, которое можно использовать для ссылки на объект в куче, тип Stringuilder
. second
- это еще одна ссылка на объект типа StringBuilder
, и его значение изначально установлено как ссылка на тот же объект, на который ссылается first
.
Если вы измените значение first
, то, что вы делаете, это изменит референт. То есть вы используете first
для ссылки на другой объект. Это не влияет на second
; на его значение не влияют изменения значения first
. (Помните: значения first
и second
являются ссылками, которые изначально имеют один и тот же референт. Но так же, как с
int x = 1;
int y = x;
x = 2;
не меняет значение y
, изменение значения first
не меняет значение second
.
С другой стороны, когда first
и second
относятся к одному и тому же объекту, любые изменения этого объекта будут видны как через first
, так и second
.
Думайте об этом так. Допустим, я создаю текстовый файл first.html
, содержимое которого
<a href="http://stackoverflow.com">Stack Overflow</a>
и я выдаю команду copy first.html second.html
. Тогда обе страницы могут быть использованы для ссылки на одну и ту же веб-страницу; перейдя по ссылке, мы приходим к тому же референту. Если в домашнюю страницу Stack Overflow внесены изменения, то доступ к домашней странице через first.html
или second.html
позволит мне увидеть эти изменения. Но если я тогда изменю содержимое first.html
на
<a href="http://www.thedailywtf.com>The Daily WTF</a>
, тогда я больше не могу использовать first.html
для ссылки на домашнюю страницу переполнения стека. Более того, это изменение не влияет на значение second.html
. Это все еще
<a href="http://stackoverflow.com>Stack Overflow</a>
Думайте о содержимом этих файлов как о значениях ссылочного типа, а конечное назначение - как о ссылочном объекте.