`

深度克隆与浅克隆

阅读更多
要想实现某个对象的克隆需要该对象实现java.lang.Cloneable接口。否则单纯调用super.clone()方法会抛出CloneNotSupportedException的异常(运行时异常)。
如下:
public class A {
     public void someMethod() {
         super.clone();    
     } 
}
如果执行对象的someMethod方法就会抛出异常

jvm在运行java类时,如果发现super.clone()方法,会检查调用super.clone()的方法对应的类是否实现了 Cloneable接口,如果实现了就会开放对应的该对象的clone功能。

如下实例
class CloneTest implements Cloneable{
   private String name;
   
   public  CloneTest(String name){
          this.name = name;
   }

   //get、set方法
   public Object clone() throws Exception{
    return super.clone;
}

}

在一个main方法中执行
A a= new A("clone");                
A a2= (A)a.clone();
最后结果会是 a和a2的引用指向的堆地址不一样。而里面的成员变量name的值是一样的。

这种克隆是一种浅克隆。

如果成员变量是一个复杂对象(如list,自定义对象),而不是基本数据类型,则修改克隆对象的对象成员变量会影响原有的对象。
因此要实现深度克隆需要做的是
让自定义成员变量对象也支持深度克隆,并重写clone方法
public Object clone(){
//省略try catch
A a= (A)super.clone();
接着对属性进行克隆
a.element = this.element.clone();//假设A对象含有Element自定义对象
对于list类型的成员变量可以实现
新new出一个list,然后将原有的list中的值设置到新list中

}
 
分享到:
评论

相关推荐

    JAVA浅克隆与深克隆

    NULL 博文链接:https://gegeyi.iteye.com/blog/1562016

    解析JAVA深度克隆与浅度克隆的区别详解

    本篇文章是对JAVA深度克隆与浅度克隆的区别进行了详细的分析介绍,需要的朋友参考下

    浅析Java中clone()方法浅克隆与深度克隆

    Java克隆(Clone)是Java语言的特性之一,本篇文章主要介绍了Java中的Clone机制是如何工作的,需要的朋友可以参考下

    JavaScript浅层克隆与深度克隆示例详解

    主要给大家介绍了关于JavaScript浅层克隆与深度克隆的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    deep-copy-ts:typescriptjavascript的递归深拷贝、克隆和浅拷贝函数

    深拷贝-ts 用于 typescript/javascript 的递归深拷贝、克隆和浅拷贝函数基于 MIT 和 LGPL 许可证可用。

    android 浅复制和深复制-Java Generic Deep Copy 篇

    android 浅复制和深复制-Java Generic Deep Copy 篇

    Java编程实现对象克隆(复制)代码详解

    主要介绍了Java编程实现对象克隆(复制)代码详解,涉及了克隆的原因,如何实现克隆,克隆的一般步骤,深克隆与浅克隆的介绍等相关内容,具有一定借鉴价值,需要的朋友可以参考下。

    C# Lambda快速深度拷贝

    今天上班在班车上和一个同事讨论有关C#拷贝效率的问题,聊到了多种深度拷贝方法,其中就提到了一种Lambda表达式拷贝的方法,这位同事说这种深度拷贝快是快但是如果对象里面再嵌入对象就不能深度拷贝了,只进行浅拷贝...

    c# 深拷贝与浅拷贝的区别分析及实例

    浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

    C++对象的浅复制和深复制详解及简单实例

    C++对象的浅复制和深复制详解及简单实例 浅复制:两个对象复制完成后共享某些资源(内存),其中一个对象的销毁会影响另一个对象 深复制:两个对象复制完成后不会共享任何资源,其中一个对象的销毁不会影响另一个...

    浅拷贝和深拷贝深入理解(shallow copy VS deep copy)

    •深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    Git权威指南

    《git权威指南》是git...第8篇介绍了git的跨平台操作,以及它的钩子和模板、稀疏检出和浅克隆、嫁接和替换等重要特性。第9篇是附录,详细给出了git的命令索引,以及cvs、svn和hg与git的比较与命令对照,方便读者查阅。

    Git权威指南【样张】

    《git权威指南》是git...第8篇介绍了git的跨平台操作,以及它的钩子和模板、稀疏检出和浅克隆、嫁接和替换等重要特性。第9篇是附录,详细给出了git的命令索引,以及cvs、svn和hg与git的比较与命令对照,方便读者查阅。

    codebox:深入了解您最好了解的一些功能

    浅克隆 去抖动 风门 深度平等 得到 getOr 浅相等 浅冻 deepFroze 记住 getType isTypeOf 新的 无极 无极种族 睡觉 独特 唯一的 applyMiddleware 撰写 对象创建 对象分配 种类 插入/拼接

    design-pattern-java.pdf

    算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——...

    deep-copy:节点模块创建JS对象的深层副本

    深度复制ES6类型的实用程序。 以下是受支持的类型, 杰森对象 数字 细绳 布尔型 地图 放 日期 大批 所有其他类型将被浅复制。 入门 克隆仓库 使用“ npm测试”运行测试 先决条件 节点5.4.0及更高版本 ES6中的示例...

    黑马java笔记源码-dmdf:魔兽争霸III:冰封王座修改

    如果克隆存储库时间太长,您可以进行浅克隆或减少克隆深度,而不是克隆整个历史记录。 由于我也推送了二进制地图和活动文件的历史记录,因此历史记录变得相当大。 模型、纹理和声音资源不是这个存储库的一部分。 ...

    android_manifest

    repo init -u https://github.com/ZenX-OS/android_manifest.git -b 11.1 或者如果带宽不多,可以进行浅表克隆 repo init -u https://github.com/ZenX-OS/android_manifest.git -b 11 --depth=1 浅克隆可让您仅提取...

Global site tag (gtag.js) - Google Analytics