将上述代码修改下,重写clone方法:
public class Address implements Cloneable{ private String province; private String city; private String area; //省略构造函数和setter/getter @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } class User implements Cloneable{ private String name; private String password; private HomeAddress address; //省略构造函数和setter/getter @Override protected Object clone() throws CloneNotSupportedException { User user = (User)super.clone(); user.setAddress((HomeAddress)address.clone()); return user; } }之后,在执行一下上面的测试代码,就可以发现,这时候newUser中的address对象就是一个新的对象了。
这种方式就能实现深拷贝,但是问题是如果我们在User中有很多个对象,那么clone方法就写的很长,而且如果后面有修改,在User中新增属性,这个地方也要改。
那么,有没有什么办法可以不需要修改,一劳永逸呢?
2、序列化实现深拷贝我们可以借助序列化来实现深拷贝。先把对象序列化成流,再从流中反序列化成对象,这样就一定是新的对象了。
序列化的方式有很多,比如我们可以使用各种JSON工具,把对象序列化成JSON字符串,然后再从字符串中反序列化成对象。
如使用fastjson实现:
User newUser = JSON.parseObject(JSON.toJSONString(user), User.class);也可实现深拷贝。
除此之外,还可以使用Apache Commons Lang中提供的SerializationUtils工具实现。
我们需要修改下上面的User和Address类,使他们实现Serializable接口,否则是无法进行序列化的。
class User implements Serializable class Address implements Serializable然后在需要拷贝的时候:
User newUser = (User) SerializationUtils.clone(user);同样,也可以实现深拷贝啦~!