首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 核心技术 >> 高级编程 >> 正文

Java克隆(Clone)的应用

    简介:

    Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见。但有时候用克隆会更方便更有效率。

    对于克隆(Clone),Java有一些限制:
    1、被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。Cloneable 接口实际上是个标识接口,没有任何接口方法。
    2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
    3、在Java.lang.Object类中克隆方法是这么定义的:
    protected Object clone()
                    throws CloneNotSupportedException
    创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
    按照惯例,返回的对象应该通过调用 super.clone 获得。


    引题:

    举个例子说吧,现在有一个对象比如叫foo,你需要在创建当前对象的一个副本作为存根你能怎么做?

    假如你不用Clone,那么你可以先new一个对象foo1:Foo foo1=new Foo(),然后用foo给foo1对象set值,这样就得到foo的副本foo1;除此之外,别无选择。

    这样说,也许有人会觉得说的过于绝对了,不过事实如此啊。

    要产生一个副本,那副本要不要内存?----当然要了,那就对了!既然需要内存,(不克隆的情况下)你不new还有什么办法呢?请大家时刻铭记对象是Java运行时产生的,驻留在计算机内存中。

    常见错误:
    下面我澄清几个初学者容易犯迷糊的错误,同样的问题,产生foo对象的副本:
    1、Foo foo1=new Foo();
       foo1=foo;
       然后就想当然的认为副本foo1生成了!

    错误原因:foo1没错是申请了内存,但是执行foo1=foo后,foo1就不在指向刚申请的内存区域了,转而指向foo对象的内存区域,这时候,foo1、foo指向了同一内存区域。刚才new的操作制造一堆垃圾等着JVM回收。

    2、Foo foo1=foo;
    错误原因:还是两个变量都指向了同一块内存。

    3、有些老鸟更厉害一些:在Foo中定义一个返回自身的方法:
        public Foo getInstance(){
            return this;
        }

        然后,Foo foo1=foo.getInstance();

    错误原因:同上,主要还是没有重新开辟内存,this在对象里是什么?----就是对象自己的引用!那么getInstance()自然返回的就是对象自己,反正又是两个对象穿了一条裤子----***,哈哈。错得心服口服吧。为了节省篇幅,我在最后写个例子,留给那些对此有异议的人看。

    引入克隆

    看了这么多方法都不行,还很麻烦!干脆用克隆吧,简单明了。

    废话不说了,看例子:
    定义两个类CloneFooA、CloneFooB,然后写个测试类CloneDemo分别克隆这两个类的对象,然后打印测试结果到控制台。


    /**
     * Created by IntelliJ IDEA.
     * User: leizhimin
     * Date: 2007-9-20
     * Time: 19:40:44
     * 简单类克隆实现
     * 要实现克隆,必须实现Cloneable接口,这是一个标识接口,没有接口方法
     * 实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
     * 按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
     */
    public class CloneFooA implements Cloneable {
        private String strA;
        private int intA;

        public CloneFooA(String strA, int intA) {
            this.strA = strA;
            this.intA = intA;
        }

        public String getStrA() {
            return strA;
        }

        public void setStrA(String strA) {
            this.strA = strA;
        }

        public int getIntA() {
            return intA;
        }

        public void setIntA(int intA) {
            this.intA = intA;
        }

        /**
         * @return 创建并返回此对象的一个副本。
         * @throws CloneNotSupportedException
         */
        public Object clone() throws CloneNotSupportedException {
            //直接调用父类的clone()方法,返回克隆副本
            return super.clone();
        }
    }

 

[1] [2] [3] 下一页

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航