Clone 就是重写clone()方法
两种办法进行深拷贝,一种是Clonable接口,一种是Serializable接口
实现代码如下
package Clone;public class Student implements Cloneable { private String name;public String getName() { return name;}public void setName(String name) { this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException{ return super.clone();} }package Clone;import java.io.Serializable;public class StudentS implements Serializable{ /** * */ private static final long serialVersionUID = 1L;private String name;public String getName() { return name;}public void setName(String name) { this.name = name;} }package Clone;public class Teacher implements Cloneable{ private Student student; private String name; public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected Object clone() throws CloneNotSupportedException{ Teacher teacher =(Teacher)super.clone(); teacher.student= (Student)student.clone();//这一句是clone teacher里面的student的关键,少了就无法克隆成功。 return teacher; } }package Clone;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class TeacherS implements Serializable{ private StudentS studentS; private String name;public StudentS getStudentS() { return studentS;}public void setStudentS(StudentS studentS) { this.studentS = studentS;}public String getName() { return name;}public void setName(String name) { this.name = name;}public Object clone(){ try { ByteArrayOutputStream bos= new ByteArrayOutputStream(); ObjectOutputStream oos= new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null;} }package Clone;public class Test { public static void main(String[] args) throws CloneNotSupportedException { Student student = new Student(); student.setName("xiaozhi"); Teacher teacher = new Teacher (); teacher.setName("xiaozhi de laoshi"); teacher.setStudent(student); Teacher teacher2 = (Teacher)teacher.clone(); System.out.println(teacher.getStudent()==teacher2.getStudent()); StudentS studentS = new StudentS(); studentS.setName("xiaozhi"); TeacherS teacherS = new TeacherS(); teacherS.setName("xiaozhi de laoshi"); teacherS.setStudentS(studentS); TeacherS teacher2S = (TeacherS)teacherS.clone(); System.out.println(teacherS.getStudentS()==teacher2S.getStudentS()); }}//输出两个false,证明其内对象也进行了深拷贝,第二种方法比较简单,不用在每个内对象入studen都实现clone方法并在teacher进行返回设置