Java浅复制与深复制

来源:互联网 发布:java时间轴处理 编辑:程序博客网 时间:2024/06/07 08:53

Java浅复制与深复制

  • 浅复制(浅克隆): 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
  • 深复制(深克隆):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)

浅复制:

public static void main(String[] args) throws CloneNotSupportedException {        Teacher teacher = new Teacher();        teacher.setAge(40);        teacher.setName("Teacher Zhang");        Student student1 = new Student();        student1.setAge(20);        student1.setName("zhangsan");        student1.setTeacher(teacher);        Student student2 = (Student) student1.clone();        System.out.println(student2.getAge());        System.out.println(student2.getName());        System.out.println(student2.getTeacher().getAge());        System.out.println(student2.getTeacher().getName());        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");        System.out.println(student1.getTeacher().getAge());        System.out.println(student1.getTeacher().getName());        student2.setAge(18);        student2.getTeacher().setAge(50);// 浅复制针对对象的引用没有重新开辟新的空间        student2.getTeacher().setName("Teacher Li"); // 改变值后相应的都改变        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");        System.out.println(student1.getAge());        System.out.println(student1.getTeacher().getAge());        System.out.println(student1.getTeacher().getName());    }}class Teacher {    private int age;    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}class Student implements Cloneable {    private int age;    private String name;    private Teacher teacher;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Teacher getTeacher() {        return teacher;    }    public void setTeacher(Teacher teacher) {        this.teacher = teacher;    }    public Object clone() throws CloneNotSupportedException {        return super.clone();    }

输出:

20zhangsan40Teacher Zhang~~~~~~~~~~~~~~~~~~~~~~~40Teacher Zhang~~~~~~~~~~~~~~~~~~~~~~~~2050Teacher Li

深复制:

public static void main(String[] args) throws CloneNotSupportedException {        Teacher teacher = new Teacher();        teacher.setAge(40);        teacher.setName("Teacher Zhang");        Student student1 = new Student();        student1.setAge(20);        student1.setName("zhangsan");        student1.setTeacher(teacher);        Student student2 = (Student) student1.clone();        System.out.println(student2.getAge());        System.out.println(student2.getName());        System.out.println(student2.getTeacher().getAge());        System.out.println(student2.getTeacher().getName());        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");        System.out.println(student1.getTeacher().getAge());        System.out.println(student1.getTeacher().getName());        student2.setAge(18);        student2.getTeacher().setAge(50);        student2.getTeacher().setName("Teacher Li");         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");        System.out.println(student1.getAge());        System.out.println(student1.getTeacher().getAge());        System.out.println(student1.getTeacher().getName());    }}class Teacher implements Cloneable {    private int age;    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Object clone() throws CloneNotSupportedException {        return super.clone();    }}class Student implements Cloneable {    private int age;    private String name;    private Teacher teacher;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Teacher getTeacher() {        return teacher;    }    public void setTeacher(Teacher teacher) {        this.teacher = teacher;    }    public Object clone() throws CloneNotSupportedException {        Student student = (Student) super.clone();        student.setTeacher((Teacher) (student.getTeacher().clone()));        return student;    }

输出:

20zhangsan40Teacher Zhang~~~~~~~~~~~~~~~~~~~~~~~40Teacher Zhang~~~~~~~~~~~~~~~~~~~~~~~~2040Teacher Zhang
0 0
原创粉丝点击