Java深度克隆相关题目

有一个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漫舞'}}}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值