Присваивание переменных объектных ссылок

При выполнении присваивания переменные объектных ссылок действуют иначе, чем можно было бы представить. Например, какие действия, по вашему мнению, выполняет следующий фрагмент?

Box b1 = new Box ();
Box b2 = b1;

Можно подумать, что переменной b2 присваивается ссылка на копию объекта, на которую ссылается переменная b1. То есть может показаться, что b1 и b2 ссылаются на отдельные и различные объекты. Однако это не так. После выполнения этого фрагмента кода обе переменные b1 и b2 будут ссылаться на один и тот же объект. Присваивание b1 переменной b2 не привело к распределению какой-то памяти или копированию какой-либо части исходного объекта. Эта операция присваивания приводит лишь к тому, что переменная b2 ссылается на тот же объект, что и переменная b1. Таким образом, любые изменения, выполненные в объекте через переменную b2, окажут влияние на объект, на который ссылается переменная b1, поскольку это — один и тот же объект.

Эта ситуация отражена на рис. 6.2.

Использование переменных объектных ссылок

Рис. 6.2. Использование переменных объектных ссылок

Хотя и b1 и b2 ссылаются на один и тот же объект, эти переменные не связаны между собой никаким другим образом. Например, следующая операция присваивания значения переменной b1 просто разорвет связь переменной Ы с исходным объектом, не оказывая влияния на сам объект или на переменную b2:

Box b1 = new Box () ;
Box b2 = b1;
// ...
b1 = null;

В этом примере значение b1 установлено равным null, но переменная b2 по-прежнему указывает на исходный объект.

Помните! Присваивание ссылочной переменной одного объекта ссылочной переменной другого объекта не ведет к созданию копии объекта, а лишь создает копию ссылки.