`

对object.clone方法的新认识

 
阅读更多

原来一直以为子类在重写Object.clone()方法时,需要额外把子类的新增属性也赋值给克隆对象,如下面的代码,other.setAddition(this.addition);我以前写clone 方法时都是加上这一句的。事实上这是不必要的,可以把这一句代码去掉。
要实现这种效果是有前提条件的:在Test类的父类链上,所有的父类必须提供clone方法,并且返回由调用super.clone方法获得的对象。如果任何一个父类的clone方法返回由构造函数创建的对象,这就会产生一个错误的类。当我们重写了clone方法,必须返回super.clone方法获得的对象。
如果遵循了以上规则,Object.clone方法会保证创建Test的实例。这一点看上去挺神奇的。

 

@Override
  public Test clone(){
    Test other = null;
    try{
     other = (Test) super.clone();
     //other.setAddition(this.addition);//事实上这句话可以不要的。
     return other;
    }catch(CloneNotSupportedException e){
      throw new AssertionError();
    }
  }

 

0
0
分享到:
评论
1 楼 changedi 2010-09-29  
只记得effective java里讲的好像是在写clone时,把那些成员最好都设置ok~~~
我觉得写上setXXX()挺好的~~~

相关推荐

    Java Object类认识

    因此,对`Object`类的理解是每个Java开发者的基本功。本文将深入探讨`Object`类,以及其核心方法`equals()`与Java中的`==`操作符之间的差异。 `Object`类位于Java的核心库`java.lang`包中,它提供了基本的方法来...

    二十三种设计模式【PDF版】

    你的设计应该对手头的问题有针对性,同时对将来的问题和需求 也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下子就得到复用性和灵活性好的设计, 即使不是...

    Android知识体系梳理(4)-Java基础篇-Object方法分析,String的深度解析,String Pool分析,与StringBuilder、StringBuffer的对比

    无论是Object类的基本方法,还是String类的特性,都需要开发者在实践中不断加深认识,以便在编程时能够做出更优的选择。通过这样的知识梳理,可以系统地掌握Java在Android开发中的应用,为后续学习更复杂的Android...

    Html-clone

    "Html-clone"可能指的是一个项目或教程,旨在帮助用户理解和学习如何克隆一个HTML页面,或者创建一个与特定网页类似的...通过"Html-clone"项目,你可以动手实践,逐步拆解和重建一个网页,从而深化对这些技术的认识。

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.1.4 一维数组的clone()方法 212 9.1.5 当数组类型不再是基本数据类型 214 9.1.6 多维数组的clone()方法 217 9.2 老朋友String类 220 9.2.1 遍历String中的字符 220 9.2.2 获取字符串中的一部分 222 9.2.3 ...

    c#学习笔记.txt

    看完了前面几段,我的朋友提出了不同的意见:C#不是Java的Clone,它只是长得有些像Java而已,其实面向对象、中间语言什么的也不是什么新玩意儿,非Sun独创,有文为证:华山论剑:C#对Java。另外他对我上一集中说...

    day09【常用API、引用类型小结】_pojie_

    通过对这些知识点的学习,开发者可以更好地理解和使用各种API,提升代码质量和效率,同时对引用类型有深入的认识,以避免可能出现的问题。学习和总结这些内容对于提升编程技能和解决实际问题具有重要意义。

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.1.4 一维数组的clone()方法 212 9.1.5 当数组类型不再是基本数据类型 214 9.1.6 多维数组的clone()方法 217 9.2 老朋友String类 220 9.2.1 遍历String中的字符 220 9.2.2 获取字符串中的一部分 222 9.2.3 ...

    华为IBM的java面试题

    - **克隆**:实现`Cloneable`接口并通过`clone()`方法复制对象。 - **序列化**:实现`Serializable`接口,然后通过序列化和反序列化来创建对象副本。 - **工厂模式**:定义一个创建产品对象但不需要指定具体类的接口...

    JAVA经典教材笔记

    - 实现克隆的方式:实现Cloneable接口并重写clone()方法。 - **Arrays类** - Arrays类的作用:操作数组。 - Arrays类的常用方法:sort(T[] a)、copyOf(T[] original, int newLength)等。 - **比较器(Comparable、...

    cse341商店

    通过参与这个项目,你不仅可以深化对JavaScript的理解,还能提升解决实际问题的能力,同时对Web开发的整体流程有一个更全面的认识。在实践中,你可能还会遇到其他技术挑战,例如错误调试、性能优化等,这些都是提升...

    fullstack-React-Preparations:准备

    在全面了解React开发之前,首先需要对前端开发有一个基本的认识。React是由Facebook开发的一个用于构建用户界面的JavaScript库,尤其适合构建单页应用程序(SPA)。它主要关注视图层,但也可以与其他库或完整的框架...

Global site tag (gtag.js) - Google Analytics