深浅拷贝,深浅克隆clone

    xiaoxiao2022-07-13  157

    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();

     

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

    参考文章:https://www.cnblogs.com/shakinghead/p/7651502.html

    最新回复(0)