Java深浅克隆原理及实现
1.深浅克隆定义
Java 中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、用作方法参数或返回值时,会有值传递和引用(地址)传递的差别。
(补充)基本数据类型包括byte,short,int,long,float,double,boolean,char 8种;
浅度克隆:被克隆得到的对象基本类型的值修改了,原对象的值不会改变
深度克隆:被克隆得到的对象基本类型的值修改了,原对象的值改变
2.代码实现
2.1浅克隆实现
public class ShadowClone implements Cloneable {private int a; // 基本类型private int[] b; // 非基本类型// 重写Object.clone()方法,并把protected改为public@Overridepublic Object clone(){ShadowClone sc = null;try{sc = (ShadowClone) super.clone();} catch (CloneNotSupportedException e){e.printStackTrace();}return sc;}public int getA(){return a;}public void setA(int a){this.a = a;}public int[] getB() {return b;}public void setB(int[] b) {this.b = b;}
}
测试
ShadowClone c1 = new ShadowClone();
//对c1赋值
c1.setA(100) ;
c1.setB(new int[]{1000}) ;System.out.println("克隆前c1: a="+c1.getA()+" b="+c1.getB()[0]);
//克隆出对象c2,并对c2的属性A,B,C进行修改
ShadowClone c2 = (ShadowClone) c1.clone();
//对c2进行修改
c2.setA(50) ;
int []a = c2.getB() ;
a[0]=500 ;
c2.setB(a);
System.out.println("克隆前c1: a="+c1.getA()+" b="+c1.getB()[0]);
System.out.println("克隆后c2: a="+c2.getA()+ " b[0]="+c2.getB()[0]);
克隆前c1: a=100 b=1000
克隆前c1: a=100 b=500
克隆后c2: a=50 b[0]=500
2.2深克隆实现
2.2.1重写Clone方法
class bottle implements Cloneable {public wine wn;public bottle(wine wn) {this.wn = wn;}// 覆写clone()方法@Overrideprotected Object clone() throws CloneNotSupportedException {bottle newBtl = (bottle) super.clone();newBtl.wn = (wine) wn.clone();return newBtl;}
}class wine implements Cloneable {int degree;public int getDegree() {return degree;}public void setDegree(int degree) {this.degree = degree;}// 覆写clone()方法@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
测试
public static void main(String[] args) throws CloneNotSupportedException {bottle bottle = new bottle(new wine());bottle bottle1 = (bottle) bottle.clone();System.out.println("bottle1.wine : " + bottle1.wn.getDegree() );bottle1.wn.setDegree(100);System.out.println("bottle1.wine : " + bottle1.wn.getDegree() );System.out.println("bottle.wine : " + bottle.wn.getDegree());
}
bottle1.wine : 0
bottle1.wine : 100
bottle.wine : 0
2.2.2序列化实现
class DeepPerson implements Serializable {private int a;private int[] b;public DeepPerson() {}public DeepPerson(int a, int[] b) {this.a = a;this.b = b;}public int getA() {return a;}public void setA(int a) {this.a = a;}public int[] getB() {return b;}public void setB(int[] b) {this.b = b;}
}class Test1 {public static void main(String[] args) throws CloneNotSupportedException{DeepPerson dc1 = new DeepPerson();// 对dc1赋值dc1.setA(100);dc1.setB(new int[] { 1000 });System.out.println("克隆前dc1: a=" + dc1.getA()+"b[0]=" + dc1.getB()[0]);DeepPerson dc2 = (DeepPerson) deepClone(dc1);// 对c2进行修改dc2.setA(50);int[] a = dc2.getB();a[0] = 500;System.out.println("克隆后dc1: a=" + dc1.getA()+"b[0]=" + dc1.getB()[0]);System.out.println("克隆后dc2: a=" + dc2.getA()+"b[0]=" + dc2.getB()[0]);}public static Object deepClone(Object object){Object o=null;try{if (object != null){ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(object);oos.close();ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);o = ois.readObject();ois.close();}} catch (IOException e){e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return o;}
}
测试
克隆前dc1: a=100b[0]=1000
克隆后dc1: a=100b[0]=1000
克隆后dc2: a=50b[0]=500
【参考】
https://blog.csdn.net/qq_41967563/article/details/104974789
https://www.jianshu.com/p/f52e5165222a
Java深浅克隆原理及实现相关推荐
- 前端面试题 HTML5 CSS3(盒子模型、盒子水平垂直居中、经典布局) JS(闭包、深浅克隆、数据劫持和拦截) 算法(排序、去重、数组扁平化) Vue(双向数据绑定原理、通信方式)
前端面试题 HTML5 相关面试题 CSS3 相关面试题 盒子模型 盒子水平垂直居中的方案 经典布局方案 圣杯布局 双飞翼布局 flex布局 定位方式布局 css实现三角形 JS 相关面试题 8种数据 ...
- java中的深浅克隆
假设有一个对象object,在某处又需要一个跟object一样的实例object2,强调的是object和object2是两个独立的实例,只是在开始的时候,他们是具有相同状态的(属性字段的值都相同). ...
- 5张图搞懂Java深浅拷贝
微信搜一搜 「bigsai」 关注这个专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 欢迎star收藏 如果本篇对你有帮助,记得点赞收藏哦! 在开发.刷 ...
- Java - 对象克隆
目录 对象克隆 浅克隆 深克隆 多层克隆 对象克隆 在讨论对象克隆之前, 可能会有人说 , 不能直接new一个吗?为什么要克隆 首先关于这个问题, 直接new一个对象, 这个对象里面包含的成员变量是n ...
- java lock的原理,Java中Lock原理探究
在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...
- Java并发编程原理与实战六:主线程等待子线程解决方案
Java并发编程原理与实战六:主线程等待子线程解决方案 参考文章: (1)Java并发编程原理与实战六:主线程等待子线程解决方案 (2)https://www.cnblogs.com/pony1223 ...
- java中怎样克隆,如何在Java中克隆列表?
要克隆Java中的列表,最简单的方法是使用ArrayList.clone()方法- 示例import java.util.ArrayList; public class Demo { public s ...
- Java虚拟机工作原理详解
原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...
- 10分钟看懂, Java NIO 底层原理
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 写在前面 ...
最新文章
- iOS唯一标示符引导
- 表单绑定 v-model —— :value @input || v-model原理
- 聊天工具简单实现(python 半双工聊天)
- 微软沈向洋:计算机视觉未来在语义层 “两大一精”是关键
- 给插店一个成功案例给自己一次机会
- 利用python分析了下乘风破浪的姐姐
- 微信公众号支付调用chooseWXPay提示“errmsg choosewxpay fail”
- 【计算机类】大学生计算机专业常用工具汇总
- 【UOJ 276】无向图最小环
- android.9背景图变形,Android聊天背景图片变形解决方案
- java 子类 父类 转换_Java子类与父类之间的类型转换
- samba 服务器搭建
- JQuery[12] 模仿QQ聊天界面
- 得到app产品体验报告
- 乡下人生活录——程序员给自己买份保险吧
- java 日期 面试题_Java面试试题日期和时间
- JS清除网页历史记录,屏蔽后退按钮
- nova云主机evacuate简单分析
- 模型实践 | AI驱动的全球精准气象预报
- 如何快速增加qq名片赞
热门文章
- Laplacian算子
- 免费CMS建站系统哪个比较好?如何选择?
- 机器视觉系列(03)---TensorFlow2.3 + win10 + GPU安装
- 安卓运行Linux游戏,电脑玩游戏:麒麟安卓Kydroid发布beta版
- 【Harmony OS】【ArkUI】ets开发 创建视图与构建布局
- 【独家】区块链走上太空?Why Can't?
- xp黑屏怎么办 这儿有解决办法 专治XP黑屏
- android dng图片,android - 使用Camera2 API拍摄dng图片 - 堆栈内存溢出
- char *string=xxxxxxxxx 与 char string[]=xxxxx的区别
- android扁平风格png图标,8000个已分类好的扁平化图标(PNG/SVG/WEBFONT)