2012-09-23 46 views
0

我试图与已经被拷贝构造改性的新对象设定我在Object2的向量位置1。矢量对象,使用setElementAt /设置

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后,对象2得到了相同的数据

object2= new Generic(object1); 
    myVector.setElementAt(object2, 1); 

不过,我想下面的代码应与上述相同,但它确实不会给我与object1相同的数据(只是获取object1的默认值)

myVector.setElementAt(new Generic(object1), 1); 

第二个问题怎么解决?

+1

你是什么意思“获得尽可能object1相同的价值观”和“第二个不工作”是什么意思?假设'new Generic(object1)'是一个无状态的构造函数,那么这两个代码片段应该是相同的(模仿将一个值赋给'object2'的副作用)。 –

+0

请提供更多代码。有没有隐式投射? – emesx

+0

对不起人人,添加了更多代码 – Dog

回答

1

特德·霍普在他的评论中写道,这两个变体,除了第二个变体不新的值赋给object2相同。

我认为你是不知道的事实,在Java中引用始终被复制(不是引用的对象,而是引用本身):调用myVector.add(object2);后,您object2并在矢量的第二个元素是独立的,除了引用同一个对象。

这意味着,如果你改变物体本身(如呼叫object2.setValue("foo");这既影响,object2和你的矢量的第二个元素(因为它们引用到同一个对象)。但是,如果你设置其它/新的对象作为载体的第二个元素,object2仍然指向旧的,所以object2和你的矢量的第二个元素是完全独立的。

我希望这有助于:-)


作为一个方面说明:您应该使用List<Generic> myList = new ArrayList<Generic>();,除非您需要同步Vector规定。