当前位置: 首页 > news >正文

clone()方法

529c96694b434ec8903f0e9b7d918baf.gif在Java中,clone() 方法是一个非常有趣且强大的工具,用于创建对象的一个副本。这个方法位于 Object 类中,因此可以被所有类使用。让我们讨论一下它的几个要点:

 

什么是克隆?

克隆就是创建一个对象的新副本,这个副本在功能上与原对象相同。在Java中,默认的 clone() 方法执行的是浅拷贝,也就是说,它复制非静态变量值的一个副本。如果对象内部还持有其他对象的引用,那么这些引用也会被复制,而不是那些对象本身。这意味着,原始对象和克隆对象将共享相同的内存地址。

浅拷贝与深拷贝

  1.浅拷贝:只有顶层对象是非引用的,底层对象仍然是引用。

  2.深拷贝:整个对象树都是非引用的,每个对象都独立存在于另一个内存位置。

如何使用 clone()

要使用 clone(),你需要实现 Cloneable 接口并且重写 clone() 方法。这是因为默认的 clone() 方法会检查当前对象是否实现了 Cloneable 接口。如果没有,它会抛出 CloneNotSupportedException。下面是如何使用 clone() 的一个简单例子:

public class CloneExample implements Cloneable {

    int value;

 

    public CloneExample(int value) {

        this.value = value;

    }

 

    @Override

    protected Object clone() throws CloneNotSupportedException {

        return super.clone();

    }

 

    public static void main(String[] args) {

        CloneExample original = new CloneExample(5);

        try {

            CloneExample cloned = (CloneExample) original.clone();

            // cloned 和 original 是两个独立的对象,拥有相同的初始值

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();

        }

    }

}

 

注意事项

  1.你必须处理 CloneNotSupportedException,要么通过使用 try-catch 块,要么通过显式抛出。

  2.默认的 clone() 方法只进行浅拷贝,如果你需要深拷贝,你需要手动编写代码来实现。

  3.如果你决定使用克隆,请注意,它可能会使对象的状态变得复杂,因为多个对象可能看起来是相似的,但实际上并不是同一个对象。

 

相关文章:

  • 无人机人员搜救
  • 看看这组B端规范,你就会感叹:钱真是万能的。
  • 推荐 2个功能强大的黑科技工具,真的会让你直呼卧槽
  • 工厂自动化相关设备工业一体机起到什么作用?
  • C++ 彻底搞懂指针(终章)
  • 数据库的视图
  • 由俭入奢易,由奢入俭难
  • 双剑合璧:双阶段目标检测算法与单阶段的较量
  • 第11章 规划过程组(二)(11.8排列活动顺序)
  • 【Whisper】WhisperX: Time-Accurate Speech Transcription of Long-Form Audio
  • 如何在Windows上使用Docker搭建PHP开发环境
  • 秋招力扣刷题——从前序与中序遍历序列构造二叉树
  • 【报错解决】ValueError: Compression type zstd not supported
  • 【LeetCode】十三、分治法:多数元素 + 最大子序列和
  • 【Linux】【部署】主机初始化
  • 【React系列】如何构建React应用程序
  • Centos6.8 使用rpm安装mysql5.7
  • ComponentOne 2017 V2版本正式发布
  • CSS实用技巧干货
  • Docker容器管理
  • egg(89)--egg之redis的发布和订阅
  • gf框架之分页模块(五) - 自定义分页
  • Intervention/image 图片处理扩展包的安装和使用
  • Java IO学习笔记一
  • javascript 总结(常用工具类的封装)
  • JS字符串转数字方法总结
  • Mysql5.6主从复制
  • nodejs实现webservice问题总结
  • node和express搭建代理服务器(源码)
  • REST架构的思考
  • SAP云平台里Global Account和Sub Account的关系
  • Swoft 源码剖析 - 代码自动更新机制
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 经典排序算法及其 Java 实现
  • 使用docker-compose进行多节点部署
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (02)vite环境变量配置
  • (C语言)fgets与fputs函数详解
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)计算机毕业设计高校学生选课系统
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)shell调试方法
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Reactor简单使用教程
  • .net操作Excel出错解决
  • .NET下ASPX编程的几个小问题
  • [2016.7 test.5] T1
  • [20161214]如何确定dbid.txt