【Java篇】——浅拷贝or深拷贝

目录

克隆步骤

拷贝

浅拷贝

深拷贝

源代码


克隆步骤

Java 中内置了一些很有用的接口 , Clonable 就是其中之一 .【一般接口都是able来设定的,able是可以..的表示一种能力】
Object 类中存在一个 clone 方法 , 调用这个方法可以创建一个对象的 " 拷贝 ". 但是要想合法调用 clone 方法 , 必须要先实现 Clonable 接口 , 否则就会抛出 CloneNotSupportedException 异常 .

我们需要重写Override方法中的clone方法。

【Java篇】——浅拷贝or深拷贝_第1张图片

 代码的底层是不可以见的。


❗调用clone()方法的返回值是Object类 ,而我们拷贝给子类,所以需要强制类型转换。

【Java篇】——浅拷贝or深拷贝_第2张图片

❗ 抛出异常问题,后面说到异常的时候我会详细说清楚

【Java篇】——浅拷贝or深拷贝_第3张图片


实现克隆我们需要四个步骤:
第一步:声明接口implements Cloneable

第二步:重写clone()方法

第三步:声明异常 throws CloneNotSupportedException

第四步:向下转型(强转)因为clone()返回的是父类,父类拷贝给子类,需要向下转型。

【Java篇】——浅拷贝or深拷贝_第4张图片


拷贝

【Java篇】——浅拷贝or深拷贝_第5张图片

克隆之后的值确实相等的值。

【Java篇】——浅拷贝or深拷贝_第6张图片


浅拷贝

class Money{
    public double money=12.5;
}
class Student implements Cloneable{
    int age;
    public Money money=new Money();
    public Student(int age) {
        this.age = age;
    }

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

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

我们在Student类里定义一个Money类,相当于Student的成员;

【Java篇】——浅拷贝or深拷贝_第7张图片

money对象指向了自己的成员变量money值为12.5

现在我们将student1拷贝给student2,我们可以看到他们的money值是一样的。

【Java篇】——浅拷贝or深拷贝_第8张图片指向的是同一块空间。

【Java篇】——浅拷贝or深拷贝_第9张图片

如果我们修改money的值呢?

【Java篇】——浅拷贝or深拷贝_第10张图片【Java篇】——浅拷贝or深拷贝_第11张图片

我们改变student2里面money指向的对象的值,也同时改变了student中money指向的值,因为我们只是拷贝了student里面的成员,而没有给成员的成员拷贝,所以都还是指向了同一块空间,改变money的值就会让都改变。这就是浅拷贝


深拷贝

我们需要给money指向的成员也创建一个空间

【Java篇】——浅拷贝or深拷贝_第12张图片

ox87空间的money修改,不会影响0x99里的money的值。这叫深拷贝。

我们就像Student克隆的步骤都进行一遍。

【Java篇】——浅拷贝or深拷贝_第13张图片

  protected Object clone() throws CloneNotSupportedException {
        Student tmp=(Student) super.clone();
        tmp.money=(Money) this.money.clone();
        return tmp;
    }

创建一个临时对象,然后super.clone(),因为super是自己的父类,我们需要向下转型,强转,给Student类里的成员拷贝,然后我们继续给Student里面的成员Money类创建的成员拷贝,需要调用当前对象的this。

【Java篇】——浅拷贝or深拷贝_第14张图片


源代码

package CloneClass;

class Money implements Cloneable{
    public double money=12.5;

    @Override
    protected Object clone() throws CloneNotSupportedException {
       return super.clone();
    }
}
class Student implements Cloneable{
    int age;
    public Money money=new Money();
    public Student(int age) {
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student tmp=(Student) super.clone();
        tmp.money=(Money) this.money.clone();
        return tmp;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
}
public class Test1 {
    public static void main(String[] args)throws CloneNotSupportedException  {
//        Student student1=new Student(10);
//        Student student2=(Student) student1.clone();
//        System.out.println(student1);
//        System.out.println(student2);
        System.out.println("修改前==============");
        Student student1=new Student(10);
        Student student2=(Student) student1.clone();
        System.out.println("studetn1::"+student1.money.money);
        System.out.println("student2::"+student2.money.money);
        System.out.println("修改后==============");
        student1.money.money=199.99;
        System.out.println("studetn1::"+student1.money.money);
        System.out.println("student2::"+student2.money.money);
    }
}

你可能感兴趣的:(java,java,开发语言)