Object.clone的理解
通过实现Cloneable
接口和重写clone
方法可以实现拷贝对象。
这里clone
方法实现的是浅拷贝,即字段只是复制相应的引用。如下示例中所示,对象a
进行克隆之后得到一个新对象aClone
,而a.b
和aClone.b
其实是同一个对象。
class CloneTest {
static class A implements Cloneable {
B b = new B();
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return b.name;
}
}
static class B {
String name = "bob";
}
public static void main(String[] args) throws Exception {
A a = new A();
A aClone = (A) a.clone();
System.out.println(a);
System.out.println(aClone);
a.b.name = "alice";
System.out.println(a);
System.out.println(aClone);
}
输出:
bob
bob
alice
alice
如何实现深拷贝?
1. 序列化
通过实现Serializable接口或者通过json将对象序列化,再反序列化为对象。
这么做的缺点在于,就是如果通过Serializable进行序列化,那么类的所有成员都必须实现Serializable接口才行;如果通过json序列化,那么会面临循环引用的问题。
2. 反射
通过反射可以获取对象的所有字段并进行递归克隆。这种方式的难点在于如何处理不包含无参构造方法的类对象。
3. 其他方式
目前看到的其他方式,诸如覆写clone
方法等,均无实操意义,不提。
网友评论