В Java (и, как я полагаю, в Groovy тоже) при передаче объекта вы передаете значение ссылки на него.
Так, например, когда вы делаете это:
Object reference1 = new Object();
// reference1 now equals some adress in memory, e.g. 0001
Object reference2 = reference1;
// reference2 now equals the value of reference1 - i.e. 0001
Теперь, когда мы делаем это:
reference1 = new Dog();
// reference1 is now assigned a new value, which is the memory adress
// of the new Dog object.
Нет никаких причин, чтобы это повлияло на reference2
. reference2
по-прежнему владеет адресом 0001
. И это именно то, что вы делаете.
Давайте посмотрим, что происходит в фрагменте кода, который вы разместили:
def object = null
Создается новая ссылка с именем object
, и ей не назначаются адреса, т. е. null
. (Объект не создается, только ссылка).
def map = [object: object]
Создается новая ссылка с именем map
. Ему назначается новый объект карты с записью с именем object
. Карте передается значение ссылки с именем object
.
Как вы помните, значение ссылки object
в настоящее время равно null
. Таким образом, это значение передается (то есть передается по значению) ссылке в объекте карты, который теперь также содержит null
.
object = new Object()
Ссылке object
в основной программе присваивается новое значение - новое Object
. Теперь он содержит адрес нового объекта, например. 0001
.
При этом вы ставите значение в переменную object
— вы ставите адрес объекта (где раньше было null
).
Если подумать, нет причин влиять на карту. На карте совсем другая ссылка. Просто потому, что ранее обе ссылки содержали одну и ту же адресную память, т. е. ссылались на один и тот же объект (или, в данном случае, ни на один объект, поскольку адрес был null
), не означает, что при изменении значения одной ссылки (т. е. присваивается другой значение в памяти), значение другого тоже должно измениться.
Это важное различие между объектом и ссылкой.
person
Aviv Cohn
schedule
15.08.2014