荔园在线

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

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


发信人: heiheihei (瓦尔特), 信区: Java
标  题: java手记(8)--Cloneable
发信站: 荔园晨风BBS站 (Thu Nov 22 15:44:25 2001), 转信

java手记(8)--Cloneable
                                            瓦尔特
在手记7中,提到了clone的一些问题。比如无法进行深度克隆。在解决这个问题之前还
需要进一步了解clone()的使用细节。
clone()在Object类中被定义,为protected,则意味着简单继承的类不会默认的拥有cl
one()方法。如:
Integer x=new Integer(1);
X=x.clone();
在编译时提示无法访问clone()方法。
对策:①利用protected特性,继承的对象可以访问clone()方法,并在继承的类中将本
类的clone()设为public(否则在引用时无法访问)。
②实现Cloneable接口
该接口为一个空接口,目的:①在要克隆的对象中,如果存在上溯造型(Upcasting)的
类成员,要确定该成员的父类是否支持克隆。
②因为考虑到不一定希望每个对象都拥有克隆能力,Object.clone()在工作时,会验证
每个要克隆的部分是否实现了Cloneable接口。如果没有实现Cloneable,则会抛出Clon
eNotSupportedExeption例外。
下面是一个让一个类Cloneable的例子
//CloneableTest.java
import java.util.*;
class CloneTestObject implements Cloneable{
    int i;
    CloneTestObject(int j){i=j;}
    public Object clone()   {
        Object o=null;
        try     {
            o=super.clone();
        }
        catch (CloneNotSupportedException e)        {
            System.out.println("CloneTestObject can't clone");
        }
        return o;
    }
    public String toString()    {
        return Integer.toString(i);
    }
}
public class CloneableTest{
    public static void main(String[] args)  {
        CloneTestObject cto1=new CloneTestObject(10);
        CloneTestObject cto2=null;
        cto2=(CloneTestObject)cto1.clone();
        System.out.println(cto1==cto2);
        cto2.i=100;
        System.out.println("cto1.i="+cto1.i+"\ncto2.i="+cto2.i);
        cto1=cto2;
        cto2.i=111;
        System.out.println("cto1.i="+cto1.i+"\ncto2.i="+cto2.i);
    }
}
结果:C:\myjava>java CloneableTest
false
cto1.i=10
cto2.i=100
cto1.i=111
cto2.i=111

注意语句:cto2=(CloneTestObject)cto1.clone();
必须进行强制类型转换,因为cto1.clone()返回的是Object类型。

                                        瓦尔特学自thinking in java
--

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

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

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


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

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