Java 如何制作类实例的副本

Java 如何制作类实例的副本,java,Java,您好,我正在用java进行一个项目,我需要这样做: 这就是问题所在(使用psuedo类名) 然后我想创建该变量的备份副本,以便在调用 class1.removeString(); 我可以访问副本并执行以下操作 class1=copyVar; 并且class1.getString()仍然等于“test” 很抱歉,我知道这是一个noob问题,我从未真正学会如何做到这一点。Java中没有通用的内置方法来复制对象 您可以得到的最接近的克隆方法是可克隆的,但您必须自己实现它。您需要重写object的克隆

您好,我正在用java进行一个项目,我需要这样做: 这就是问题所在(使用psuedo类名)

然后我想创建该变量的备份副本,以便在调用

class1.removeString();
我可以访问副本并执行以下操作 class1=copyVar; 并且class1.getString()仍然等于“test”
很抱歉,我知道这是一个noob问题,我从未真正学会如何做到这一点。

Java中没有通用的内置方法来复制对象


您可以得到的最接近的克隆方法是可克隆的,但您必须自己实现它。

您需要重写object的克隆方法,以便在调用

MyClass class2 = class1.clone();

你把班上所有的数据都抄出来。这通常是通过对类中的每个其他对象递归调用clone并将其分配给一个新实例来实现的。

可能相关:@HovercraftFullOfEels看起来像OP想要此
MyClass class1
实例的状态副本,然后相应地修改
class1
的状态,然后从副本中恢复
class1
的状态。实际上不建议使用
clone()
,主要是因为设计被破坏了。至少Josh Bloch建议改用复制构造函数——这不像你可以在一个不可显式克隆的对象上使用
clone()
,在这种情况下,大多数都会提供适当的复制构造函数。(这里数组可能是个例外。)有趣的一点是,我没有意识到object的clone()方法受到保护,尽管我的建议不需要使用
Cloneable
接口。事实上,除了名称之外,它是一个复制构造函数,只是按照约定覆盖了克隆名称。我想如果有人真的想,他们可以创建自己的
Cloneable
接口(如果愿意,可以使用另一个名称),这就解决了Josh Bloch似乎所指的大问题,因为你不能拥有
Cloneable
对象数组并调用
clone()
。本质上,区分受保护的
对象.clone()
,以及“可克隆”对象公开的公共
clone()
方法很重要。后一种方法可以使用前一种方法进行初始浅拷贝,但不需要这样做。您也可以调用您的方法
deepCopy()
并调用
this.clone()
,或者调用它
clone()
,但为所有字段调用复制构造函数。Josh Bloch提到的另一个主要缺点是,实现公共的
clone()
会迫使所有继承类费心实现适当的深度复制语义。它们可能会,也可能不会,然后你得到一个frankenobject,它被部分深度复制,但在克隆之间共享了一堆其他可变字段。这是拷贝构造函数更好的地方,因为它至少可以让您安全地获得部分深度拷贝。(假设您不一定需要层次结构中的所有对象都是可克隆的。)这是一个不准确的描述。所有实现
Cloneable
的方法都意味着,如果您最终调用(使用
super
Object.clone()
方法,您将获得当前对象的逐字段浅拷贝,而不是您脸上的异常。如果您自己复制所有字段,则可以很好地公开
clone()
方法,而无需实现
Cloneable
。当然,由于您经常需要深入复制类中所有可变的内容,因此使用
Object.clone()
并没有多大帮助。@millimoose:这就是我的意思。您必须考虑克隆应该如何为您的类工作,并实现它。“实现”作为“编写一些代码”,而不仅仅是添加
实现可克隆的
。我同意你对另一个答案的评论,即Cloneable是一种过时的东西。底线:“Java中没有复制对象的通用内置方式。”
MyClass class2 = class1.clone();