有一个Teacher类 属性:int age;String name;Student s
学生类Student 属性:int age;String name;Star s
明星类Star 属性:int age,String name
尝试深度克隆Teacher对象
结合String的不可变性,思考String虽是引用数据类型,需要进行深度克隆吗?(不需要)
package com.company;
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher = new Teacher(18, "吴大帅", new Student(15, "高富帅", new Star(12, "杨超越")));
Teacher clonez = (Teacher) teacher.clone();
System.out.println("修改值Star的name前:");
System.out.println(teacher);
System.out.println("修改值Star的name后:");
clonez.s.s.name = "XX漫舞";
System.out.println(clonez);
}
}
class Teacher implements Cloneable {
int age;
String name;
Student s;
public Teacher() {
}
public Teacher(int age, String name, Student s) {
this.age = age;
this.name = name;
this.s = s;
}
@Override
public Object clone() throws CloneNotSupportedException {
Object clone = super.clone();//基于Teache创建Object父类克隆对象clone
Teacher cloneTeacher = (Teacher) clone;//将clone克隆对象转换成Teacher类型的克隆对象
Object clone1 = this.s.clone();//基于Student对象s创建Object父类克隆对象clone1
Student cloneStudent = (Student) clone1;//将clone1克隆对象转换成Student类型的克隆对象
cloneTeacher.s = cloneStudent;//将Teacher的克隆对象cloneTeacher中成员变量s的引用指向Student克隆对象cloneStudent
return cloneTeacher;//返回Teacher类型的克隆对象cloneTeacher
}
@Override
public String toString() {
return "Teacher{" +
"age=" + age +
", name='" + name + '\'' +
", s=" + s +
'}';
}
}
class Student implements Cloneable {
int age;
String name;
Star s;
public Student() {
}
public Student(int age, String name, Star s) {
this.age = age;
this.name = name;
this.s = s;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object clone2 = super.clone();
Student cloneStudent = (Student) clone2;
Object clone3 = this.s.clone();
Star cloneStar = (Star) clone3;
cloneStudent.s = cloneStar;
return cloneStudent;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", s=" + s +
'}';
}
}
class Star implements Cloneable {
int age;
String name;
public Star(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Star{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
输出:
修改值Star的name前:
Teacher{age=18, name='吴大帅', s=Student{age=15, name='高富帅', s=Star{age=12, name='杨超越'}}}
修改值Star的name后:
Teacher{age=18, name='吴大帅', s=Student{age=15, name='高富帅', s=Star{age=12, name='XX漫舞'}}}