此时实现的Clone是深度克隆:

public class Inner implements Serializable {private static final long serialVersionUID = 872390113109L; //最好是显式声明IDpublic String name = "";public Inner(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Inner的name值为:" + name;}
}
public class Outer implements Serializable {private static final long serialVersionUID = 369285298572941L;  //最好是显式声明IDpublic Inner inner;//Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化] public Outer myclone() {Outer outer = null;try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);// 将流序列化成对象ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);outer = (Outer) ois.readObject();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return outer;}public Outer(Inner inner) {this.inner = inner;}@Overridepublic String toString() {return "Outer{" +"inner=" + inner +'}';}public static void main(String[] args) throws CloneNotSupportedException {Inner inner = new Inner("内1");Outer outer = new Outer(inner);Outer outer1 = outer.myclone();//两个对象在内存空间内完全独立存在,互不影响对方的值。inner.setName("内2");System.out.println(outer);//原对象改变了System.out.println(outer1);//克隆后的对象没改变}}

输出:

Outer{inner=Inner的name值为:内2}
Outer{inner=Inner的name值为:内1}

实现对象克隆有两种方式:

  1). 实现Cloneable接口并重写Object类中的clone()方法;

  2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

Serializable接口实现深度克隆相关推荐

  1. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  2. java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆

    为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...

  3. Cloneable接口的作用与深入理解深度克隆与浅度克隆

    cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...

  4. 实现 Cloneable接口深度克隆对象

    实现 Cloneable接口深度克隆对象 Body对象中有Head对象,Head对象中有Face对象,Face对象中有int变量和String变量. 实现Boby对象的深度克隆,看下面代码: pack ...

  5. 原型模式 —— Java的赋值、浅克隆和深度克隆的区别

    赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...

  6. 啥是对象的浅度克隆和深度克隆?

    在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...

  7. java中实现对象的深度克隆

    1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...

  8. Java对象的深度克隆

    文章目录 前言 代码 后记 前言 日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写clone()方法,对于复杂的对象并不那么好写,而且每个对象都需要重写一次.这里我不重写c ...

  9. Java实现对象深度克隆

    两种方式:   1). 实现Cloneable接口并重写Object类中的clone()方法:   2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆 ...

最新文章

  1. 后宫佳丽三千,假如古代皇帝也懂负载均衡算法...
  2. [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现
  3. linux-安装树形查看工具-tree
  4. linux 强制结束p进程的命令,Linux常用命令之性能命令
  5. Java String的内存机制
  6. Windows操作系统的缘由
  7. 因为重置网络“netsh winsock reset”导致开不了机
  8. php 排除前后空格,php去除字符串前后空格的方法
  9. 叉车式AGV 时间窗问题
  10. 杭州电子科技大学计算机调剂,2019年杭州电子科技大学硕士研究生调剂公告
  11. 复杂性思维第二版 三、小世界图
  12. 多元思维模型——全学科及其核心思维模型
  13. 机箱前面板的耳机孔没声音的解决办法
  14. 《计算机工程》期刊投稿经验分享
  15. 打印机墨水添加方法(二)
  16. 旧佳人的伤感非主流空间心情日志发布:想念,是一种忧伤的幸福
  17. 蓝桥杯STM32G431——RTC实时时钟
  18. 布袋除尘器过滤风速多少_布袋除尘器过滤风速的选择!
  19. java逻辑值_java、 若x = 5,y = 10,则x y和x = y的逻辑值分别为 和 。...
  20. 搞懂分布式技术15:缓存更新的套路

热门文章

  1. 宜春学院计算机分数,宜春学院2019录取分数线预测
  2. 毕业答辩一定会被问的问题
  3. 商标买卖中的连同原则
  4. 计算机类参加比赛GMC,我校学生获得第19届国际企业管理挑战赛(GMC)中国赛区三等奖...
  5. Mysql__leecode/0197. 上升的温度
  6. CPU,多核,多线程,并发,并行,计算效率
  7. linux c udp接收超时设置
  8. Vue项目目录结构介绍讲解
  9. CZXX 1+X测试
  10. uno牌的玩法图解_UNO牌标准版简介及规则说明