`
ideal46
  • 浏览: 30299 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

克隆方法---javadoc

阅读更多
clone
protected Object clone()throws CloneNotSupportedException

   创建和返回一个对象的拷贝,拷贝的准确含义依赖于对象的类。

   一般来说,对于任何对象x,
   表达式x.clone() != x 是true,
   表达式x.clone().getClass() == x.getClass()也是true,
   但是这些都不是必须的。
   虽然通常情况下,x.clone.equals(x)是true,但这也不是一个必须的要求。


   通过super.clone获取返回对象。如果一个类和他的所有父类(除过Object)违背了这个规则,就会出现x.clone.getClass() == x.getClass();
   通过该方法返回的对象应该独立于那个被克隆的对象。为了实现这种独立,很可能需要修改一个或多个通过对象super.clone返回的对象的域。通常,这意味要拷贝任何包含内部“深层结构”的可变对象,并且用指向新对象的引用替换原来指向这些对象的引用。如果类仅仅包含原始数据类型或者对不可变对象的引用,就不需要修改通过super.clone获得的拷贝对象。
   Object的clone方法执行具体的克隆操作。首先,如果对象的类没有实现Cloneable接口,那么会抛出CloneNotSupportedException异常。需要注意的是所有的数组被视为实现了Cloneable接口。否则,这个方法创建这个对象的类的新实例,并且用与这个对象对应的所有域的内容初始化所有的域,因为是通过转让,所以字段的内容本身没有克隆。因此,这个方法对对象的“影子拷贝”,而不是“深度拷贝”。

Object本身没有实现Cloneable接口,所以说调用Object类对象的clone方法会在运行时抛出异常。

ps:关于clone的问题《effective java》进行了进一步阐述,具体应该注意一下几点:

  • Cloneable接口没有提供任何方法,它做的事情就是:如果一个类实现了该接口,那么继承自Object的clone方法返回对象的逐域拷贝,否则抛出CloneNotSupportedException。
  • 显然对于实现了Cloneable接口的类,我们总希望它提供一个公有的clone方法,但通常情况下,除非该类的所有父类都提供了行为良好的clone方法,否则这是不可能的。
  • 作为另外一种形式的构造函数,你应该确保它不会伤害到原始的对象,并且正确建立起被克隆对象中的约束关系。(对于包含可变对象引用的类的对象应该特别注意,因为拿过来的引用是指向同一地址的对象,所以克隆对象和被克隆对象对他进行的修改会彼此影响)
  • 克隆复杂对象的另外一个方法是,先调用super.clone方法,然后将对象所有的域设置为空白状态,再通过调用高层的方法来重新产生对象的状态。
  • 不要在clone方法中调用clone对象的任何非final方法。


注意: 对于实现cloneable接口的类,除过实现一个行为良好的共有clone方法外别无选择。否则最好的做法是,提供某些其他的途径来代替对象拷贝,或者干脆不提供这样的能力。对于非可变对象,反正状态是不会变的,拷贝对象和被拷贝对象并没有什么实质性的区别。由于Cloneable接口没有提供方法,所以我们可以通过拷贝函数,或者静态工厂来实现对象的拷贝。
0
0
分享到:
评论

相关推荐

    scijava-javadoc:SciJava Javadocs的聚合器

    1. **构建过程**:首先,你需要克隆或下载`scijava-javadoc-master`压缩包到本地。然后,通过运行特定的构建脚本(通常是`mvn package`或者`gradle build`,具体取决于项目的构建系统)来生成Javadoc。 2. **查看...

    frames-android:JavaDoc->

    标题中的"frames-android:JavaDoc->"表明这是一个关于Android开发的Java库,专注于"frames"相关的功能,并且提供了JavaDoc文档。JavaDoc是Java编程语言中的一个标准工具,用于从源代码注释中生成API文档,它使得...

    jsoup的jar包,包括文档

    在本压缩包中,包含了"jsoup-master"文件夹,这通常代表了一个源代码仓库的克隆,可能包含JSoup的源码、构建脚本和其他辅助文件。如果你需要的是预编译的jar包,通常可以在JSoup的官方网站或者Maven仓库中找到。 ##...

    JAVA编程规范

    - 如果类支持克隆操作,可以提供克隆方法。 - 示例: ```java @Override public User clone() { try { return (User) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError();...

    java编码规范还不错的东西吧

    - 克隆方法通常遵循标准的克隆模式,例如: ``` public Object clone() { try { // 实现克隆逻辑 } catch (CloneNotSupportedException e) { // 处理异常 } } ``` #### 3.8 普通方法 - 普通方法应有清晰的...

    Java程序编码规范

    - **规范**: 如果类支持克隆,需提供克隆方法。 - **示例**: ```java @Override public Object clone() { try { CounterSet obj = (CounterSet) super.clone(); return obj; } catch ...

    java程序的代码规范

    - 类方法(静态方法)应按一定逻辑顺序排列,并添加适当的Javadoc注释。 **2.10 toString方法** - 实现`toString()`方法,以便于调试和展示对象的状态。 - `toString()`方法应返回一个描述对象状态的字符串。 **...

    scalaj-http_2.9.2-0.3.11.zip

    【描述】"xml-doclet.zip,javadoc到xmljavadoc到xml" 提到了两个部分,首先,`xml-doclet` 是一个Javadoc扩展,它将标准的Javadoc输出转换为XML格式,这对于自动化文档处理或进一步定制Javadoc信息非常有用。...

    jgit jar&doc;

    其次,`org.eclipse.jgit-2.0.0.201206130900-r-javadoc.jar`则是JGit的Java文档(Javadoc)包。它提供了JGit库的所有公共API的详细文档,对于理解和使用JGit的API非常有帮助。开发者可以通过查看这些文档快速了解每...

    codeDocToMarkdown:Markdown 从你的代码中生成(Javadoc、GoDoc)

    在压缩包文件名称列表中,我们看到"codeDocToMarkdown-master",这通常表示这是一个Git仓库的克隆,其中包含了项目的所有源代码、资源文件和可能的构建脚本。"master"分支通常是Git仓库的主要分支,代表了项目的最新...

    JDoc4droid:适用于Android的Javadoc查看器

    适用于Android的Javadoc查看器 使用AndroidStudio进行设置 安装AndroidStudio 在AndroidStudio中安装Lombok插件 克隆项目 在AndroidStudio中打开项目 通过adb连接android设备(仿真器或真实设备) 运行 不使用IDE...

    java-sdk-master.zip

    - API参考:详细列出SDK提供的类、方法和接口,以及它们的使用方法。 - 示例代码:演示如何初始化SDK、调用API以及处理响应。 - 故障排查:常见问题和解决方案。 通过解压"java-sdk-master.zip"并根据PDF文档的指导...

    java面试题

    如果需要创建对象的副本,通常使用克隆机制(`clone()`方法)或其他方式手动实现。 #### 8. Java中的多继承问题 - **知识点**: 多继承、接口、抽象类 - **详细解释**: - **多继承**: - Java中类不支持多继承,即...

    java教程二第2章Java环境和工具.pdf

    Javadoc注释通常位于类、接口、方法和字段声明之前。它用于生成API文档,以便在开发过程中查看。注释的基本格式包括文档描述、参数、返回值、异常和作者等信息。 11. Java程序结构示例: 文档最后给出了一个简单的...

    Java编程规则教程

    - **Javadoc注释**:为公共API添加Javadoc注释,提供对方法、参数、返回值和异常的详细说明,有助于其他开发者快速理解代码意图。 #### 设计模式与面向对象编程 - **设计模式应用**:熟练掌握并恰当地运用设计模式...

    Java程序员面试宝典 - 最常用的编程风格.pdf,这是一份不错的文件

    - 类应包含`equals()`、`hashCode()`、`toString()`、`clone()`(实现`Cloneable`)以及`Serializable`接口,以便于比较、哈希计算、字符串表示和克隆操作。 3. **测试代码**: - 为每个类提供一个`main()`方法...

    Java编程规范.doc

    - **克隆方法**: 实现对象复制的`clone()`方法。 - **类方法**: 静态方法,与类而非实例关联。 - **toString方法**: 返回类实例的字符串表示。 - **main方法**: 应用程序的入口点,标记为`public static void ...

    aliyun-maxcompute-data-collectors

    阿里云MaxCompute数据收集器 该项目是一组bigdata插件,用于与aliyun maxcompute...$ mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true 插件包位于每个插件子项目的target 。 用法 请参考的基本用法。

    jAVA编程规范J2EE代码规范

    8. **2.8 克隆方法** - 实现`Cloneable`接口并重写`clone()`方法以支持对象的深拷贝或浅拷贝。 9. **2.9 类方法** - 提供静态方法来执行不依赖于类实例的操作。 10. **2.10 toString方法** - 重写`toString()`...

Global site tag (gtag.js) - Google Analytics