1、实现Cloneable接口表明该类的对象是允许克隆的。

2、允许克隆的意思是:可以调用clone()方法。

3、深拷贝还是浅拷贝,取决于如何重写Object的clone()方法。

4、原对象和克隆对象的关系:

深拷贝:阳关道和独木桥;

浅拷贝:藕断丝连。

上面的第二点解释一下,如果没有实现Cloneable就调用clone()方法,会抛出异常。看下Object源码就知道了:

1 protected Object clone() throws CloneNotSupportedException {

2 if (!(this instanceof Cloneable)) {//这里会检查是否是Cloneable的实例

3 throw new CloneNotSupportedException(

4 "Class " + getClass().getName() +" doesn't implement Cloneable");

5 }

6

7 return internalClone();

8 }

下面举一个深拷贝的例子:

ArrayList的clone()方法:

1 //深拷贝

2 public Object clone() {

3 try {

4 ArrayList> v = (ArrayList>) super.clone();

5 //新开辟一个内存空间给ArrayList的对象成员Object[] elementData;

6 v.elementData = Arrays.copyOf(elementData, size);

7 v.modCount = 0;

8 return v;

9 } catch (CloneNotSupportedException e) {

10 // this shouldn't happen, since we are Cloneable

11 throw new InternalError(e);

12 }

13 }

14 //transient Object[] elementData;

这样得到新的ArrayList对象,则是一个完全独立的对象,包括对象属性成员和原来对象没有任何联系。你走你的阳关道,我走我的独木桥,你以后做什么事都影响不了我。这就是深拷贝。

如果把上面的深拷贝改成浅拷贝,将会变成:

1 //浅拷贝

2 public Object clone() {

3 try {

4 ArrayList> v = (ArrayList>) super.clone();

5 //有公用的对象成员elementData,它就是连接两个对象的罪魁祸首。

6 v.elementData = elementData;

7 v.modCount = 0;

8 return v;

9 } catch (CloneNotSupportedException e) {

10 // this shouldn't happen, since we are Cloneable

11 throw new InternalError(e);

12 }

13 }

14 //transient Object[] elementData;

使用上面这个浅拷贝的clone()方法,原对象和克隆对象各自的对象成员elementData指向同一块内存地址,藕断丝连,相互影响着。你受伤了,我就难过;你过的开心,我就默默祝福你;你想我的时候,我也在想你。这就是浅拷贝。

补充:如果A的对象成员属性是自己定义的类型(记为B),A想要深拷贝,需要依靠B的深拷贝clone()方法。

java cloneable_java开发——Cloneable接口、clone()方法和深浅拷贝相关推荐

  1. java的cloneable_Java的Cloneable接口和clone方法

    1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...

  2. Java中的Cloneable接口

    1.Cloneable接口的作用 Cloneable是标记接口(其方法体为空),它用来表示一个类拥有某些希望具有的特征.实现Cloneable接口的类被标记为可克隆的,而且其对象可以使用Object类 ...

  3. java语言之Cloneable接口

    在我们学习过程中,会发现java很多非常重要的接口,比如Cloneable,Serializable,Comparable等等之类的,今天我就总结一下Cloneable接口. 我学习到现在觉得最好的学 ...

  4. java cloneable_java.lang.Cloneable的理解

    以前也用过这个接口,那时是直接所有的东西都自己写了,也没发现问题.最近无意间发现这个接口的实现并不是想象中的那样,所以稍微研究了下,给大家分享一下. 步骤:1.建立两个简单的POJO:Teacher和 ...

  5. java.util.enummap_java.util.EnumMap.clone()方法实例

    全屏 java.util.EnumMap.clone()方法返回此枚举映射的副本. 声明 以下是java.util.EnumMap.clone()方法的声明public EnumMap clone() ...

  6. java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function

    文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...

  7. java函数式编程之接口Default方法五

    2019独角兽企业重金招聘Python工程师标准>>> 之前看一段java8的代码,发现接口都可以实现方法了,当然在老的教程里面是会告诉我们接口只是定义了方法的,为什么Java8要这 ...

  8. java如何开发webservice接口

    本次项目需求要改造一个现有的webservice接口,增加参数:这里先简略记录一下开发步骤. 至于webservice是什么,就暂时不谈了. 1.首先,从需求文档中找到目标接口url,以及方法名met ...

  9. 详解Java中的clone方法 -- 原型模式

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

最新文章

  1. 【数据结构】邻接表的储存结构 建立图的邻接表算法
  2. SIGIR 2019 开源论文 | 基于图神经网络的协同过滤算法
  3. android7.0 拦截短信,变化很大!微信安卓版7.0.17内测体验
  4. redis StackExchange 主备 实现 demo
  5. java request 封装对象_java通过request自动封装复杂对象
  6. 分布式配置中心之 —— nacos使用详解
  7. 李子奈计量经济学笔记和课后习题答案
  8. matlab如何用二分法求函数零点,如何用二分法求函数的“零点”的近似值
  9. 金蝶软件常用基础SQL数据表
  10. phpstudy 自定义php,phpstudy 自定义php版本
  11. 制作U盘PE启动盘安装Windows系统
  12. Python Selenium 疑难杂症解方(二): 定位
  13. 基于java的学生社团管理系统的研究设计计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  14. 新年第一天 | 恶补新一季《黑镜》的同时,营长又深入扒了扒它那擅长机器学习的新爸爸是如何赚钱的
  15. 金明的预算方案(01背包)
  16. crm day03 创建市场活动
  17. SQL入门之第二一讲——IF函数的使用
  18. 玩转5G之--初探5G网络模型(OSI模型和TCP/IP模型)
  19. python打印电子标签--ghostscript 和reportlab实现
  20. python 查询周数 week number

热门文章

  1. 激光安全防护眼镜的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. 【计算机英语】23年1月份计算机学习过程中的单词汇总
  3. Activate注解
  4. 大众点评App的短视频耗电量优化实战,android应用案例开发大全第4版
  5. 趣图:新手使用 C++ 指针时
  6. 2021年计算机二级考试题,2021年计算机等级考试题目及答案.doc
  7. 寻找阿登高地——爬虫工程师如何绕过验证码
  8. VUE ----父子组件通信
  9. c语言修仙番外txt,C语言修仙
  10. win10 第一次开机卡死强制关闭第二次开机才正常