深克隆和浅克隆的区别:
被克隆的类需要实现Clonenable标记接口,重写父类Object类中的方法clone。
浅克隆: 浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深克隆: 深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
代码演示:
/**
* 学生类
*/
public class Student implements Cloneable {
private String name;
private int age;
//重写Object类的方法clone
@Override
public Object clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
return student;
}
public Student() {
super();
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
* 老师类
*/
public class Teacher implements Cloneable{
private String name;
private int age;
private Student student;
public Teacher(String name, int age, Student student) {
this.name = name;
this.age = age;
this.student = student;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
", student=" + student +
'}';
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
/**
* 测试浅克隆
*/
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
//创建Person类对象并复制一份
Teacher teacher1 = new Teacher("王老师", 36, new Student("张三",15));
Teacher teacher2 = (Teacher) teacher1.clone();
Student student = teacher2.getStudent();
//修改浅克隆出来的老师的学生成员变量的值
//源老师的成员变量学生的值也被改变
student.setAge(5);
student.setName("小杨");
System.out.println(teacher1);
System.out.println(teacher2);
}
}
执行结果:
深克隆的时候就要把克隆的对象中的引用类型的成员再克隆一次。
&emso; 再次修改上面的 Teacher 类重写父类Objcet的方法clone:
代码:
@Override
public Object clone() throws CloneNotSupportedException {
Teacher teacher = (Teacher) super.clone();
//把引用类型的变量在克隆一份
teacher.setStudent((Student) teacher.getStudent().clone());
return teacher;
}
再次执行测试类的执行结果:
这次修改克隆的Teacher类的变量的值,源Teacher的值就不再受影响了。