如何实现Cloneable接口?深拷贝和浅拷贝的区别?

简介: 如何实现Cloneable接口?深拷贝和浅拷贝的区别?

1.如何实现Clonable接口?


Object 类中存在一个 clone 方法 , 调用这个方法可以创建一个对象的 " 拷贝 ". 但是要想合法调用 clone 方法 , 必须要 先实现 Clonable 接口 , 否则就会抛出 CloneNotSupportedException 异常。

实现Cloneable接口,需要注意一下四步:


第一步:一个类首先先实现Clonable接口

class Money implements Cloneable

第二步:重写clone方法

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

第三步:main函数抛异常

public static void main(String[] args) throws CloneNotSupportedException

第四步:类型转换 ,因为clone是Object的方法,此时也叫做向下转型

Person person2 = (Person)person.clone();


2. 什么是浅拷贝? 什么是深拷贝?


Cloneable 拷贝出的对象是一份“浅拷贝”。

观察如下代码:

class Money {
  public double m = 99.99; 
}
class Person implements Cloneable{
  public Money money = new Money(); 
  @Override
  protected Object clone() throws CloneNotSupportedException { 
    return super.clone(); 
  } 
}
public class TestDemo3 {
  public static void main(String[] args) throws CloneNotSupportedException { 
    Person person1 = new Person(); 
    Person person2 = (Person) person1.clone(); 
    System.out.println("通过person2修改前的结果"); 
    System.out.println(person1.money.m);
    System.out.println(person2.money.m);
    person2.money.m = 13.6; 
    System.out.println("通过person2修改后的结果"); 
    System.out.println(person1.money.m); 
    System.out.println(person2.money.m); 
  } 
}
// 执行结果 
通过person2修改前的结果 
99.99 
99.99 
通过person2修改后的结果 
13.6
13.6

1667910845203.jpg


 如上代码,我们可以看到,通过clone,我们只是拷贝了Person对象。但是Person对象中的Money对象,并没有拷贝。通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。这里就是发生了浅拷贝。


深拷贝要求把引用money也需要改变。代码如下:

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

1667910859972.jpg

相关文章
|
5月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
|
4月前
|
安全 Java
深拷贝和浅拷贝的区别
深拷贝和浅拷贝的区别
|
5月前
|
JSON JavaScript 前端开发
深拷贝的3种常用方法
`深拷贝是一种保持数据独立性和完整性的重要手段,在许多场景下都是不可或缺的操作。
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
86 0
|
设计模式 Java Spring
设计模式之原型模式(Cloneable接口、浅拷贝、深拷贝)
设计模式之原型模式(Cloneable接口、浅拷贝、深拷贝)
73 0
|
Java
【Java】深拷贝和浅拷贝,Cloneable接口
【Java】深拷贝和浅拷贝,Cloneable接口
184 0
【Java】深拷贝和浅拷贝,Cloneable接口
|
JavaScript 前端开发 Java
一文搞懂浅拷贝与深拷贝到底有什么区别
一文搞懂浅拷贝与深拷贝到底有什么区别
153 0
|
存储 JavaScript 前端开发
每日一题:深拷贝浅拷贝的区别?如何实现一个深拷贝?
每日一题:深拷贝浅拷贝的区别?如何实现一个深拷贝?
169 0
每日一题:深拷贝浅拷贝的区别?如何实现一个深拷贝?
|
虚拟化 开发者 Python
深拷贝和浅拷贝的区别 | 学习笔记
快速学习 深拷贝和浅拷贝的区别
123 0
深拷贝和浅拷贝的区别 | 学习笔记
|
存储 算法 JavaScript
图解对象之:深拷贝与浅拷贝
图解对象之:深拷贝与浅拷贝
126 0
图解对象之:深拷贝与浅拷贝