当前位置: 首页 > 图文教程 > Java技术 > Java基础 > Clone 方法的使用(深度克隆)

Java基础
给Java开发者的10条戒律
Java中调用C/C++生成的DLL
Java事务处理类型/差异总结
使用DataAdapter对象
基于Java事务模型的事务策略
Java的多进程运行模式分析
JAVA反射机制
垃圾清理势在必行:java垃圾收集算法
Clone 方法的使用(深度克隆)
dwr-spring-hibernate的使用
java Spring学习记录
Java性能的十一个用法
java中的assert关键字
Java中的一直不能掌握的switch-case语句
kernighthen-lin算法:我自己编的
Hashtable和HashMap的区别
一个Java程序员应该掌握的10项技能
通过线程门实现Java并发编程
java中的assert关键字
细节的积累 ---字符串的常用方法总结

Java基础 中的 Clone 方法的使用(深度克隆)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 66 ::
收藏到网摘: n/a


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

 

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;
  }
}

 

运行结果如下:

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

 

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

  @Override
  public Sheepfold clone() throws CloneNotSupportedException {
    Sheepfold o = (Sheepfold) super.clone();
    o.sheep = this.sheep.clone();
    return o;
  }

 

运行结果

sheepfold1.name=第一个羊圈,sheep.name=第一只羊
sheepfold2.name=第一个羊圈的克隆,sheep.name=第一只羊
sheepfold1.sheep==sheepfold1.sheep?false