我尝试将我的object2设置在矢量位置1,并使用一个已由复制构造函数修改过的新对象。
Generic object1 = new Generic();
//invoke the copy constructor of the Generic class
Generic object2 = new Generic(object1);
Vector<Generic> myVector = new Vector<Generic>();
myVector.add(object1);
myVector.add(object2);
当我为object1输入数据后,当我使用它时此代码有效,object2获得相同的数据
object2= new Generic(object1);
myVector.setElementAt(object2, 1);
但是,我认为下面的代码应该与上面的代码相同,但是它不会为我提供与object1相同的数据(只是获取了object1的默认值)
myVector.setElementAt(new Generic(object1), 1);
第二个为什么不起作用?
最佳答案
正如Ted Hopp在评论中所写,这两个变体是相同的,只是第二个变体没有为object2
分配新值。
我认为您不知道Java中的引用总是被复制的事实(不是引用的对象,而是引用本身):在调用myVector.add(object2);
之后,您的object2
和向量中的第二个元素是独立的,除了引用相同的对象。
这意味着如果您更改对象本身(例如,调用object2.setValue("foo");
会同时影响object2
和向量中的第二个元素(因为它们引用同一个对象)。但是,如果将另一个/新对象设置为向量的第二个元素object2
仍指向旧元素,因此object2
和向量中的第二个元素是完全独立的。
我希望这有帮助 :-)
附带说明:您可能应该使用List<Generic> myList = new ArrayList<Generic>();
,除非您需要Vector
提供的同步。