博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深浅拷贝,深浅克隆clone
阅读量:4042 次
发布时间:2019-05-24

本文共 1766 字,大约阅读时间需要 5 分钟。

Java基础的部分,容易忽略的细节。

浅克隆:对象的属性值进行copy,如果包含引用对象属性,则是引用的传递(如果修改,则其他引用的值也变化)。

深克隆:对对象对属性进行copy,如果包含引用对象属性,则引用对象属性copy。对象不相互影响。

浅拷贝:也是包含引用对象属性,则仅是引用的传递。

深拷贝:所有对象属性互相不影响。

克隆,主要是重写对象的clone方法,然后调用父类的clone();同时clone的对象实现implements Cloneable;

class Student implements Cloneable{
public Object clone() {        Object obj=null;        //调用Object类的clone方法,返回一个Object实例        try {            obj= super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        return obj;    }

}

深度克隆,则还需要引用属性的对象实现implements Cloneable,clone方法中进行对引用对象clone返回的值赋值

class Student implements Cloneable{
//重写Object类的clone方法    public Object clone() {        Object obj=null;        //调用Object类的clone方法——浅拷贝        try {            obj= super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        //调用Age类的clone方法进行深拷贝        //先将obj转化为学生类实例        Student stu=(Student)obj;        //学生类实例的Age对象属性,调用其clone方法进行拷贝        stu.aage=(Age)stu.getaAge().clone();        return obj;    }}

浅拷贝:实现方式1.对象的构造函数中进行赋值2.对象的浅克隆

//拷贝构造方法    public Person(Person p) {        this.name=p.name;        this.age=p.age;    }
//通过调用重写后的clone方法进行浅拷贝        Student stu2=(Student)stu1.clone();

深拷贝:实现方式1.深克隆(参看上面的clone方法)2.序列化跟反序列化(对象以及引用属性对象均需要implements Serializable

实现序列化)

//通过调用重写后的clone方法进行浅拷贝        Student stu2=(Student)stu1.clone();
//通过序列化方法实现深拷贝        ByteArrayOutputStream bos=new ByteArrayOutputStream();        ObjectOutputStream oos=new ObjectOutputStream(bos);        oos.writeObject(stu1);        oos.flush();        ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));        Student stu2=(Student)ois.readObject();

 

通过序列化的方法可以简洁的实现深度克隆,同时序列返序列化方法如果有错误,在代码编译时就会报错出来。

参考文章:

转载地址:http://mgadi.baihongyu.com/

你可能感兴趣的文章
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
Flex 中的元数据标签
查看>>
flex4 中创建自定义弹出窗口
查看>>
01Java基础语法-13. if分支语句的灵活使用
查看>>
01Java基础语法-15.for循环结构
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-17. do..while循环结构
查看>>
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>