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; }@Override protected 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;}@Overrideprotected 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进行返回设置