`
djob2008
  • 浏览: 130405 次
  • 性别: 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 深度克隆对象

    在Java中,实现深度克隆通常有两种方式:一是通过实现Cloneable接口并重写Object类的clone()方法;二是使用序列化和反序列化技术。前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,...

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

    在Employee类中,可以通过重写clone()方法,对hireDay域进行特殊处理,如调用Date类的clone()方法,以创建一个新的Date对象,从而实现深度克隆。 ```java class Employee implements Cloneable { public Object ...

    java深度克隆

    在`clone()`方法中调用了`super.clone()`和`homeAddr.clone()`,确保了深度克隆。 ##### 3.2 使用序列化与反序列化 这种方法利用Java的序列化机制实现深度克隆。具体步骤如下: 1. **实现Serializable接口**:...

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

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

    java的深度克隆的例子

    另一种实现深度克隆的方法是使用`clone()`方法配合自定义的拷贝构造函数或工厂方法。这种方式需要每个类及其所有引用的对象都有合适的拷贝构造函数或工厂方法。对于每个引用的对象,你需要调用它们的克隆方法或使用...

    深度克隆的事例代码

    在JavaScript中,我们可以使用JSON对象的`parse()`和`stringify()`方法来实现深度克隆: ```javascript function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } ``` 这种方法简单易用,但不适用于...

    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接口)

    深入JAVA对象深度克隆的详解

    然后,你可以定义一个名为`copy()`的方法来执行深度克隆,如下所示: ```java public class YourClass implements Serializable { // ... public YourClass copy() throws IOException, ClassNotFoundException ...

    JS对象的深度克隆方法示例

    在JavaScript中,深度克隆(Deep Clone)是一种创建新对象的技术,这个新对象与原始对象具有相同的属性和值,但彼此之间互不影响。这在处理复杂数据结构时尤其有用,如对象包含嵌套对象或数组的情况。在描述的示例中...

    中文语音克隆内含数据集和预训练模型:voice clone.zip

    在语音克隆中,这种模型通常是基于深度学习的神经网络,例如 Tacotron 或 WaveNet。这些模型已经在大量的语音数据上进行了训练,学会了将文本转化为自然的语音。预训练模型可以作为基础,通过进一步的微调以适应特定...

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

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

    clone()示例源码

    `clone()`的使用通常涉及到深度复制和浅复制的概念,这两者在数据结构和内存管理中扮演着关键角色。 首先,让我们理解`clone()`的基本用法。`clone()`方法创建并返回一个当前对象的副本,新创建的对象与原对象具有...

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

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

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    Java clone方法详解及简单实例

    - **深度克隆**(Deep Clone):不仅复制对象本身,还递归地复制其引用的对象。如果对象的成员变量是复杂类型(如其他对象),则需要手动处理这些成员的克隆以确保完整的深拷贝。 理解并正确使用`clone`方法是Java...

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

    Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于优化内存管理和复制复杂对象至关重要。 **浅度克隆(Shallow Clone)** 浅度克隆仅仅复制了对象本身...

    java 深克隆 浅克隆

    为了实现深克隆,通常需要自定义克隆逻辑,因为`Object`的`clone()`方法无法处理引用类型的深度复制。这通常涉及序列化和反序列化的过程,或者手动复制每个引用类型的字段。 例如: ```java class DeepCloneExample...

Global site tag (gtag.js) - Google Analytics