在这个神奇的星球上,有这样一个群体,比较呆萌,天天沉浸在代码的世界。这个代码的世界里他们天天面向对象Coding,而且这个对象还会克隆,进行分身呢。
1、什么时候会用到Clone呢?
一般是想对一个对象进行处理,又想保留原有的数据进行接下来的操作,这时候就需要克隆了。好比来了一件事,复制一个分身,分身去处理;自身还是继续干自己的事,分身和自身的行为和状态互不干扰影响。
2、既然Clone这么有用,那如何实现Clone呢?
Java提供了一个Cloneable接口,这只是一个标示接口,没有定义方法,不写实现这个接口的话,克隆时会报异常CloneNotSupportedException。
需要覆盖Object类中的clone()方法,该方法是native修饰的。
定义一个女友类:Girl,很有钱有一辆Car,还是一个猫控,有一群猫咪。
Car类:
Cat类:
测试类:
我们可以看到,设置的Lucy和19岁没有生效,还是LiLi 18岁,设置的car和cat的属性值变化了。说明对象的非引用类型是成功复制的,而引用类型没有进行复制,还是一份。这种克隆称之为:浅克隆。
本来女友g挺有钱的,有一辆21万多的Audi;克隆后女友g2变没钱了,只有一辆QQ价值1.99元,容我哭会~~
那如何实现全部属性的克隆,让女友g2还是那么有钱呢? 这就需要实现对象的深度克隆了,简称:深克隆。
实现深克隆有以下方法:
a、所有引用类型属性实现Cloneable接口
b、利用序列化和反序列化实现
c、利用json实现
d、利用反射实现
3、实现深克隆:所有引用类型属性实现Cloneable接口
类Girl修改方法clone():
类Car和类cat实现Cloneable接口,重写方法clone():
再次运行测试类,结果如下:
有钱的女友LiLi成功复制了,还是有Audi车,还是那么有钱。
不过这种方法比较繁琐,不推荐。
4、实现深克隆:利用序列化和反序列化实现
类Girl、Car、Cat实现Serializable接口;
添加方法deepCloneObject:
运行结果为:
已经成功深度克隆,这种方法比第一种简单很多,推荐使用。
5、实现深克隆:利用json实现
修改测试类,运行也是ok的
6、实现深克隆:利用反射实现
添加方法reflectClone():
实现深克隆的方式比较多,根据项目本身需要进行选择~~
欢迎朋友们关注转发点赞,谢谢~~
领取专属 10元无门槛券
私享最新 技术干货