荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店