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深浅克隆原理及实现相关推荐

  1. 前端面试题 HTML5 CSS3(盒子模型、盒子水平垂直居中、经典布局) JS(闭包、深浅克隆、数据劫持和拦截) 算法(排序、去重、数组扁平化) Vue(双向数据绑定原理、通信方式)

    前端面试题 HTML5 相关面试题 CSS3 相关面试题 盒子模型 盒子水平垂直居中的方案 经典布局方案 圣杯布局 双飞翼布局 flex布局 定位方式布局 css实现三角形 JS 相关面试题 8种数据 ...

  2. java中的深浅克隆

    假设有一个对象object,在某处又需要一个跟object一样的实例object2,强调的是object和object2是两个独立的实例,只是在开始的时候,他们是具有相同状态的(属性字段的值都相同). ...

  3. 5张图搞懂Java深浅拷贝

    微信搜一搜 「bigsai」 关注这个专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 欢迎star收藏 如果本篇对你有帮助,记得点赞收藏哦! 在开发.刷 ...

  4. Java - 对象克隆

    目录 对象克隆 浅克隆 深克隆 多层克隆 对象克隆 在讨论对象克隆之前, 可能会有人说 , 不能直接new一个吗?为什么要克隆 首先关于这个问题, 直接new一个对象, 这个对象里面包含的成员变量是n ...

  5. java lock的原理,Java中Lock原理探究

    在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...

  6. Java并发编程原理与实战六:主线程等待子线程解决方案

    Java并发编程原理与实战六:主线程等待子线程解决方案 参考文章: (1)Java并发编程原理与实战六:主线程等待子线程解决方案 (2)https://www.cnblogs.com/pony1223 ...

  7. java中怎样克隆,如何在Java中克隆列表?

    要克隆Java中的列表,最简单的方法是使用ArrayList.clone()方法- 示例import java.util.ArrayList; public class Demo { public s ...

  8. Java虚拟机工作原理详解

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...

  9. 10分钟看懂, Java NIO 底层原理

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 写在前面 ...

最新文章

  1. iOS唯一标示符引导
  2. 表单绑定 v-model —— :value @input || v-model原理
  3. 聊天工具简单实现(python 半双工聊天)
  4. 微软沈向洋:计算机视觉未来在语义层 “两大一精”是关键
  5. 给插店一个成功案例给自己一次机会
  6. 利用python分析了下乘风破浪的姐姐
  7. 微信公众号支付调用chooseWXPay提示“errmsg choosewxpay fail”
  8. 【计算机类】大学生计算机专业常用工具汇总
  9. 【UOJ 276】无向图最小环
  10. android.9背景图变形,Android聊天背景图片变形解决方案
  11. java 子类 父类 转换_Java子类与父类之间的类型转换
  12. samba 服务器搭建
  13. JQuery[12] 模仿QQ聊天界面
  14. 得到app产品体验报告
  15. 乡下人生活录——程序员给自己买份保险吧
  16. java 日期 面试题_Java面试试题日期和时间
  17. JS清除网页历史记录,屏蔽后退按钮
  18. nova云主机evacuate简单分析
  19. 模型实践 | AI驱动的全球精准气象预报
  20. 如何快速增加qq名片赞

热门文章

  1. Laplacian算子
  2. 免费CMS建站系统哪个比较好?如何选择?
  3. 机器视觉系列(03)---TensorFlow2.3 + win10 + GPU安装
  4. 安卓运行Linux游戏,电脑玩游戏:麒麟安卓Kydroid发布beta版
  5. 【Harmony OS】【ArkUI】ets开发 创建视图与构建布局
  6. 【独家】区块链走上太空?Why Can't?
  7. xp黑屏怎么办 这儿有解决办法 专治XP黑屏
  8. android dng图片,android - 使用Camera2 API拍摄dng图片 - 堆栈内存溢出
  9. char *string=xxxxxxxxx 与 char string[]=xxxxx的区别
  10. android扁平风格png图标,8000个已分类好的扁平化图标(PNG/SVG/WEBFONT)