java cloneable_java开发——Cloneable接口、clone()方法和深浅拷贝
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()方法和深浅拷贝相关推荐
- java的cloneable_Java的Cloneable接口和clone方法
1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...
- Java中的Cloneable接口
1.Cloneable接口的作用 Cloneable是标记接口(其方法体为空),它用来表示一个类拥有某些希望具有的特征.实现Cloneable接口的类被标记为可克隆的,而且其对象可以使用Object类 ...
- java语言之Cloneable接口
在我们学习过程中,会发现java很多非常重要的接口,比如Cloneable,Serializable,Comparable等等之类的,今天我就总结一下Cloneable接口. 我学习到现在觉得最好的学 ...
- java cloneable_java.lang.Cloneable的理解
以前也用过这个接口,那时是直接所有的东西都自己写了,也没发现问题.最近无意间发现这个接口的实现并不是想象中的那样,所以稍微研究了下,给大家分享一下. 步骤:1.建立两个简单的POJO:Teacher和 ...
- java.util.enummap_java.util.EnumMap.clone()方法实例
全屏 java.util.EnumMap.clone()方法返回此枚举映射的副本. 声明 以下是java.util.EnumMap.clone()方法的声明public EnumMap clone() ...
- java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function
文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...
- java函数式编程之接口Default方法五
2019独角兽企业重金招聘Python工程师标准>>> 之前看一段java8的代码,发现接口都可以实现方法了,当然在老的教程里面是会告诉我们接口只是定义了方法的,为什么Java8要这 ...
- java如何开发webservice接口
本次项目需求要改造一个现有的webservice接口,增加参数:这里先简略记录一下开发步骤. 至于webservice是什么,就暂时不谈了. 1.首先,从需求文档中找到目标接口url,以及方法名met ...
- 详解Java中的clone方法 -- 原型模式
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
最新文章
- 【数据结构】邻接表的储存结构 建立图的邻接表算法
- SIGIR 2019 开源论文 | 基于图神经网络的协同过滤算法
- android7.0 拦截短信,变化很大!微信安卓版7.0.17内测体验
- redis StackExchange 主备 实现 demo
- java request 封装对象_java通过request自动封装复杂对象
- 分布式配置中心之 —— nacos使用详解
- 李子奈计量经济学笔记和课后习题答案
- matlab如何用二分法求函数零点,如何用二分法求函数的“零点”的近似值
- 金蝶软件常用基础SQL数据表
- phpstudy 自定义php,phpstudy 自定义php版本
- 制作U盘PE启动盘安装Windows系统
- Python Selenium 疑难杂症解方(二): 定位
- 基于java的学生社团管理系统的研究设计计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
- 新年第一天 | 恶补新一季《黑镜》的同时,营长又深入扒了扒它那擅长机器学习的新爸爸是如何赚钱的
- 金明的预算方案(01背包)
- crm day03 创建市场活动
- SQL入门之第二一讲——IF函数的使用
- 玩转5G之--初探5G网络模型(OSI模型和TCP/IP模型)
- python打印电子标签--ghostscript 和reportlab实现
- python 查询周数 week number