荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: heiheihei (瓦尔特), 信区: Java
标  题: java手记(9)--深层克隆
发信站: 荔园晨风BBS站 (Fri Nov 23 15:10:52 2001), 转信

java手记(9)--深层克隆
                                                瓦尔特
前面提到了,简单的调用clone()是不能进行深层的克隆的。其原因需要从clone()本身
的工作原理去找。
原理:Clone()方法先建立正确的克隆使用的存储容量,然后将源对象按二进制位复制到
目标对象的存储空间。
这样,如果存在复合的类(一个类中包含一个或几个对象成员),因为类的操作是以句
柄为基础的,这样对于对象成员的克隆操作,如果对象成员不是Cloneable,clone()就
仅仅复制该对象成员的句柄的值。也就使对象成员发生了别名问题。这也就是浅层克隆
发生的原因。
解决:如果要对某个对象进行克隆,必须对该对象的所有对象成员实现Cloneable。这样
才能进行深层克隆。
浅层克隆与深层克隆的原理
深层克隆的例子://DeepClone.java
class DeepA implements Cloneable{
    int a;
    public DeepA(int aa)    {
        a=aa;
    }
    public Object clone()   {
        Object o=null;
        try     {
            o=super.clone();
        }
        catch (CloneNotSupportedException e)        {
            e.printStackTrace();
        }
        return o;
    }
}
class Deep implements Cloneable{
    DeepA deepa;
    public Deep(int i)  {
        deepa=new DeepA(i);
    }
    public Object clone()   {
        Deep o=null;
        try     {
            o=(Deep)super.clone();
        }
        catch (CloneNotSupportedException e)        {
            e.printStackTrace();
        }
        o.deepa=(DeepA)o.deepa.clone();
        return o;
    }
}
public class DeepClone{
    public static void main(String[] args)  {
        Deep deep1=new Deep(100);
        Deep deep2=(Deep)deep1.clone();

System.out.println("deep1.deepa.a="+deep1.deepa.a+"\ndeep2.deepa.a="+deep2.
deepa.a);
        deep1.deepa.a++;

System.out.println("\ndeep1.deepa.a="+deep1.deepa.a+"\ndeep2.deepa.a="+deep
2.deepa.a);
        deep1=deep2;
        deep1.deepa.a++;

System.out.println("\ndeep1.deepa.a="+deep1.deepa.a+"\ndeep2.deepa.a="+deep
2.deepa.a);
    }
}
                                        瓦尔特学自thinking in java
--

世界上没有任何话能说服你,除非它是你心中的那一句。

世界上没有任何人能打动我,除非她是我心中的那一个。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 202.118.1.82]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店