Serializable接口实现深度克隆
此时实现的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接口实现深度克隆相关推荐
- java中的深度克隆浅克隆_了解Java中的可克隆接口
java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...
- java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆
为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...
- Cloneable接口的作用与深入理解深度克隆与浅度克隆
cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...
- 实现 Cloneable接口深度克隆对象
实现 Cloneable接口深度克隆对象 Body对象中有Head对象,Head对象中有Face对象,Face对象中有int变量和String变量. 实现Boby对象的深度克隆,看下面代码: pack ...
- 原型模式 —— Java的赋值、浅克隆和深度克隆的区别
赋值 直接 = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...
- 啥是对象的浅度克隆和深度克隆?
在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...
- java中实现对象的深度克隆
1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...
- Java对象的深度克隆
文章目录 前言 代码 后记 前言 日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写clone()方法,对于复杂的对象并不那么好写,而且每个对象都需要重写一次.这里我不重写c ...
- Java实现对象深度克隆
两种方式: 1). 实现Cloneable接口并重写Object类中的clone()方法: 2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆 ...
最新文章
- 后宫佳丽三千,假如古代皇帝也懂负载均衡算法...
- [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现
- linux-安装树形查看工具-tree
- linux 强制结束p进程的命令,Linux常用命令之性能命令
- Java String的内存机制
- Windows操作系统的缘由
- 因为重置网络“netsh winsock reset”导致开不了机
- php 排除前后空格,php去除字符串前后空格的方法
- 叉车式AGV 时间窗问题
- 杭州电子科技大学计算机调剂,2019年杭州电子科技大学硕士研究生调剂公告
- 复杂性思维第二版 三、小世界图
- 多元思维模型——全学科及其核心思维模型
- 机箱前面板的耳机孔没声音的解决办法
- 《计算机工程》期刊投稿经验分享
- 打印机墨水添加方法(二)
- 旧佳人的伤感非主流空间心情日志发布:想念,是一种忧伤的幸福
- 蓝桥杯STM32G431——RTC实时时钟
- 布袋除尘器过滤风速多少_布袋除尘器过滤风速的选择!
- java逻辑值_java、 若x = 5,y = 10,则x y和x = y的逻辑值分别为 和 。...
- 搞懂分布式技术15:缓存更新的套路