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

Java基础
JavaBeans 与 Ejb 的区别
通过Java Swing看透MVC设计
Java多线程编程精要之高级支持
Struts与Hibernate协同工作
JDBC连接数据库经验技巧
Spring 编程入门十大问题解答
基于Java的建造设计模式
Java多线程编程精要之实现线程
JBuilder和JDeveloper的简单比较
Java多线程编程精要之基础
Java内存泄露问题分析
J2EE应用应遵循的几点原则
JavaBean实现多文件上传
开发线程安全的Spring Web应用
基于Java的解释器设计模式
Java中轻松实现界面跳转
JDBC 2.0中的高级数据类型
Java语言接口与继承的本质
Java数据对象(JDO)的前世今生
Java打印程序设计全攻略

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


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