`
djob2008
  • 浏览: 127795 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Clone 方法的使用(深度克隆)

阅读更多

转载自:http://www.java2000.net/p1235

 

如下的程序,我们克隆羊圈,每个羊圈里有一只羊

  1. package test.lang;   
  2.   
  3. public class Sheep implements Cloneable {   
  4.   private String name;   
  5.   
  6.   public String getName() {   
  7.     return name;   
  8.   }   
  9.   
  10.   public void setName(String name) {   
  11.     this.name = name;   
  12.   }   
  13.   
  14.   @Override  
  15.   public Sheep clone() throws CloneNotSupportedException {   
  16.     return (Sheep) super.clone();   
  17.   }   
  18.   
  19.   public static void main(String[] args) throws CloneNotSupportedException {   
  20.     Sheepfold sheepfold1 = new Sheepfold();   
  21.     sheepfold1.setName("第一个羊圈");   
  22.     Sheep sheep1 = new Sheep();   
  23.     sheep1.setName("第一只羊");   
  24.     sheepfold1.setSheep(sheep1);   
  25.     Sheepfold sheepfold2 = sheepfold1.clone();   
  26.     sheepfold2.setName("第一个羊圈的克隆");   
  27.     System.out.println("sheepfold1.name=" + sheepfold1.getName() + ",sheep.name=" + sheepfold1.getSheep().getName());   
  28.     System.out.println("sheepfold2.name=" + sheepfold2.getName() + ",sheep.name=" + sheepfold2.getSheep().getName());   
  29.     System.out.println("sheepfold1.sheep==sheepfold1.sheep?" + (sheepfold1.getSheep() == sheepfold2.getSheep()));   
  30.   }   
  31. }   
  32.   
  33. class Sheepfold implements Cloneable {   
  34.   private String name;   
  35.   
  36.   private Sheep sheep;   
  37.   
  38.   @Override  
  39.   public Sheepfold clone() throws CloneNotSupportedException {   
  40.     Sheepfold o = (Sheepfold) super.clone();   
  41.   
  42.     return o;   
  43.   }   
  44.   
  45.   public String getName() {   
  46.     return name;   
  47.   }   
  48.   
  49.   public void setName(String name) {   
  50.     this.name = name;   
  51.   }   
  52.   
  53.   public Sheep getSheep() {   
  54.     return sheep;   
  55.   }   
  56.   
  57.   public void setSheep(Sheep sheep) {   
  58.     this.sheep = sheep;   
  59.   }   
  60. }  
package test.lang;

public class Sheep implements Cloneable {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public Sheep clone() throws CloneNotSupportedException {
    return (Sheep) super.clone();
  }

  public static void main(String[] args) throws CloneNotSupportedException {
    Sheepfold sheepfold1 = new Sheepfold();
    sheepfold1.setName("第一个羊圈");
    Sheep sheep1 = new Sheep();
    sheep1.setName("第一只羊");
    sheepfold1.setSheep(sheep1);
    Sheepfold sheepfold2 = sheepfold1.clone();
    sheepfold2.setName("第一个羊圈的克隆");
    System.out.println("sheepfold1.name=" + sheepfold1.getName() + ",sheep.name=" + sheepfold1.getSheep().getName());
    System.out.println("sheepfold2.name=" + sheepfold2.getName() + ",sheep.name=" + sheepfold2.getSheep().getName());
    System.out.println("sheepfold1.sheep==sheepfold1.sheep?" + (sheepfold1.getSheep() == sheepfold2.getSheep()));
  }
}

class Sheepfold implements Cloneable {
  private String name;

  private Sheep sheep;

  @Override
  public Sheepfold clone() throws CloneNotSupportedException {
    Sheepfold o = (Sheepfold) super.clone();

    return o;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Sheep getSheep() {
    return sheep;
  }

  public void setSheep(Sheep sheep) {
    this.sheep = sheep;
  }
}

运行结果如下:

  1. sheepfold1.name=第一个羊圈,sheep.name=第一只羊   
  2. sheepfold2.name=第一个羊圈的克隆,sheep.name=第一只羊   
  3. sheepfold1.sheep==sheepfold1.sheep?true  
sheepfold1.name=第一个羊圈,sheep.name=第一只羊
sheepfold2.name=第一个羊圈的克隆,sheep.name=第一只羊
sheepfold1.sheep==sheepfold1.sheep?true

克隆的羊圈,里面的羊还是第一个羊圈的羊,他们完全相同.并没有被克隆过来,这就是浅层克隆,我们调整代码,实现深层克隆

  1. @Override  
  2. public Sheepfold clone() throws CloneNotSupportedException {   
  3.   Sheepfold o = (Sheepfold) super.clone();   
  4.   o.sheep = this.sheep.clone();   
  5.   return o;   
  6. }  
  @Override
  public Sheepfold clone() throws CloneNotSupportedException {
    Sheepfold o = (Sheepfold) super.clone();
    o.sheep = this.sheep.clone();
    return o;
  }

运行结果

  1. sheepfold1.name=第一个羊圈,sheep.name=第一只羊   
  2. sheepfold2.name=第一个羊圈的克隆,sheep.name=第一只羊   
  3. sheepfold1.sheep==sheepfold1.sheep?false  
分享到:
评论

相关推荐

    clone 深度克隆对象

    深度克隆对象,不过效率没有显示的new对象快,不过很安全

    go-clone:深度克隆任何Go数据

    go-clone:深度克隆任何Go数据 包clone提供了对任何Go数据进行深度克隆的功能。 它还提供了一个包装器,以保护指针免受任何意外的突变。 Clone / Slowly可以克隆任何结构的未导出字段。 明智地使用此功能。 安装 ...

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

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

    js-object-clone:深度克隆并与ES5属性描述符和对象可扩展性支持进行比较

    对象克隆ES5的深克隆和比较概要// just for conveniencevar log = function ( ) { console . log . apply ( console , [ ] . slice . call ( arguments ) ) } ; var src = { name : 'dankogai' , lang : [ 'perl' ] ...

    java克隆对象(两种方法)

    java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)

    mongoose-schema-clone:深度克隆并返回模式的副本,向此模式添加关键路径模式类型对,还可以添加另一个模式并在所有路径,虚拟,getter,setter,索引,方法和静态变量上进行复制

    深度克隆并返回模式的副本,向该模式添加关键路径/模式类型对,您还可以添加另一个模式并复制所有路径、虚拟、getter、setter、索引、方法和静态。 特征: 深度克隆模式 复制路径、虚拟、getter、setter、索引、...

    proxy-clone:基于ES6代理的深度克隆

    基于的深度克隆,在处理大对象时比传统的克隆实现效率更高。 需要节点6或更高版本。 注意:这不是传统的clone()。 对源对象的更改将反映在克隆中,但是对克隆的更改不会修改源。 表现 根据对象大小的不同, ...

    arcgis_pro2.5深度学习clone环境操作步骤_.docx

    arcgis Pro深度学习环境部署教程,clone一个名字为plam-detection的工程环境;clone的位置在C:\Users\admin\AppData\Local\ESRI\conda\envs可以去在Pro的project下切换环境。(安装完Pro后默认的conda的环境位置:C:...

    pop-clone:用于克隆 JavaScript 对象图的多态运算符

    这个 JavaScript 包导出一个深度克隆运算符,它接受可能包含引用循环的任意对象图。 clone 操作符委托给实现它的任何对象的 clone 方法。 $ npm install --save pop-clone clone 方法接受一个值或对象图,并返回一...

    ruby-deepclone:本机Ruby深度克隆实现

    地位系统地位特拉维斯 宝石版 代码Climante描述该gem提供了本机实现,可以深度克隆Ruby对象。 它支持Ruby 1.9.3、2.2.x,2.3.x和2.4.x。安装 gem install ruby_deep_clone或将其添加到您的Gemfile gem 'ruby_deep_...

    js-clone:使用深度复制的Javascript对象复制

    js克隆使用深度复制的Javascript对象复制用法var deepClone = require ( './js-clone/index.js' ) ;var object = { name : 'Kator James' , work : { companyName : 'LogicalAddress Ltd' , getCompanyName : ...

    object-clone:克隆对象支持循环引用

    深度克隆对象,支持循环引用和属性描述符 var clone = require ( '@dmail/object-clone' ) ; var a = { name : 'a' } ; var b = clone ( a ) ; b . name ; // 'a' // of course b != a 它克隆得很深 var a = { ...

    clone-json:深度复制json

    克隆json 安装 # Install with npm $ npm install clone-json --save # Install with yarn $ yarn add clone-json 用法 两个数组相等 let cloneJson = require ( 'clone-json' ) let json = { a : 123 , b : '...

    JavaScript_tief_Klonen:使用JavaScript进行深度克隆

    深度克隆JavaScript 手动的: [removed][removed]代码: [removed][removed] 然后在您自己的代码中: KlonObjekt = MeineFunktionen.clone(Objekt); 或者 KlonObjekt = Objekt.clone();

    javascript浅层克隆、深度克隆对比及实例解析

    这篇文章主要介绍了javascript浅层克隆、深度克隆对比及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1、浅层克隆, (引用值改变, 两个都一起变) ...

    deep-clone:使用纯JS实现Deep Clone

    这是我使用纯JS深度克隆对象的实现。 在编码面试中经常被问到 :skull: ,很少在没有lodash之类的库的情况下使用。 支持以下测试用例(至少到目前为止我已经考虑过): 空对象(谁不想) 非对象 数组 简单对象...

    Java利用序列化实现对象深度clone的方法

    主要介绍了Java利用序列化实现对象深度clone的方法,实例分析了java序列化及对象克隆的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Whatsapp-clone:使用MERN Stack构建的WhatsApp克隆

    Whatsapp克隆Whatsapp-clone是基于原始WhatsApp UI和实时消息创建深度创建全栈应用程序的深入实现。 UI严格在ReactDOM和CSS3中实现,而实时消息传递则通过Pusher完成。 随着使用Travis CI,Docker和AWS对CI / CD管道...

    C# List引用类型克隆的3种方法

    主要给大家介绍了关于C# List引用类型克隆的3种方法,包括反射、序列化(依赖Newtonsoft.Json)以及序列化(BinaryFormatter)的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧

    序列化(Serialization)实现深拷贝.md

    如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含多层引用类型,那么通过clone()方法逐一拷贝每一个引用类型来实现深拷贝的方法就会很麻烦。这时我们可以用序列化来实现对象的深拷贝。

Global site tag (gtag.js) - Google Analytics