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

Java基础
apatche组件的研究和使用
定时执行任务的三种方法
Java各种路径和参数
我看如何选择java和.net
Java关闭窗体的六种方法
java中容易迷惑的知识点
一个简单Thread缓冲池的实现
Java Swing中键盘事件的处理
解读内存优化编程
Java中Set的深入研究
一套JDOM操作XML文件的Base Class
Java堆和栈的区别
Thread类和Runable接口
java 定时执行任务,java定时器
递归(recursion)
java访问各种数据库连接代码
也谈JAVA值传参和引用传参
(转)一个牛人给java初学者的建议
java gui学习
JNI中文处理问题小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 67 ::
收藏到网摘: 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