1、拷贝介绍(一)、引用拷贝创建指向对象的引用变量的拷贝。Teacherteacher=newTeacher("Taylor",26);Teacherotherteacher=teacher;System.out.println(teacher);System.out.println(otherteacher);输出结果:blog.Teacher@355da254blog.Teacher@355da254结果分析:从输出结果可以看出,它们的地址值是一样的,所以一定是同一个对象。teacher和otherteacher只是引用,它们都指向同一个对象Teacher("Taylor",26)。这称为按引用复制。(2)、对象复制创建对象本身的副本。老师teacher=newTeacher("斯威夫特",26);老师otherteacher=(Teacher)teacher.clone();System.out.println(老师);System.out.println(其他老师);输出:blog.Teacher@355da254blog.Teacher@4dc63996结果分析:从输出结果可以看出它们的地址是不一样的,也就是说创建了一个新的对象,而不是将原来对象的地址赋值给一个新的对象引用变量,称为对象拷贝。注意:深拷贝和浅拷贝都是对象拷贝2.浅拷贝(1),定义拷贝对象的所有变量都包含与原对象相同的值,所有对其他对象的引用仍然指向原对象。也就是说,对象的浅拷贝会复制“主”对象,但不会复制主对象内部的对象。“内部对象”将在原始对象及其副本之间共享。总之,浅拷贝只拷贝所考虑的对象,而不是它所指的对象(2),浅拷贝实例包com.test;publicclassShallowCopy{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Teacher老师=newTeacher();teacher.setName("黎曼");teacher.setAge(27);Student2student1=newStudent2();student1.setName("埃德加");student1.setAge(18);student1.setTeacher(老师);Student2student2=(Student2)student1.clone();System.out.println("复制后");System.out.println(student2.getName());System.out.println(student2.getAge());System.out.println(student2.getTeacher().getName());System.out.println(student2.getTeacher().getAge());System.out.println("修改老师的After信息------------");//修改教师信息teacher.setName("Games");System.out.println(student1.getTeacher().getName());System.out.println(student2.getTeacher().getName());}}classTeacherimplementsCloneable{privateStringname;私人年龄;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}}classStudent2implementsCloneable{privateStringname;私人年龄;私人教师;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicTeachergetTeacher(){返回老师;}publicvoidsetTeacher(Teacherteacher){this.teacher=teacher;}publicObjectclone()抛出CloneNotSupportedException{Objectobject=super.clone();返回对象;}}输出结果:贝后edgar18riemann27修改教师信息后------------GamesGames结果分析:student1和student2这两个引用指向两个不同的对象,但是student1和student2这两个引用中的两个teacher引用指向了它是同一个对象,所以描述是浅拷贝。3、深拷贝(1),深拷贝的定义是一个完整的独立对象拷贝,深拷贝会拷贝所有的属性,拷贝属性指向的动态分配的内存。当一个对象与其引用的对象一起被复制时,就会发生深拷贝。深拷贝比浅拷贝更慢且更昂贵。简而言之,深拷贝将被拷贝对象引用的所有对象都拷贝了一遍。(2)、深拷贝实例包com.test;publicclassDeepCopy{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Teacher2teacher=newTeacher2();teacher.setName("黎曼");teacher.setAge(27);Student3student1=newStudent3();student1.setName("埃德加");student1.setAge(18);student1.setTeacher(老师);Student3student2=(Student3)student1.clone();系统输出。println("复制后");System.out.println(student2.getName());System.out.println(student2.getAge());System.out.println(student2.getTeacher().getName());System.out.println(student2.getTeacher().getAge());System.out.println("修改教师信息后------------");//修改教师信息teacher.setName("Games");System.out.println(student1.getTeacher().getName());System.out.println(student2.getTeacher().getName());}}班级Teacher2实现Cloneable{privateStringname;私人年龄;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}}classStudent3implementsCloneable{privateStringname;私人年龄;私人教师2老师;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicTeacher2getTeacher(){返回老师;}publicvoidsetTeacher(Teacher2teacher){this.teacher=teacher;}publicObjectclone()throwsCloneNotSupportedException{//浅拷贝时://Objectobject=super.clone();//返回对象;//改为深拷贝:Student3student=(Student3)super.clone();//本来是浅拷贝,现在把Teacher对象拷贝一份,重新setstudent.setTeacher((Teacher2)student.getTeacher().clone());返校生;}}输出结果:复制后edgar18riemann27修改教师信息------------Gamesriemann结果分析:两个引用student1和student2指向两个不同的对象,两个引用中的两个teacher引用student1和student2指向两个对象,但是teacher对象的修改只能影响到student1对象,所以是深拷贝。Java深拷贝和浅拷贝的区别你了解了吗?
