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

本文介绍了在Java中如何使用`Cloneable`接口实现对象克隆,区分浅拷贝(只复制引用,修改其中一个会影响另一个)和深拷贝(复制成员变量的值,修改一个不影响另一个),并提供了示例代码和实际操作演示。
摘要由CSDN通过智能技术生成

目录

🚩克隆步骤

🚩拷贝

🎈浅拷贝

🎈深拷贝

🚩源代码


🚩克隆步骤

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

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

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


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

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


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

第二步:重写clone()方法

第三步:声明异常 throws CloneNotSupportedException

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


🚩拷贝

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


🎈浅拷贝

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的成员;

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

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

指向的是同一块空间。

如果我们修改money的值呢?

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


🎈深拷贝

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

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

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

  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。


🚩源代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值