深浅克隆问题 浅克隆用一个已经创建的实例作为原型,通过复制该原型来创建一个和原型对象相同的新对象,克隆对象就需要注意浅拷贝和深拷贝的问题
public class Teacher implements Cloneable{
public Student student;
public Teacher(Student student) {
System.out.println("构造");
this.student = student;
}
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher = new Teacher(new Student("stu"));
Teacher newTeacher = (Teacher) teacher.clone();
System.out.println(newTeacher.student == teacher.student);
System.out.println("修改前" + newTeacher.student.name+"t" + teacher.student.name);
teacher.student.name = "change";
System.out.println("修改后" + newTeacher.student.name+"t" + teacher.student.name);
}
}
class Student{
public String name;
public Student(String name) {
this.name = name;
}
}
这里==号判断的就是两个Student成员的地址信息,这里可见两个Student对象指向了同一个地址,如果修改一个对象的name,那么另一个对象的name也会跟着变
深克隆当Teacher类实现Cloneable接口时,重写clone时可以实现深拷贝,但违背了原型模式初衷,因为还是进行了对象的创建,这里可以使用序列化再反序列化达到深克隆的效果
序列化之后立即反序列化,这时候就是深拷贝了,两个对象内部的对象地址也不相同
总结原型模式就是在对象创建比较复杂,而需要的新对象刚好和旧对象差别不大,可以直接使用克隆来达到效果,它不会走构造方法



