首页 > 作文

Java中浅拷贝和深拷贝详解

更新时间:2023-04-04 01:01:58 阅读: 评论:0

目录
java浅拷贝深拷贝实现浅拷贝实现深拷贝

java浅拷贝深拷贝

浅拷贝和深拷贝涉及到了object类中的clone()方法

实现浅拷贝

浅拷贝的实现需要类重写clone()方法

浅拷贝会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝

如果属性是基本类型,拷贝的就是基本类型的值;

如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果有余数的除法教学反思其中一个对象改变了这个地址,就会影响到另一个对象,导致两个对象的引用不等

实现浅拷贝很简单只需要将类实现cloneable接口然后重写clone方法即可

class person implements cloneable {    string name;    int age;    public person() {    }    public person(string name, int age) {        this.name = name;        this.age = age;    }    public string getname() {        return name;    }    public void tname(string name) {        this.name = name;    }    public int getage() {        return age;    }    public void tage(int age) {        this.age = age;    }    /**         * 重写clone()方法         *         * @return         * @throws clonenotsupportedexception         */    @override    protected object clone() throws clonenotsupportedexception {        return super.clone();    }    @override    public string tostring() {        return "person{" +            "name='" + name + '\'' +            ", age=" + age +            '}';    }}

测试浅拷贝特性

public void testclone() throws clonenotsupportedexception {    person person1 = new person();    person1.tname("ccy");    person1.tage(20);    person person2 = (person) person1.clone();    //查看浅拷贝效果    system.out.println(person1);    sys三八节礼物tem.out.println(person2);    system.out.println(person1.getname() == person2.getname());    //验证clone()的特性    system.out.println(person1.clone() != person1);    system.out.println(person1.clone().getclass() == person1.getclass());    //如果是基本类型浅拷贝直接赋值值,如果是引用类型浅拷贝指向其内存地址即共享内存地址    //改变person1的引用类型string属性的值,引用发生改变    person1.tname("zfs");    system.out.println(person2.getname());}

实现深拷贝

对于上述的问题虽然拷贝的两个对象不同,但其内部的一些引用还是相同的,怎么样绝对的拷贝这个对象,使这个对象完全独立于原对象呢?就使用我们的深拷贝了。深拷贝:在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量。

在具体实现深拷贝上,这里提供两个方式,重写clone()方法和序列法。

重写clone()方法

如果使用重写clone()方法实现深拷贝,那么要将类中所有自定义引用变量的类也去实现cloneable接口实现clone()方法。对于字符类可以创建一个新的字符串实现拷贝。但是对于自定义类需要实现cloneable重写clone,这样做就太麻烦了所以我们使用序列化

序列化一站到底

序列化后将二进制字节流内容写到一个媒介(文本或字节数组),然后是从这个媒介读取数据,原对象写入这个媒介后拷贝给clone对象,原对象的修改不会影响clone对象,因为clone对象是从这个媒介读取。

熟悉对象缓存的知道我们经常将java对象缓存到redis中,然后还可能从redis中读取生成java对象,这就用到序列化和反序列化。一般可以将java对象存储为字节流或者json串然后反序列化成java对象。因为序列化会储存对象的属性但是不会也无法存储对象在内存中地址相关信息。所以在反序列化成java对象时候会重新创建所有的引用对象。

在具体实现上,自定义的类需要实现rializable接口

class person implements rializable {    string name;    int age;    public person() {    }    public person(string name, int age) {        this.name = name;        thi会计工作年限证明s.age = age;    }    public string getname() {        return name;    }    public void tname(string name) {        this.name = name;    }    public int getage() {        return age;    }    public void tage(int age) {        this.age = age;    }    @override    public string tostring() {        return "person{" +            "name='" + name + '\'' +            ", age=" + age +            '}';    }    protected person deepclone() throws exception {        //序列化        bytearrayoutputstream bos = new bytearrayoutputstream();        objectoutputstream oos = new objectoutputstream(bos);        oos.writeobject(this);        //反序列化        bytearrayinputstream bis = new bytearrayinputstream(bos.tobytearray());        objectinputstream ois = new objectinputstream(bis);        return (person) ois.readobject();    }}

测试方法

public void testclone() throws exception {    person person1 = new person();    person1.tname("ccy");    person1.tage(20);    person person2 = person1.deepclone();    system.out.println(person1.getname() == person2.getna睫毛膏的用法me());}

可以看到两个引用对象的地址并不同,成功实现了深拷贝

到此这篇关于java中浅拷贝和深拷贝详解的文章就介绍到这了,更多相关java浅拷贝深拷贝内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 01:01:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/cf1fb2995cc9118eaef5a6ffee8e365b.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java中浅拷贝和深拷贝详解.doc

本文 PDF 下载地址:Java中浅拷贝和深拷贝详解.pdf

标签:对象   重写   方法   序列化
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图