美文网首页
关于Java对象拷贝深拷贝与浅拷贝的实现

关于Java对象拷贝深拷贝与浅拷贝的实现

作者: 手打小黑板 | 来源:发表于2020-02-12 10:30 被阅读0次
package com.liming.prototype;

public class Sheep implements Cloneable{
    String name;
    int age;
    Ex  ex;

    Sheep(String name,int age){
        this.name = name;
        this.age = age;
        ex = new Ex("白色的尾巴","黄色的眼睛");
    }



    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object o = super.clone();
        ((Sheep) o).ex = (Ex)this.ex.clone();   //调用引用对象的clone方法重新给clone对象的ex引用赋值成新克隆的对象
        return o;
    }

    public static void main(String[] args) throws CloneNotSupportedException {

        Sheep duoli = new Sheep("多莉",3);

        System.out.println(duoli);
        Sheep cloneDuoli = (Sheep)duoli.clone();

        cloneDuoli.name = "克隆多莉";

        System.out.println(duoli.name);


        cloneDuoli.ex.tail = "黑色的尾巴";

        System.out.println(duoli.ex.tail);  //由于ex是浅复制的缘故(Sheep的clone方法只拷贝了ex的引用值),所以还是指向之前的对象
        System.out.println(cloneDuoli.ex.tail);

    }
}

class Ex implements Cloneable{
     String tail;
     String eyes;

    public Ex(){}
    public Ex(String tail,String eyes){
        this.tail = tail;
        this.eyes = eyes;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

序列化方式实现深拷贝

package com.liming.prototype;


import java.io.*;

public class Bull implements Serializable {
    String name;
    int age;
    Exx  ex;

    Bull(String name,int age){
        this.name = name;
        this.age = age;
        ex = new Exx("白色的尾巴","黄色的眼睛");
    }


    public static void main(String[] args) throws CloneNotSupportedException {

        Bull duoli = new Bull("多莉",3);


        try {

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);

            oos.writeObject(duoli);
            oos.flush();


            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));


            System.out.println(duoli);

            Bull cloneDuoli = (Bull) ois.readObject();
            cloneDuoli.ex.eyes = "蓝色的眼睛";

            System.out.println(duoli.ex.eyes);
            System.out.println(cloneDuoli.ex.eyes);

            //序列化方式实现深拷贝
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


    }
}

class Exx implements Serializable{
     String tail;
     String eyes;

    public Exx(){}
    public Exx(String tail,String eyes){
        this.tail = tail;
        this.eyes = eyes;
    }
}

相关文章

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • 五、面试总结(五)

    对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方...

  • 深浅拷贝,面向对象,Symbol,Set,Map

    一:浅拷贝与深拷贝对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互影响。对象的深拷贝:简单理解深拷贝是...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • Java的浅拷贝与深拷贝

    Java的浅拷贝与深拷贝 一、概念 浅拷贝浅拷贝仅仅复制所考虑的对象(包括对象中的基本变量),而不复制它所引用的对...

  • 前端笔记(二) 对象的深浅拷贝,函数的防抖与节流,函数柯里化 ,

    对象的深浅拷贝 对象的深拷贝与浅拷贝的区别: 浅拷贝:仅仅复制对象的引用, 而不是对象本身。 深拷贝:把复制的对象...

  • iOS - copy与mutableCopy

    浅拷贝与深拷贝 浅拷贝:指针拷贝,不产生新的对象,源对象的引用计数器+1 深拷贝:对象拷贝,会产生新的对象,源对象...

  • Object 对象

    什么是浅拷贝,如何实现浅拷贝?什么是深拷贝,如何实现深拷贝? 是什么: 浅拷贝: 将原对象或原数组的引用直接赋给新...

  • js中的深拷贝和浅拷贝

    一、深拷贝与浅拷贝 深拷贝和浅拷贝只针对Object,Array这些复杂的引用对象。浅拷贝,只复制对象的引用的地址...

  • JAVA设计模式:原型模式与拷贝

    深拷贝与浅拷贝 浅拷贝:对象A进行赋值操作得到对象B,这就是浅拷贝,修改对象A的属性会影响到B的属性 深拷贝:深拷...

网友评论

      本文标题:关于Java对象拷贝深拷贝与浅拷贝的实现

      本文链接:https://www.haomeiwen.com/subject/gouqfhtx.html