请考虑以下代码:
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'
Run Code Online (Sandbox Code Playgroud)
所以,我想复制dum到dumtwo并更改dum而不影响dumtwo.但上面的代码并没有这样做.当我改变某些内容时dum,也会发生同样的变化dumtwo.
我想,当我说dumtwo = dum,Java 只复制引用.那么,有没有办法创建一个新的副本dum并分配给它dumtwo?
如果Java类实现了Serializable接口但没有公共clone()方法,通常可以创建如下的深层副本:
class CloneHelper {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
T copy = (T) ois.readObject();
ois.close();
return copy;
} catch (ClassNotFoundException ex) {
// Shouldn't happen
throw new Error(ex);
} catch (IOException ex) {
// Probably a bug in T's custom serialization methods
throw …Run Code Online (Sandbox Code Playgroud)