Java中深浅拷贝

一:浅拷贝:
只有子类实现Cloneable接口才可以使用Object使用的clone方法。

protected native Object clone() throws CloneNotSupportedException;

浅拷贝是将原对象的信息拷贝,拷贝后的对象和原对象指向同一块空间。



class Teacher {
    private String name;
    private String position;

    public Teacher(String name, String position) {
        this.name = name;
        this.position = position;
    }

    @Override
    public String toString() {
        return "QianCopy{" +
                "name='" + name + '\'' +
                ", position='" + position + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Student implements  Cloneable
{
    private String name;
    private Integer age;
    private Teacher teacher;

    public Student(String name, Integer age, Teacher teacher) {
        this.name = name;
        this.age = age;
        this.teacher = teacher;
    }

    @Override
    protected Student clone() throws CloneNotSupportedException {
        Student student=null;
        student=(Student)super.clone();
        return student;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", teacher=" + teacher +
                '}';
    }
}

public class QianCopy
{
    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher teacher=new Teacher("ali","manager");
        Student student=new Student("sophia",10,teacher);
        System.out.println("这是原student");
        System.out.println(student);
        System.out.println("这是cloneStudent");
        Student cloneStudent=student.clone();
        System.out.println(cloneStudent);

        System.out.println("修改techer姓名");
        teacher.setName("Jack");//修改teacher的名称,student里的teacher姓名会改变
        System.out.println("这是修改后原student");
        System.out.println(student);
        System.out.println("这是修改后cloneStudent");
        System.out.println(cloneStudent);
    }
}

Java中深浅拷贝_第1张图片上述clone是浅拷贝,因为拷贝后的teacher和原teacher指向同一块空间,原teacher改变,clone后的student里的teacher也改变。

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

import java.io.*;

//深拷贝
class Teacher1 implements Serializable {
    private String name;
    private String position;

    public Teacher1(String name, String position) {
        this.name = name;
        this.position = position;
    }

    @Override
    public String toString() {
        return "QianCopy{" +
                "name='" + name + '\'' +
                ", position='" + position + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Student1 implements  Cloneable,Serializable
{
    private String name;
    private Integer age;
    private Teacher1 teacher;

    public Student1(String name, Integer age, Teacher1 teacher) {
        this.name = name;
        this.age = age;
        this.teacher = teacher;
    }

    public Student1 cloneSer () throws Exception {
        Student1 student=null;
        //在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组中
        //默认创建一个大小为32的缓冲区
        ByteArrayOutputStream byOut=new ByteArrayOutputStream();
        //对象的序列化输出
        ObjectOutputStream outputStream=new ObjectOutputStream(byOut);//通过字节数组的方式进行传输
        outputStream.writeObject(this);  //将当前student对象写入字节数组中

        //在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区
        ByteArrayInputStream byIn=new ByteArrayInputStream(byOut.toByteArray()); //接收字节数组作为参数进行创建
        ObjectInputStream inputStream=new ObjectInputStream(byIn);
        student=(Student1)inputStream.readObject(); //从字节数组中读取
        return student;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", teacher=" + teacher +
                '}';
    }
}
public class ShenCopy {
    public static void main(String[] args) throws Exception {
        Teacher1 teacher=new Teacher1("ali","manager");
        Student1 student=new Student1("sophia",10,teacher);
        System.out.println("这是原student");
        System.out.println(student);
        System.out.println("这时cloneStudent");
        Student1 cloneStudent=student.cloneSer();
        System.out.println(cloneStudent);

        System.out.println("将teacher姓名进行修改");
        teacher.setName("Jack");
        System.out.println("这是修改后原student");
        System.out.println(student);
        System.out.println("这是修改后cloneStudent");
        System.out.println(cloneStudent);
    }
}

Java中深浅拷贝_第2张图片

你可能感兴趣的:(java)