1

所以我主要用 C++ 编程,而 Java 与 C++ 非常相似。我已经创建了一个列表命令

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

其中 Item 是一个基本上存储数据的自定义类。我从文本文件中获取信息并将其存储到 Item。然后我使用 stuff.add 来获取项目类。之后我使用命令删除项目类中的所有数据,并看到它也删除了列表中的所有数据。基本上我想知道是否有办法添加类的副本而不是类本身的地址。

编辑:所以我发现重新初始化项目类也解决了我的问题,谢谢。

4

2 回答 2

1

您想在将项目添加到列表之前对其进行克隆。该列表仅包含对您创建的原始项目的引用。因此,当您改变您的项目时,列表中的项目也会受到影响(它是同一个对象)。

如果您想“断开”您放入列表中的项目,那么您可以先克隆它。您的项目类将需要实现Cloneable并覆盖该clone()方法。如果您在 Item 中只有原语,那么您可以简单地执行以下操作:

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

如果您在 Item 中有其他对象,则默认克隆操作只会制作浅拷贝,您需要使您的克隆方法更广泛,以便它制作深拷贝。来自 Object.clone() 的 Javadoc:

按照惯例,此方法返回的对象应独立于此对象(正在克隆)。为了实现这种独立性,可能需要在返回 super.clone 之前修改对象的一个​​或多个字段。通常,这意味着复制任何包含被克隆对象的内部“深层结构”的可变对象,并将对这些对象的引用替换为对副本的引用。如果一个类只包含原始字段或对不可变对象的引用,那么通常情况下 super.clone 返回的对象中不需要修改任何字段。

于 2012-05-08T01:01:59.867 回答
1

在 Java 中,对象引用的作用类似于 C++ 中的指针。没有“复制构造函数”的概念。当您将某些内容添加到列表中并在将其添加到列表后更改该项目时,您已经注意到了这一点。

通常,在 Java 中,每次向列表中添加一个新条目时,您都会使用它new来创建一个新条目。Item所以像:

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

而不是

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

上面的第二个示例将多次将相同的对象添加到列表中。

于 2012-05-08T01:03:22.380 回答