深浅拷贝,深浅克隆clone

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

你可能感兴趣的:(java)