考虑以下代码:
DummyBean dum = new DummyBean();
dum.setDummy("foo");
System.out.println(dum.getDummy()); // prints 'foo'
DummyBean dumtwo = dum;
System.out.println(dumtwo.getDummy()); // prints 'foo'
dum.setDummy("bar");
System.out.println(dumtwo.getDummy()); // prints 'bar' but it should print 'foo'
所以,我想复制 dum
至 dumtwo
和改变 dum
不影响 dumtwo
. 但上面的代码并没有这样做。当我换衣服的时候 dum
,同样的变化也在发生 dumtwo
也。
我想,当我说 dumtwo = dum
,java只复制引用。那么,有没有办法创造一个新的 dum
并分配给 dumtwo
?
23条答案
按热度按时间hts6caw316#
在你的代码里:
u0njafvf17#
这是一个很好的解释
clone()
如果你最终需要它。。。这里:克隆(java方法)
nbnkbykc18#
如下所示:
无论你想在哪里得到另一个对象,简单的执行克隆。例如:
ctehm74n19#
创建副本构造函数:
每个对象都有一个克隆方法,可以用来复制对象,但不要使用它。创建类和执行不正确的克隆方法太容易了。如果你要这么做,至少读一下约书亚·布洛赫用有效的java语言对它所说的话。
gab6jxml20#
我使用google的json库对其进行序列化,然后创建序列化对象的新示例。它做深度复制有一些限制:
不能有任何递归引用
它不会复制不同类型的数组
数组和列表应该被类型化,否则它将找不到要示例化的类
您可能需要在自己声明的类中封装字符串
我还使用这个类来保存用户的首选项、窗口等,以便在运行时重新加载。它是非常容易使用和有效的。
6qftjkof21#
添加
Cloneable
和下面的代码用这个
clonedObject = (YourClass) yourClassObject.clone();
b4wnujal22#
使用
gson
用于复制对象。假设我有个目标
person
所以呢注意:性能要慢得多。
nwlls2ji23#
基本:java中的对象复制。
假设一个物体-
obj1
,它包含两个对象:containedobj1和containedobj2。浅复制:
浅复制创建新的
instance
并将所有字段复制到新示例并返回它。对象类提供clone
方法,并为浅层复制提供支持。深度复制:
当对象与其引用的对象一起复制时,会发生深度复制。下图显示
obj1
在对其执行深度复制之后。不仅有obj1
已复制,但其中包含的对象也已复制。我们可以用Java Object Serialization
做深度复制。不幸的是,这种方法也有一些问题(详细的例子)。可能的问题:
clone
很难正确实施。最好使用防御性复制、复制构造函数(如@egaga reply)或静态工厂方法。
如果你有一个对象,你知道它是公共的
clone()
方法,但您在编译时不知道对象的类型,那么您就有问题了。java有一个叫做Cloneable
. 实际上,如果我们想创建一个对象,就应该实现这个接口Cloneable
.Object.clone
是受保护的,所以我们必须用公共方法重写它才能访问它。另一个问题出现在我们尝试深度复制复杂对象时。假设
clone()
所有成员对象变量的方法也做深度复制,这是一个太冒险的假设。必须控制所有类中的代码。例如org.apache.commons.lang.serializationutils将具有使用序列化(source)进行深度克隆的方法。如果我们需要克隆bean,那么org.apache.commons.beanutils(源代码)中有几个实用方法。
cloneBean
将基于可用的属性getter和setter克隆bean,即使bean类本身没有实现cloneable。copyProperties
对于所有属性名称相同的情况,将属性值从源bean复制到目标bean。