packageobjDeepCopy;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;public classDeepCopy {public static void main(String[] args) throwsException {
Teacher teacher=newTeacher();
teacher.settAge(20);
teacher.settName("zhangsan");
Student student1=newStudent();
student1.setsAge(55);
student1.setsName("xiaojiang");
student1.setsTeacher(teacher);
System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName());
Student student2=lowCopy(student1);
System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName());//对student1修改,只对复制对象的成员变量进行复制,但是引用的变量只是将引用指向过去
student1.setsAge(44);
student1.setsName("xinxiaoming");
student1.getsTeacher().settName("xinlaoshi");
System.out.println("------------------");
System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName());
System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName());//深复制通过流,将对象完整的复制过去,并不是引用//System.out.println("------------------深复制");//
//Teacher teacher=new Teacher();//teacher.settAge(20);//teacher.settName("zhangsan");//Student student1=new Student();//student1.setsAge(55);//student1.setsName("xiaojiang");//student1.setsTeacher(teacher);//System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName());//Student student2=student1.deepCopy(student1);//System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName());// //对student1修改,只对复制对象的成员变量进行复制,但是引用的变量只是将引用指向过去//student1.setsAge(44);//student1.setsName("xinxiaoming");//student1.getsTeacher().settName("xinlaoshi");//System.out.println("------------------");//System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName());//System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName());
}public static Student lowCopy(Student student) throwsException{
Student student2=(Student) student.clone();returnstudent2;
}
}class Student implementsSerializable,Cloneable{/****/
private static final long serialVersionUID = 5668069747602085306L;private intsAge;privateString sName;privateTeacher sTeacher;public intgetsAge() {returnsAge;
}public void setsAge(intsAge) {this.sAge =sAge;
}publicString getsName() {returnsName;
}public voidsetsName(String sName) {this.sName =sName;
}publicTeacher getsTeacher() {returnsTeacher;
}public voidsetsTeacher(Teacher sTeacher) {this.sTeacher =sTeacher;
}
@Overridepublic Object clone() throwsCloneNotSupportedException {return super.clone();
}public Student deepCopy(Student student) throwsException{
ByteArrayOutputStream boStream=newByteArrayOutputStream();
ObjectOutputStream oos= newObjectOutputStream(boStream);
oos.writeObject(this);
ByteArrayInputStream bis=newByteArrayInputStream(boStream.toByteArray());
ObjectInputStream ois=newObjectInputStream(bis);return(Student) ois.readObject();
}
}class Teacher implementsSerializable{private inttAge;privateString tName;public intgettAge() {returntAge;
}public void settAge(inttAge) {this.tAge =tAge;
}publicString gettName() {returntName;
}public voidsettName(String tName) {this.tName =tName;
}
}