如何在Java中创建对象的副本而非指针

10

假设我有一个创建的对象。我编辑了其中一些值,因此它与新的object()引用不同。我们称其为f1对象。现在我想要另一个名为f2的对象是f1的副本,但不是指针,这样当我改变f2中的值时,它不会同时改变f1。我应该如何在Java中实现这个目标?


1
这是一个与此问题重复的问题:https://dev59.com/eHNA5IYBdhLWcg3wrf43 - Chris Cooper
如果您的对象实现了Cloneable接口,我相信您可以使用clone方法来完成它。请访问http://download.oracle.com/javase/tutorial/java/IandI/objectclass.html获取更多信息。 - blong824
6个回答

20

首先,让你的类实现Cloneable接口。如果没有这个接口,调用对象的clone()方法会抛出异常。

接下来,重写Object.clone()方法以返回你特定类型的对象。实现可以简单地如下:

@Override
public MyObject clone() {
    return (MyObject)super.clone();
}

除非你需要完成更复杂的任务,否则只需调用 super.clone() 即可。

这将一直调用到 Object.clone(),它会将对象中的每个数据复制到构造的新对象中。引用被复制而非克隆,因此,如果你需要深度拷贝(对象的克隆),则需要在重写的 clone() 函数中进行一些额外的工作。


7

大多数对象都有一个方法clone(),它将返回该对象的副本,因此在您的情况下

f2 = f1.clone()

2

2
你使用 clone 方法。

0
据说使用内置的clone方法存在一些问题。因此,最好实现另一种克隆技术。
有一个 Java 库支持浅克隆和深克隆。它提供了无需实现 Serializable 的深度克隆功能。 这里

-3

你可以克隆,如果你不能克隆,你可以自己编写函数。

function (variable){
   clone = JSON.parse(JSON.stringify(variable))
   return clone;
}

问题是关于Java而不是JavaScript。 - Adam Kurkiewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接