默认克隆是将类中的基本类型的变量进行拷贝一份。(请问数组会不会拷贝呢?)
而重新定意克隆方法是希望将对像进行也考贝一份

解决方案 »

  1.   

    clone是protected的,你要克隆一个类就要实现Cloneable接口,然后在类里面重新定义clone方法。
    重新定义的话也有浅拷贝和深拷贝:class F implements Cloneable
    {
    int i;
    public F(int a)
    {
    i=a;
    } public Object clone()
    {
    Object o=null;
    try {
    o=super.clone();
    } catch (CloneNotSupportedException e) {
    // TODO: handle exception
    System.out.println(e);
    }
    return o;
    }

    public boolean equals(Object obj)
    {
    if(obj instanceof F)
    return ((F)obj).i==i;
    return false;
    }
    }
    class G implements Cloneable
    {
    F f;
    public G(int a)
    {
    f=new F(a);
    }
    //深拷贝
    public Object clone()
    {
    G o=null;
    try {
    o=(G)super.clone();
    } catch (CloneNotSupportedException e) {
    // TODO: handle exception
    System.out.println(e);
    }
    o.f=(F)o.f.clone();//内含对象的克隆
    return o;
    }
    }
    public class MyClone { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    F f=new F(2);
    F f1=(F)f.clone();
    if(f==f1)
    System.out.println("f,f1指向同一个对象");
    else
    System.out.println("f,f1指向不同对象");

    if(f.equals(f1))
    System.out.println("f,f1中内容相等");
    else
    System.out.println("f,f1中内容不相等");

    G g=new G(2);
    G g1=(G)g.clone();
    if(g==g1)
    System.out.println("g,g1指向同一个对象");
    else
    System.out.println("g,g1指向不同对象");

    if(g.f==g1.f)
    System.out.println("g.f,g1.f中内容相等");
    else
    System.out.println("g.f,g1.f中内容不相等");

    if(g.f.equals(g1.f))
    System.out.println("g.f,g1.f中内容相等");
    else
    System.out.println("g.f,g1.f中内容不相等");
      

  2.   

    JAVA和c++一样,都是做的浅拷贝,覆盖克隆方法时必须自己实现深度拷贝的代码,想数组和对象之类的必须自己实现
      

  3.   

    缺省的 clone 属于浅层复制,当这种方式不符合需求时,就要自己写 clone() 了。
      

  4.   

    自己写clone方法吧,对象成员是不会拷贝的