多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
深克隆与浅克隆不同是:无论对象 A 的成员变量是基本数据类型还是引用类型,都会复制一份,得到独立的两个对象,互不影响。 <br/> 实现深克隆的步骤如下: **1. 两个实体类** ```java @Data @NoArgsConstructor @AllArgsConstructor public class Grade implements Cloneable { private String name; /** * 重写 Object 的 clone 方法来克隆Grade自身 */ @Override public Grade clone() throws CloneNotSupportedException { return (Grade) super.clone(); } } ``` ```java @Data @NoArgsConstructor @AllArgsConstructor public class Student implements Cloneable { private String name; private int age; /** * 在 Student 里面放一个 Grade 引用对象 */ private Grade grade; /** * 重写 Object 的 clone 方法来复制 Student 自己 */ @Override public Student clone() throws CloneNotSupportedException { //克隆Student Student student = (Student) super.clone(); //克隆Grade student.setGrade(grade.clone()); return student; } } ``` **2. 测试** ```java @Test public void deep() throws CloneNotSupportedException { Student stu01 = new Student("张三", 18, new Grade("大一")); //复制stu01给stu02 Student stu02 = stu01.clone(); //结果输出为 false,说明复制成功,得到了两个独立的实例 System.out.println(stu01 == stu02); /* 那么下面来看一下对于引用对象 Grade 是否复制成功 */ //stu01.Grade.name:大一 System.out.println("stu01.Grade.name:" + stu01.getGrade().getName()); //改变stu02中的Grade对象 stu02.getGrade().setName("大二"); //stu02.Grade.name:大二 System.out.println("stu02.Grade.name:" + stu02.getGrade().getName()); //stu01.Grade.name:大一 System.out.println("stu01.Grade.name:" + stu01.getGrade().getName()); } ``` 由测试的结果可以看出,将`stu01`复制给`stu02`之后,`stu01`里面的引用对象 Grade 也同被复制了一份给`stu02`,且对`stu02`的 Grade 做修改不影响到`stu01`的 Grade,这就是深克隆。