在 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),并不意味着当一个引用的值发生变化时(即它被分配内存中的不同值),另一个的值也必须改变。
这是对象和引用之间的重要区别。