首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我的对象Girl会分身

在这个神奇的星球上,有这样一个群体,比较呆萌,天天沉浸在代码的世界。这个代码的世界里他们天天面向对象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():

实现深克隆的方式比较多,根据项目本身需要进行选择~~

欢迎朋友们关注转发点赞,谢谢~~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200719A0KZY000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券