2012-05-08 44 views
1

所以我主要用C++編程,而java與C++非常相似。 我創建了一個列表命令,這樣java list can not add class then alter original class without change the copy from the list

List<Item> stuff =new ArrayList<Item>(); 

,其中項目是一個自定義類,基本上存儲數據。 我從文本文件中獲取信息並將其存儲到項目。 然後我使用stuff.add來獲取物品類的東西。 之後我使用一個命令擦除項目類中的所有數據,並查看它也刪除了列表中的所有數據。 基本上我想知道是否有方法添加類的副本而不是類本身的地址。

編輯: 所以我發現重新初始化的項目類也解決了我的問題,謝謝。

+0

它可能有助於將每個java對象視爲指向C++對象的指針。 – trutheality

回答

1

您想在將項目添加到列表之前克隆該項目。該列表只有參考到您創建的原始項目。因此,當你改變你的項目時,列表中的項目也會受到影響(這是同一個對象)。

如果您想「斷開」您放入列表中的物品,那麼您可以先將它放入clone。您的物品類需要實施Cloneable並覆蓋clone()方法。如果你有項目只有元,那麼你可以簡單地做:

public Object clone() 
{ 
    return super.clone(); 
} 

如果你在項目的其他對象,那麼默認的克隆操作只會讓淺拷貝,你將需要使你的克隆方法更廣泛,以至於它使深拷貝。從Object.clone()的Javadoc:

按照慣例,此方法返回的對象應該獨立於此對象(正在克隆)。爲了實現這種獨立性,可能有必要在返回之前修改super.clone返回的對象的一個​​或多個字段。通常,這意味着複製包含被克隆對象的內部「深層結構」的任何可變對象,並將這些對象的引用替換爲對這些副本的引用。如果一個類只包含原始字段或對不可變對象的引用,那麼通常情況下,super.clone返回的對象中的字段不需要修改。

1

在Java中,對象引用的作用類似於C++中的指針。沒有「複製構造函數」的概念。當您向列表添加內容並在將其添加到列表之後更改該項目時,您已經注意到了這一點。

通常在Java中,您將使用new創建一個新的Item,每次向列表中添加一個新的。因此,像:

while (...) { 
    Item i = new Item(...); 
    stuff.add(i); 
} 

而不是

Item i = new Item(); 
while (...) { 
    i.foo = ...; 
    stuff.add(i); 
} 

的第二個例子將相同對象多次添加到列表中。

+0

像C++中的指針:)?褻瀆!:) – ScarletAmaranth

+0

當然,有一個「複製構造函數」的概念,你只需要明確地實現和調用它:Item x = new Item(y);''y'是'Item'; – trutheality

相關問題