我有2所列出并感到有点困惑添加对象到他们两个这样的:某对象插入2个集合
TestClass e;
List lst1;
LinkedList lst2;
...
lst1.add(e);
lst2.add(e);
威尔lst1
和lst2
有e
副本?或引用同一个对象e
?
如果第一个为真,如果TestClass
不可克隆,代码如何复制e
?
我有2所列出并感到有点困惑添加对象到他们两个这样的:某对象插入2个集合
TestClass e;
List lst1;
LinkedList lst2;
...
lst1.add(e);
lst2.add(e);
威尔lst1
和lst2
有e
副本?或引用同一个对象e
?
如果第一个为真,如果TestClass
不可克隆,代码如何复制e
?
请问
lst1
和lst2
有e
副本?
是。
这两个清单将有一个e
中包含的值的副本。 (注意虽然,e
包含参考而不是一个实际的对象。)
这意味着
两个列表将具有一个拷贝的每个参考TestClass
物体e
指在add
点。
对TestClass
对象的更改将从这两个列表引用中可见。
附加后执行e = null
不会影响列表的内容(列表包含副本,还记得吗?;-)
他们将有相同的参考。如果您希望它是2个不同的属性,则必须手动复制值。
我不认为OP想要 - 而只是想知道它是如何工作的。 –
第二个是正确的:两个集合都将持有对同一对象的引用。
这通过追溯到路过的老问题,通过参考VS传球值...
见本计算器question
两个lst1
和lst2
将包含一个值(由变量表示3210),它将告诉JVM如何在堆内存中找到TestClass
实例。如果通过访问e
,lst1
或lst2
来修改实例(只有一个实例),则所做的更改将在任何地方都可见!
改变这种行为的唯一方法是重写Object clone()
在TestClass
函数并传递e.clone()
到add(...)
功能。请指documentation
如果您不能修改TestClass
你也可以自己克隆实例的任何原因(主要是要实现clone()
外TestClass
)。使用new
运算符创建一个新的TestClass
实例e2
,然后通过它的'getters'获取它的实例变量(请注意它包含其他自定义对象),并从e
中将值设置为e2
。这是丑陋的,我希望你拒绝这么做...
+1是的 - 这在技术上更加正确。我认为OP在想“e”作为对象本身,实际上它是对象的地址 –