Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法,如下:
public class Student implements Cloneable {
private String name;
private int age;
private Professor professor;
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 Professor getProfessor() {
return professor;
}
public void setProfessor(Professor professor) {
this.professor = professor;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", professor="
+ professor + "]";
}
public Object clone() throws CloneNotSupportedException{
return super.clone(); //在这里我们能够看到,要想复制这个自定义的对象,我们必须要在这个类中实现克隆类。
}
}
克隆与=(复制)的区别:克隆是得到的一个新的对象而不是克隆了一个引用,复制只是复制了一个引用(依旧公用的同一个对象)
当一个克隆类中定义了只有基本的数据类型的时候,不会出现因为修改了克隆得到对象而去修改原有的对象(浅克隆)
但是当有引用的时候,并不能根据浅复制来完成应有的克隆。
修改clone()得到对象的该字段(name, age)时并不会影响原来的对象,但是当字段为一个引用时,修改clone()得到对象的该字段(professor)时并会影响原来的对象。上面实现的clone()方法为浅复制(shadow copy)。
现在进行深复制:代码如下
public class Student implements Cloneable {
private String name;
private int age;
private Professor professor;
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 Professor getProfessor() {
return professor;
}
public void setProfessor(Professor professor) {
this.professor = professor;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", professor="
+ professor + "]";
}
public Object clone() throws CloneNotSupportedException{
Student newStudent = (Student) super.clone();
newStudent.professor = (Professor) professor.clone();//对对象里面的引用也进行clone的操作。
return newStudent;
}
}