2012-09-23 45 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規定。