import java.util.*;
import java.lang.*;
class Employee implements Cloneable
{
   public Employee(String n ,double s)
  {
     name =n;
     salary =s;
  }
  public String getName() {return name;}
  public double getSalary() {return salary;}  public void setHireday(int year, int month,int day)
 {
     hireday =new GregorianCalendar(year,month-1,day).getTime();  }
  public Date getHireday(){return hireday;}
  public Object clone()
  {
    try
    { 
       Employee cloned =(Employee)super.clone();
       return cloned;
    }
    catch(CloneNotSupportedException e) {return null;}
  }  public String toString()
  {      return "name:"+name+",salary:"+salary+",hireday:"+hireday;
   }
  private String name;
  private double salary;
  private Date hireday;};class CloneTest 
{
    public static void main(String[] args) 
    {
       Employee emp =new Employee("dsy",10000);       emp.setHireday(2001,9,1);       Employee cloned =(Employee)emp.clone();       cloned.setHireday(2002,11,24);       System.out.println(emp.toString());
       System.out.println(cloned.toString());
    }
}
按照《core java》关于clone的内容,“若子对象可变更,那么浅拷贝将是对子对象的另一个引用”,我的理解:是如果改变emp.hireday,cloned.hireday也将随之改变。但上面程序的运行结果却并非如此,怎么回事呢?

解决方案 »

  1.   

    因为楼主调用了super的clone。它的确是深复制。如果楼主重写了A的clone,然后B继承A,这样B的clone的效果才是楼主想要的A的clone的效果。
      

  2.   

    <h4>看看这个<a href="http://www-128.ibm.com/developerworks/cn/java/l-jpointer/index.html#7">clone</a></h4>
      

  3.   

    2楼的说法我有点不大明白,我用的是浅克隆而非深克隆(因为我没有对子对象调用clone()),但是输出的结果却为深克隆的结果,有点不大明白。哪位能解释一下?
      

  4.   

    这个明显是一个浅COPY。Employee没有实现对hireday的clone,那么clone后的对象和原先对象的hireday应该是相同的,这样对hireday的赋值应该是clone对象和原始对象都是同时改变才对。这个问题确实很奇怪啊,期待给个合理的解释。