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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值