iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java Cloneable接口的深拷贝与浅拷贝方法
  • 478
分享到

Java Cloneable接口的深拷贝与浅拷贝方法

2023-06-29 13:06:22 478人浏览 安东尼
摘要

本篇内容主要讲解“Java Cloneable接口的深拷贝与浅拷贝方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Cloneable接口的深拷贝与浅拷贝方法”吧!

本篇内容主要讲解“Java Cloneable接口的深拷贝与浅拷贝方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Cloneable接口的深拷贝与浅拷贝方法”吧!

    Cloneable接口源码

    Cloneable接口:

    实现此接口的类——可被推断java.lang.Object的clone()方法可以被合法调用-以实现类实例:属性到属性的拷贝。

    如果一个类未实现Cloneable接口,那么调用clone()方法时,会抛出CloneNotSupportedException异常。

    通常,实现了Cloneable接口的子类,应当以public访问权限重写clone()方法(尽管java.Object类中的clone方法是protected类型的)

    应当认识到:Cloneable接口没有包含clone()方法,因此,如果仅仅是implements了Cloneable接口,那么也是无法正常克隆对象的

    [原因:即使是反射性地调用了克隆方法,也不能保证它一定会成功]——个人理解就是:是否重写Clone()方法、或者“浅拷贝与深拷贝”问题的存在所导致的。

    class Pet implements Cloneable{    //properties    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    public Pet() {    }    public Pet(String name) {        this.name = name;    }    @Override    public String toString() {        return "Pet{" +                "name='" + name + '\'' +                '}';    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Pet pet = (Pet) o;        return Objects.equals(name, pet.name);    }    @Override    public int hashCode() {        return Objects.hash(name);    }//    @Override//    public Pet clone() {//        try {//            return (Pet)super.clone();//        } catch (CloneNotSupportedException e) {//            e.printStackTrace();//        }//        return null;//    }}

    浅拷贝案例

    Pet类定义

    注意到:Pet类实现了Cloneable接口,但是没有重写Clone()方法(显然:此时Pet类不具备对象克隆的能力)。

    class Pet implements Cloneable{    //properties    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    public Pet() {    }    public Pet(String name) {        this.name = name;    }    @Override    public String toString() {        return "Pet{" +                "name='" + name + '\'' +                '}';    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Pet pet = (Pet) o;        return Objects.equals(name, pet.name);    }    @Override    public int hashCode() {        return Objects.hash(name);    }//    @Override//    public Pet clone() {//        try {//            return (Pet)super.clone();//        } catch (CloneNotSupportedException e) {//            e.printStackTrace();//        }//        return null;//    }}

    Person类定义

    注意到:Person类实现了Cloneable接口,也重写Clone()方法。那么,是否Person类就具备了对象克隆的能力呢?(由于浅拷贝问题的存在,认为这种对象克隆能力是不完整的、有缺陷的)。

    class Pet implements Cloneable{    //properties    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    public Pet() {    }    public Pet(String name) {        this.name = name;    }    @Override    public String toString() {        return "Pet{" +                "name='" + name + '\'' +                '}';    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Pet pet = (Pet) o;        return Objects.equals(name, pet.name);    }    @Override    public int hashCode() {        return Objects.hash(name);    }//    @Override//    public Pet clone() {//        try {//            return (Pet)super.clone();//        } catch (CloneNotSupportedException e) {//            e.printStackTrace();//        }//        return null;//    }}

    浅拷贝问题-代码测试

    为什么说:此时Person类的对象克隆能力是不完整的、有缺陷的?因为此时,在通过Person对象调用clone()方法,克隆对象时,其成员属性pet(Pet类的对象)值的克隆,仅仅是对堆区内存地址的简单拷贝。

    即:说白了,Person对象和克隆出来的对象,其pet属性值共享同一块堆区内存。——问题显而易见:当对克隆出来的对象的pet属性进行set操作时,显然会影响到原始Person对象的pet属性值。

    代码演示如下:

      //methods    public static void main(String[] args) throws CloneNotSupportedException {        testPerson();    }    public static void testPerson() throws CloneNotSupportedException {        Person p=new Person("张三",14,new Pet("小黑"));        System.out.println(p);        Person clone = (Person)p.clone();        System.out.println(clone);        System.out.println(p.equals(clone));        System.out.println(p.getPet()==clone.getPet());        System.out.println("************");        clone.setAge(15);        System.out.println(p);        System.out.println(clone);        System.out.println(p.equals(clone));        System.out.println("************");        clone.getPet().setName("小黄");        System.out.println(p);        System.out.println(clone);        System.out.println(p.equals(clone));        System.out.println(p.getPet()==clone.getPet());    }

    Java Cloneable接口的深拷贝与浅拷贝方法

    深拷贝案例

    那么,如何实现深拷贝呢?关键就在上述案例中,被注释的几行代码中。

    Pet类重写clone()方法

    Java Cloneable接口的深拷贝与浅拷贝方法

    Person的clone()方法中调用Pet的clone方法

    Java Cloneable接口的深拷贝与浅拷贝方法

    浅拷贝问题解决-深拷贝代码测试

    测试代码不变,再次运行:

    Java Cloneable接口的深拷贝与浅拷贝方法

    到此,相信大家对“Java Cloneable接口的深拷贝与浅拷贝方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: Java Cloneable接口的深拷贝与浅拷贝方法

    本文链接: https://www.lsjlt.com/news/325028.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java Cloneable接口的深拷贝与浅拷贝方法
      本篇内容主要讲解“Java Cloneable接口的深拷贝与浅拷贝方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Cloneable接口的深拷贝与浅拷贝方法”吧!...
      99+
      2023-06-29
    • Java Cloneable接口的深拷贝与浅拷贝详解
      Java中的Cloneable接口是一个标记接口,用于标识一个类可以被克隆。该接口没有定义任何方法,但是在使用clone()方法进行...
      99+
      2023-08-17
      Java
    • Java Cloneable接口的深拷贝与浅拷贝详解
      目录Cloneable接口源码浅拷贝案例Pet类定义Person类定义浅拷贝问题-代码测试深拷贝案例Pet类重写clone()方法Person的clone()方法中调用Pet的clo...
      99+
      2024-04-02
    • 浅拷贝与深拷贝
         名词解释 1.对象:被分配的一块内存,存储其所代表的值 2.引用:是自动形成的从变量到对象的指针 3.注意:类型(int类型,long类型(python3已去除long类型,只剩下int类型的数据))属于对象,不是变量 4.不可变...
      99+
      2023-01-30
    • python深拷贝与浅拷贝
      可变对象与不可变对象 要理解深拷贝和浅拷贝,首先要理解可变对象和不可变对象。 不可变对象:该对象所指向的内存中的值不能被改变,修改对象的值时,由于其指向的值不能被改变,因此实际上是在内存中重新开辟一个地址用来存储新的值,然后将对象指向这个...
      99+
      2023-01-30
      python
    • python之浅拷贝与深拷贝
      浅拷贝是对于一个对象的顶层拷贝通俗的理解是:拷贝了引用,并没有拷贝内容 In [10]: a = [11,22,33] In [11]: b = a In [12]: id(a) Out[12]: 140343572333832 I...
      99+
      2023-01-31
      python
    • Python深拷贝与浅拷贝引用
      目录(1)、存在父对象和子对象(2)、如果只存在父对象前言: 在Python中,对象赋值在本质上是对对象的引用,当创建一个对象把它赋值给另一个变量的时候,Python并没有拷贝这个对...
      99+
      2024-04-02
    • Java的深拷贝与浅拷贝怎么使用
      在Java中,对象的拷贝分为浅拷贝和深拷贝两种方式。浅拷贝是指创建一个新的对象,然后将原对象的非静态字段值复制到新对象中。新对象和原...
      99+
      2023-08-18
      Java
    • Java中的集合及深拷贝与浅拷贝
      Java中的集合及深拷贝与浅拷贝 Java是一种面向对象的编程语言,其中集合是常用的数据结构之一,具有方便快捷的特点。在Java开发中,我们常常需要对集合进行复制(拷贝)操作。但是,拷贝操作并不是简单...
      99+
      2023-09-16
      java
    • python-浅拷贝(copy)与深拷贝(deepcopy)
      一:对象与元素、可变与不可变:        (1)对象:对象有存储地址id【就好像某个地址的快递仓库】,对象中的元素都有一个地址id【就像仓库的某某货架】        (2)对象与对象的元素:(对象)或(对象中的元素)有不同的类型【数字...
      99+
      2023-09-03
      数学建模
    • Java中深拷贝,浅拷贝与引用拷贝的区别详解
      目录引用拷贝浅拷贝深拷贝小结引用拷贝 引用拷贝: 引用拷贝不会在堆上创建一个新的对象,只 会在栈上生成一个新的引用地址,最终指向依然是堆上的同一个对象。 //实体类 public c...
      99+
      2024-04-02
    • python浅拷贝与深拷贝使用方法详解
      目录一、对象赋值二、浅拷贝三、深拷贝四、深入解析浅拷贝和深拷贝在面试和日常的开发中都会经常遇到 我们就从 对象赋值、浅拷贝、深拷贝 三个方面来讲 一、对象赋值 In [1]: lis...
      99+
      2022-11-13
      python浅拷贝与深拷贝 python深拷贝 python浅拷贝
    • Python中的深拷贝浅拷贝
      什么是浅拷贝,什么是深拷贝? 一、浅拷贝 浅拷贝就是:拷贝了引用,并没有拷贝内容,和在Linux中的硬链接有些类似,在python中,使用=赋值的动作就是一个浅拷贝 浅拷贝中的新旧对象,共用一个内存地...
      99+
      2023-09-08
      python 开发语言
    • Python列表的浅拷贝与深拷贝
      目录一、浅拷贝(均是只对第一层进行深拷贝)1. for循环依次赋值2. 使用copy()函数3. 使用列表生成式4. 使用索引 [:]二、深拷贝对列表深拷贝就是无论怎样改动新列表(单...
      99+
      2024-04-02
    • Python:列表的浅拷贝与深拷贝
      相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.htmlspm=1001.2014.3001.5482         在python语言中,因为其...
      99+
      2023-09-07
      python 开发语言
    • JavaScript深拷贝与浅拷贝是什么
      这篇文章主要介绍了JavaScript深拷贝与浅拷贝是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1 浅拷贝概念深拷贝和浅拷贝是只针对Object和Array这样的引用...
      99+
      2023-06-29
    • Java深拷贝与浅拷贝的区别是什么
      这篇文章主要介绍“Java深拷贝与浅拷贝的区别是什么”,在日常操作中,相信很多人在Java深拷贝与浅拷贝的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java深拷...
      99+
      2024-04-02
    • Java的深拷贝与浅拷贝有什么不同
      在Java中,深拷贝和浅拷贝是两种不同的复制方式。浅拷贝是指将对象的引用复制给另一个对象,这样新对象和原对象引用的是同一个内存地址,...
      99+
      2023-08-18
      Java
    • JavaScript中深拷贝与浅拷贝详解
      目录1 浅拷贝概念2 深拷贝概念3 浅拷贝的实现方式3.1 Object.assign()3.2 Array.prototype.concat()3.3 Array.pro...
      99+
      2024-04-02
    • Golang中深拷贝与浅拷贝详解
      目录什么是深拷贝?什么是浅拷贝?示例代码小结什么是深拷贝? 深拷贝(Deep Copy)是指原对象与拷贝的新对象互相独立,对其中任何一个对象的改动都不会对另外一个对象造成影响。值类型...
      99+
      2023-05-19
      Golang 深拷贝与浅拷贝 Golang深拷贝 Golang浅拷贝 Golang拷贝
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作