深克隆与浅克隆的概念(deep clone shallow clone)

深克隆与浅克隆的概念


一:


浅克隆:被复制对象的所有变量都含有与原来的对象相同的值,面所有的对其他对象的
引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用
的对象(就是只复制对应所复制的对象)
深克隆 :
被复制的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量
。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对
象。深复制就是把要复制的对象和引用的对象都复制一遍 把整个过程都复制一遍。


二:clone方法满足条件


clone方法将对象复制一份返回给调用的人
2.1 对于任何对象x,都有x.clone != x 克隆的对象与原对像不是一个对象
2.2 对于任何对象x,都有 x.clone.getClass == x.getClass  class表示类型 克
隆的类型与原类型一样。
2.3 对于x的equals()的方法 ,并且重写equals恰当的话 会有x.clone().equals
(x) 返回true 相等。比较的是内容。

三:Java中对象的克隆


1.我们要获取对象的一份复制文件,我们可以利用Java的Object类的clone()方法
2..在派生类中覆盖的基类的clone()方法,要声明public类 (因为原生的clone方
法是private私有的受保护的 ,我们声明为公共的可以调用)

3.在派生类的clone()方法中,调用super.clone()。 (在第一行调用,因为在运行
的时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空
间,并进行对象的复制,将原始对象的内容--复制到新的对象存储空间中;继承自
Java.lang.Object类的 clone()方法是浅复制)
4.在派生类中实现Cloneable接口。


四:实现clone()的浅复制(代码) 创建一个学生类 使用复制必须实现 

Cloneable接口

package Test;

/**
 * @author Administrator
 */
public class Students1 implements Cloneable {
    private String name;
    private int age;

    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;
    }

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

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

4.2实现main方法

4.3 从侧面证明了 X.clone () != x  浅复制 只是对目标对象进行复制

五:实现clone()的浅复制(代码)

public class Teacher implements Cloneable {
    private String name;
    private int age;
    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;
    }
}
package Test;

/**
 * @author Administrator
 */
public class Students12 implements Cloneable {
    private String name;
    private int age ;
    private Teacher teacher;

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    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;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        Object object = super.clone();
        return object;
    }
}
package Test;

/**
 * @author Administrator
 */
public class TeacherCloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {
     Teacher teacher = new Teacher();
     teacher.setName("张老师");
     teacher.setAge(40);

     Students12 s1 = new Students12();
     s1.setName("张三");
     s1.setAge(20);
     s1.setTeacher(teacher);

     Students12 s2 = (Students12) s1.clone();
        System.out.println(s2.getName());
        System.out.println(s2.getAge());

        teacher.setName("li");
        System.out.println(s2.getTeacher().getName());
        System.out.println(s2.getTeacher().getAge());
    }

}

5.结果为

所以我们 要在 Teacher 进行复制  然后在Student112里面 复制 

代码 改变为

package Test;

/**
 * @author Administrator
 */
public class Teacher implements Cloneable {
    private String name;
    private int age;
    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;
    }

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


package Test;

/**
 * @author Administrator
 */
public class Students12 implements Cloneable {
    private String name;
    private int age ;
    private Teacher teacher;

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    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;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
       Students12 students12 = (Students12) super.clone();
       students12.setTeacher((Teacher) students12.getTeacher().clone());
       return students12;
       
    }
}


5.2main 方法里面不变 

完成。即使修改了对象也不改变 已复制过的值 (。深复制就是把要复制的对象和引用的对象都复制一遍 把整个过程都复制一遍。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值