引用拷贝(一个人,不同名字)
浅拷贝(双胞胎):创建对象,将目标对象内容复制过来,不直接拷贝引用
深拷贝:全独立原对象,拷贝数据类型时,创建新对象,复制成员变量
一、引用拷贝
生成新对象引用地址,最终指向同一对象。不同场合、叫法不同,但我们很清楚哪些名称"我"
二、浅拷贝
创建对象,将目标对象内容复制过来,不直接拷贝引用
创建新对象,和原对象不等,但属性相同。区别:
如属性是基本类型(int,double,long,boolean),拷贝基本类型值
如果属性是引用类型,拷贝的就是内存地址(即复制引用 但不复制引用的对象) ,如对象改变地址,影响另一对象
浅拷贝实现
类上实现Cloneable接口并重写clone()
双胞胎一样,两个人,样貌、各种关系(父母亲人)都相同的。name初始==相等,s1.name="son222" 改变引用指向
三、深拷贝(重写clone 序列化)
全独立原对象。深拷贝:拷贝数据类型时,创建新对象,复制成员变量
实现深拷贝提供,重写clone()方法和序列法。
1、重写clone()
自定义引用变量类去实现Cloneable接口实现clone()。字符类创建新字符串实现拷贝
Father实现Cloneable接口并重写clone()。son的clone()对各个引用都拷贝一遍
2、序列化
如果引用数量或层数太多,怎么办呢?
序列化后:将二进制字节流内容写到媒介(文本或字节数组),拷贝给clone对象,从媒介读,原对象修改不影响clone对象(从媒介读)
序列化:Java对象缓存Redis中(字节流或json串),存对象属性,不存对象内存地址
反序列化:从Redis中读取生成Java对象,重新创建所有引用对象
自定义类实现Serializable接口。深拷贝类(Son)定义函数,返回该类对象
https://mp.weixin.qq.com/s/kmD6FKJ5fwLUr64DonZf-A