浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)
浅复制:
public class CloneTest {
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();
}
}
深复制:
public class DeepCloneTest {
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;
}
}