clone 深拷贝 浅拷贝

1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性

2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set很多属性很麻烦

3. 实现:实现Cloneable接口(标识接口,里面没有方法的定义)标识该类对象可以克隆

            重写Object中的clone()方法,该方法可以合法的(实现上面接口)对该类实例(对象)按字段进行复制。

            在重写的clone()方法中 return super.clone(); (调用父类(Object)的clone方法,其实子类什么都没做)用父类的clone放复制当前对象的属性 返回复制的对象

4. 深拷贝,浅拷贝:对象属性有 基本类型 int String(不是基本但是final)等,引用变量(其他类的对象),因为基本基本类型变量的拷贝是值拷贝,引用变量的拷贝是拷贝的地址,所以克隆出来的对象的引用变量是同一个变量,在一个对象修改时,另一个对象也被修改,所以有了深拷贝。实现深拷贝需要把引用变量的对象的类也实现Cloneable接口,从写clone()方法,return super.clone(); 

5. 深拷贝好像用在java框架hibernate 上

/*
浅拷贝 s修改teacher s1的teacher也修改了
*/
package weiguoyuan.chainunicom.cn;

class Teacher1 {
    private String name;
    public Teacher1(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return name;
    }
}

class Student1 implements Cloneable{
    private String name;
    private Teacher1 teacher;
    public Student1(String name,Teacher1 teacher) {
        this.name = name;
        this.teacher = teacher;
    }
    public Teacher1 getTeacher() {
        return teacher;
    }
    public String toString() {
        return name+" "+teacher.toString();
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
        
    }
}

public class TestClone {

    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher1 t = new Teacher1("jianghongweiSB");
        Student1 s = new Student1("weiguoyuanNB",t);
        Student1 s1 = (Student1)s.clone();
        System.out.println(s);
        System.out.println(s1);
        
        s.getTeacher().setName("jianghongwei");
        System.out.println(s);
        System.out.println(s1);        
    }
}

 

/**
 * 深拷贝实现
 */
package weiguoyuan.chainunicom.cn;

class Teacher1 implements Cloneable{
    private String name;
    public Teacher1(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return name;
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();    
    }
}

class Student1 implements Cloneable{
    private String name;
    private Teacher1 teacher;
    public Student1(String name,Teacher1 teacher) {
        this.name = name;
        this.teacher = teacher;
    }
    public Teacher1 getTeacher() {
        return teacher;
    }
    public String toString() {
        return name+" "+teacher.toString();
    }
    public Object clone() throws CloneNotSupportedException{
        Student1 student = (Student1)super.clone();
        student.teacher = (Teacher1)this.teacher.clone();
        return student;    
    }
}

public class TestClone {

    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher1 t = new Teacher1("jianghongweiSB");
        Student1 s = new Student1("weiguoyuanNB",t);
        Student1 s1 = (Student1)s.clone();
        System.out.println(s);
        System.out.println(s1);
        
        s.getTeacher().setName("jianghongwei");
        System.out.println(s);
        System.out.println(s1);        
    }
}

 

 

            

posted on 2015-06-11 16:49  weiguoyuan  阅读(347)  评论(1编辑  收藏  举报

导航