比如说,有一个Student类,再这个类里面有一个引用指向Teacher类,我创建一个Student类的对象s1,为s1全部都Set进值去,假如说s1的老师是王老师,然后我去克隆一个s1的对象,clones1,这个clones1里面的值和s1里面完全一样,clones1的老师也是王老师,此时我讲Teacher重新Set值,改为t2李老师,这时候,clones1的老师是李老师,s1的老师也是李老师,就是说克隆完成一个对象后,如果我将原对象里面引用的另外一个类的值也改变,那么原对象里面引用的值也会改变。这就是浅克隆。顾名思义,深克隆的话就是当我改变那个引用之后,原对象里面的引用不会改变,只是将克隆之后的引用改变。
浅克隆:
Teacher t1=new Teacher();
t1.setId(1);
t1.setName("王");
Student s1=new Student();
s1.setId(1);
s1.setName("张三");
s1.setTeacher(t1);
System.out.println("s1没有被克隆的老师是"+s1.getTeacher().getName());
Student clones1=(Student) s1.clone();
System.out.println("cloens的名字是:"+clones1.getName());
Teacher cloneT=clones1.getTeacher();
System.out.println("cloneT的名字是"+cloneT.getName());
cloneT.setName("李老师");
System.out.println("clones的老师是"+clones1.getTeacher().getName());
Teacher oldT=s1.getTeacher();
System.out.println("s的老师现在是:"+oldT.getName());
}
注:在将s1克隆前必须需将Student实现Cloneable接口并重写clone方法。
深克隆:
public class TestDeepClone {
public static Object deepClone(Object o) throws Exception{
FileOutputStream fos=new FileOutputStream("c:\\1.dat");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.flush();
oos.close();
FileInputStream fis=new FileInputStream("c:\\1.dat");
ObjectInputStream ois=new ObjectInputStream(fis);
Object cloneobj=ois.readObject();
ois.close();
return cloneobj;
}
public static void main(String[] args) throws Exception {
Teacher t1=new Teacher();
t1.setId(1);
t1.setName("王");
Student s=new Student();
s.setId(1);
s.setName("张三");
s.setTeacher(t1);
System.out.println("s的名字是"+s.getName());
System.out.println("s的老师是"+s.getTeacher().getName());
Student clones=(Student) deepClone(s);
System.out.println("clones的名字是"+clones.getName());
System.out.println("clones的老师的名字是"+clones.getTeacher().getName());
/**
* 克隆出来的学生把老师给换了,然后我打印原来的学生的老师,和克隆出来的学生的老师比较
*/
Teacher changeTeacher=clones.getTeacher();
changeTeacher.setName("金老师");
changeTeacher.setId(2);
System.out.println("没有被克隆学生的老师的id"+s.getTeacher().getId());
System.out.println("没有被克隆学生的老师的name"+s.getTeacher().getName());
System.out.println("最终克隆的学生的老师的id"+clones.getTeacher().getId());
System.out.println("最终克隆的学生的老师的name"+clones.getTeacher().getName());
}
}
注:一定要将Student和Teacher类实现Serializable