在对象克隆时,如果对象有引用型变量要涉及到深度克隆,是不是因为即使已经克隆完成,引用型变量还是指向原有的实体。也就是说,对象克隆,就是为对象中的有实体的变量重新分配空间????深度克隆又该如何实现?

解决方案 »

  1.   

    实在看不懂你所写的....基本和LZ说的差不多,比如说有下面的这样的类
    public class A
    {
    ArrayList list;
      public A()
     {
          list = new ArrayList();
      }
    }A a = new A();
    A b = (A)a.clone();这样的结果默认情况下呢,a.list与b.list的值是一样,也就是指向了一个同一个对象,如果通过a.list操作,b.list也就被改变了.
    浅克隆就是简单的成员复制.但成员所引用的对象没有得到复制.所以要覆盖clone方法,不但都有一个ArrayList类型的成员,而且这个成员所引用的<<<对象的内容>>>也一样的,但不是同一个.String a =new String("a");
    String b = a;这时候可以说b是a的简单克隆.String a = new String("a");
    String b = new String(a);这样可以理解为深克隆,两者的内容都是一样的.public class A
    {
    ArrayList list;
      public A()
     {
          list = new ArrayList();
      }
      protect Object clone()
      {
              A b = new A();
              b.list = this.list.clone();
              return b;
      }
    }因为ArrayList的clone已经覆盖了Object的,所以这样就形成了深克隆.不覆盖那个方法的时候:
    A a  = new A();
    A b = (A)b.clone();
    a.list==b.list-->true;覆盖方法之后
    A a  = new A();
    A b = (A)b.clone();
    a.list==b.list-->false;
      

  2.   

    import java.util.*;
    class AboutClone 
    {
    LinkedList list;
    AboutClone()
    {
    list=new LinkedList();
    }
    public  Object clone()
    {
    AboutClone A=new AboutClone();
    A.list=(LinkedList)this.list.clone();
    return A;
    }
    }
    public class example3 {
    public static void main(String args[])
    {
    AboutClone A=new AboutClone(),
    B=new AboutClone();
        B=(AboutClone)A.clone();
        if(B.list==A.list)
        {
         System.out.println("true");
        }
        else
        {
         System.out.println("false");
        }
    }
    }
    自己写了一个,确实是这样,谢谢4楼的大哥了。
    发现了另一个问题,所有的类不都是Object的子类么?
    为什么我在写这个程序的时候,如果不要涉及深度克隆,我还是要自己重新再写一次Object clone这个方法?
    如:
    class AboutClone 
    {
    LinkedList list;
    AboutClone()
    {
    list=new LinkedList();
    }
    public  Object clone()
    {
    return this;
    }
    }
      

  3.   

    你的属性里有了引用类型的成员就得覆盖clone方法.
      

  4.   


    还是不行
    就算里面没有引用型变量,也还是得重写clone方法才能通过编译??
    import java.util.*;
    class AboutClone 
    { public Object clone()    //去掉就不行了。
    {
    return this;
    }}
    public class example3 {
    public static void main(String args[])
    {
    AboutClone A=new AboutClone(),
    B=new AboutClone();
        B=(AboutClone)A.clone();  //The method clone() from the type Object is not visible }
    }
      

  5.   

    因为clone()在Object里是被保护的啊.只能在它的子类中看到的啊
    import java.util.*; 
    public class example3 { 
    public static void main(String args[]) 

    AboutClone A=new example3(), 
    B=new example3 (); 
        B=(example3)A.clone();  //The method clone() from the type Object is not visible } 
    }这样就可以了啊,被保护和方法只能在它的本类和子类中可访问的.你所写的A.clone();是在example3类中访问,所以不行.
      

  6.   

    哦了解了原来方法是protected.那些例如LinkedList的类里clone()都已经是重新定义过了吧,都是public类了。那么一般要进行克隆的话,最好都重写clone()方法了。。