`

Java中clone()函数理解

    博客分类:
  • java
阅读更多
下面是引用JavaAPI文档部分
引用
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 方法将会导致在运行时抛出异常。

对java中的clone()感兴趣,看了看java的api文档。并搜索了一些相关资料,做下总结。
1.clone定义
   x.clone()!=x的意思是x.clone()返回的对象为新建的对象,与原来的对象地址不同。
   x.clone().getClass() == x.getClass()的意思是克隆出的对象与原对象都是同一个类生成的。
   x.clone().equals(x)的意思是新的对象与原来的对象相同(在equals()函数下是相同的,所以通常需要覆盖equals()方法)
2.java中clone方法的实现。
   首先要实现clone方法的类要实现Cloneable接口,然后实现覆盖clone方法。在Object类中,clone方法定义为
 protected Object clone() throws CloneNotSupportedExcption
,实现的时候需要改修饰符为public。最后在实现方法的时候按照惯例返回的对象通过调用super.clone获得,这样可以保证x.clone().getClass() == x.getClass()
   最后需要注意的是引用部分红色标注的部分,这是用来实现深拷贝的。
分享到:
评论
2 楼 Technoboy 2011-05-23  
http://technoboy.iteye.com/blog/1032533
1 楼 liuyupy 2011-04-29  
Effective Java  有讲过,并提到其应用场景。

相关推荐

    Java中clone方法共6页.pdf.zip

    本资料"Java中clone方法共6页.pdf.zip"可能包含了关于如何理解和使用`clone()`方法的详细解释,以及它在实际开发中的应用示例。 `clone()`方法的主要用途是创建一个现有对象的副本,这个副本与原始对象具有相同的...

    Java深浅clone

    在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...

    java clone的小例子

    这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的应用。 首先,`clone()`方法是Java Object类的一个成员方法,这意味着所有Java类都隐式地...

    Java函数速查

    它涵盖了Java语言中各种核心类库、API及常用函数的使用方法,旨在帮助开发者快速查找和理解函数的用途、参数及返回值,提高编程效率。以下是对Java函数的一些主要知识点的详细说明: 1. **基础类型与包装类** - ...

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的...希望本文能帮助读者更好地理解Java中的这些核心概念,并在实践中正确运用它们。

    关于java clone的一些基本的概念

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象的深拷贝与浅拷贝。本文将深入探讨Java中的`clone`方法及其相关知识点。 首先,`clone`方法是Java `Object`类的一个成员方法,定义为`...

    如何通过JVM角度谈谈Java的clone操作

    Java中的对象创建主要有两种方式,即使用`new`操作符创建新对象以及通过`clone`方法...在实际编程中,还可以考虑使用其他技术,如拷贝构造函数或工厂方法,来替代或补充`clone`操作,以实现更安全、更可控的对象复制。

    clone()示例源码

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和克隆时。这个方法源自`Object`类,是所有Java类的基类。`clone()`的使用通常涉及到深度复制和浅复制的概念,这两者在数据结构和内存...

    Java clone方法详解及简单实例

    理解并正确使用`clone`方法是Java编程中的一个重要概念,尤其是在处理复杂对象图和需要创建对象副本的场景中。不过,`clone`方法有时可能会带来一些复杂性,例如需要处理`CloneNotSupportedException`,以及处理深...

    Java中对象的生命周期 ..doc

    理解Java中对象的生命周期对于编写高效、可靠的代码非常重要。通过对对象创建、初始化和销毁过程的了解,我们可以更好地管理内存资源,并避免常见的编程错误。此外,掌握构造函数的使用和调用方式有助于我们更灵活地...

    java时间操作函数汇总.pdf

    Java时间操作函数主要涉及...这些函数和方法在Java编程中处理日期和时间时非常常见,理解和熟练掌握它们对于开发涉及日期和时间逻辑的程序至关重要。在实际应用中,还需要考虑时区、夏令时等因素,以确保计算的准确性。

    详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)

    在Java中,浅拷贝可以通过实现`Cloneable`接口并重写`clone()`方法来完成。以下是一个简单的浅拷贝示例: ```java public class Person implements Cloneable { private String name; private int age; private ...

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    `clone()`方法是Java中的`Object`类的一个成员函数,它的作用是创建并返回当前对象的一个副本,这个副本与原对象具有相同的属性值。但是,需要注意的是,`clone()`方法返回的是一个浅拷贝,即如果对象的属性包含其他...

    JAVA版数据结构.pdf

    文档中提到了在`clone()`方法中的异常处理,这表明文档可能涉及Java中的异常处理机制,包括`try`、`catch`、`finally`和`throw`关键字的使用。 11. Java类的继承和接口 文档提到了`implements`关键字,这涉及到Java...

    Java 调用 SAP RFC 案例

    在IT领域,尤其是在企业系统集成中,Java与SAP系统的交互是常见的需求。...通过理解并掌握这个案例,你将能够灵活地在Java应用中调用SAP RFC,实现与SAP系统的无缝集成,从而提升企业的业务处理效率。

    JAVA_对象克隆

    在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来完成。`Cloneable`接口本身不包含任何方法,只是一个标记接口,表明该类的对象可以被克隆。`Object`类的`clone()`方法会创建一个...

Global site tag (gtag.js) - Google Analytics