2012-05-08 41 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

相关问题