Clone克隆拷贝

实现clone标记行接口的类,可以进行克隆
对象.clone()
克隆之后两者地址不同但是只是浅度拷贝,基本类型会被拷贝,但是引用类型拷贝的只是地址
若对对象1的引用类型进行修改。拷贝之后类型2的引用类型也会被修改所以是浅浅的拷贝
这就是一个浅度拷贝
1.改写clone方法
2.实现cloneable接口,
3.改变重写后方法权限

package com.company;

public class Student implements Cloneable {
    private String name;
    private int age;
    private Skill skill;//这是一个类,另一个类所支持的引用数据类型

    public Skill getSkill() {
        return skill;
    }

    public void setSkill(Skill skill) {
        this.skill = skill;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //重写clone方法时候,记得把作用权限给改一改

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

引用类型的定义

package com.company;

public class Skill {
    private String skills;

    public String getSkills() {
        return skills;
    }

    public void setSkills(String skills) {
        this.skills = skills;
    }
}

这种浅度拷贝,调用的父类方法,只是拷贝了父类的引用类型的地址
这样复制完成以后引用类型一旦被修改,复制之后的引用类型也会被修改

1.深度拷贝,直接将引用类型也拷贝一份,直接赋值给类的成员变量
让成员变量里面不再装的是引用数据类型的地址,将地址值直接变成是一个数值
首先让引用类型也变成可以拷贝的状态

package com.company;
//首先让引用类型也变成可以拷贝的
public class Skill implements Cloneable{
    private String skills;

    public String getSkills() {
        return skills;
    }

    public void setSkills(String skills) {
        this.skills = skills;
    }

    @Override
    public String toString() {
        return "Skill{" +
                "skills='" + skills + '\'' +
                '}';
    }

    public Skill(String skills) {
        this.skills = skills;
    }

    public Skill() {
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

然后修改主类型中的clone方法,修改很简单
1.问题是,引用类中,装的是地址值
2、修改方法,改变clone方法,认为的去复制引用类的值,将引用成员中地址值,换成引用类里面的值。

package com.company;

public class Student implements Cloneable {
    private String name;
    private int age;
    private Skill skill;//这是一个类,另一个类所支持的引用数据类型

    public Skill getSkill() {
        return skill;
    }

    public void setSkill(Skill skill) {
        this.skill = skill;
    }

    public Student() {
    }

    public Student(String name, int age, Skill skill) {
        this.name = name;
        this.age = age;
        this.skill = skill;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //重写clone方法时候,记得把作用权限给改一改

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", skill=" + skill +
                '}';
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Student student = (Student) super.clone();//原本是调用祖传clone方法返回一个自己,现在选择将返回的自己交给一个自己这个类
        //上面得到的就是一个克隆完成的Student类,唯一的缺点就是引用数据类装的是地址
        //我要让引用数据类型不再装地址,而是装上我(student这个类,装载好的对象中引用类型的值,this就代表调用本类)
         
        //目前的this.skill里面,装的是引用类型的地址值,我们要将这个地址值中装的数据拿出来,放进一会要返回的student里面
        Skill skill = (Skill) this.skill.clone();//将this.skill中装的地址中的数据拷贝之后交给一个Skill作为中间交换容器
        student.setSkill(skill);//改变设置好的student中的数值,然后交给一会将要返回的student中去
        
        return student;//最后将这个student返回
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值