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接口没有提供方法,所以我们可以通过拷贝函数,或者静态工厂来实现对象的拷贝。
分享到:
相关推荐
1. **构建过程**:首先,你需要克隆或下载`scijava-javadoc-master`压缩包到本地。然后,通过运行特定的构建脚本(通常是`mvn package`或者`gradle build`,具体取决于项目的构建系统)来生成Javadoc。 2. **查看...
标题中的"frames-android:JavaDoc->"表明这是一个关于Android开发的Java库,专注于"frames"相关的功能,并且提供了JavaDoc文档。JavaDoc是Java编程语言中的一个标准工具,用于从源代码注释中生成API文档,它使得...
在本压缩包中,包含了"jsoup-master"文件夹,这通常代表了一个源代码仓库的克隆,可能包含JSoup的源码、构建脚本和其他辅助文件。如果你需要的是预编译的jar包,通常可以在JSoup的官方网站或者Maven仓库中找到。 ##...
- 如果类支持克隆操作,可以提供克隆方法。 - 示例: ```java @Override public User clone() { try { return (User) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError();...
- 克隆方法通常遵循标准的克隆模式,例如: ``` public Object clone() { try { // 实现克隆逻辑 } catch (CloneNotSupportedException e) { // 处理异常 } } ``` #### 3.8 普通方法 - 普通方法应有清晰的...
- **规范**: 如果类支持克隆,需提供克隆方法。 - **示例**: ```java @Override public Object clone() { try { CounterSet obj = (CounterSet) super.clone(); return obj; } catch ...
- 类方法(静态方法)应按一定逻辑顺序排列,并添加适当的Javadoc注释。 **2.10 toString方法** - 实现`toString()`方法,以便于调试和展示对象的状态。 - `toString()`方法应返回一个描述对象状态的字符串。 **...
【描述】"xml-doclet.zip,javadoc到xmljavadoc到xml" 提到了两个部分,首先,`xml-doclet` 是一个Javadoc扩展,它将标准的Javadoc输出转换为XML格式,这对于自动化文档处理或进一步定制Javadoc信息非常有用。...
其次,`org.eclipse.jgit-2.0.0.201206130900-r-javadoc.jar`则是JGit的Java文档(Javadoc)包。它提供了JGit库的所有公共API的详细文档,对于理解和使用JGit的API非常有帮助。开发者可以通过查看这些文档快速了解每...
在压缩包文件名称列表中,我们看到"codeDocToMarkdown-master",这通常表示这是一个Git仓库的克隆,其中包含了项目的所有源代码、资源文件和可能的构建脚本。"master"分支通常是Git仓库的主要分支,代表了项目的最新...
适用于Android的Javadoc查看器 使用AndroidStudio进行设置 安装AndroidStudio 在AndroidStudio中安装Lombok插件 克隆项目 在AndroidStudio中打开项目 通过adb连接android设备(仿真器或真实设备) 运行 不使用IDE...
- API参考:详细列出SDK提供的类、方法和接口,以及它们的使用方法。 - 示例代码:演示如何初始化SDK、调用API以及处理响应。 - 故障排查:常见问题和解决方案。 通过解压"java-sdk-master.zip"并根据PDF文档的指导...
如果需要创建对象的副本,通常使用克隆机制(`clone()`方法)或其他方式手动实现。 #### 8. Java中的多继承问题 - **知识点**: 多继承、接口、抽象类 - **详细解释**: - **多继承**: - Java中类不支持多继承,即...
Javadoc注释通常位于类、接口、方法和字段声明之前。它用于生成API文档,以便在开发过程中查看。注释的基本格式包括文档描述、参数、返回值、异常和作者等信息。 11. Java程序结构示例: 文档最后给出了一个简单的...
- **Javadoc注释**:为公共API添加Javadoc注释,提供对方法、参数、返回值和异常的详细说明,有助于其他开发者快速理解代码意图。 #### 设计模式与面向对象编程 - **设计模式应用**:熟练掌握并恰当地运用设计模式...
- 类应包含`equals()`、`hashCode()`、`toString()`、`clone()`(实现`Cloneable`)以及`Serializable`接口,以便于比较、哈希计算、字符串表示和克隆操作。 3. **测试代码**: - 为每个类提供一个`main()`方法...
- **克隆方法**: 实现对象复制的`clone()`方法。 - **类方法**: 静态方法,与类而非实例关联。 - **toString方法**: 返回类实例的字符串表示。 - **main方法**: 应用程序的入口点,标记为`public static void ...
阿里云MaxCompute数据收集器 该项目是一组bigdata插件,用于与aliyun maxcompute...$ mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true 插件包位于每个插件子项目的target 。 用法 请参考的基本用法。
8. **2.8 克隆方法** - 实现`Cloneable`接口并重写`clone()`方法以支持对象的深拷贝或浅拷贝。 9. **2.9 类方法** - 提供静态方法来执行不依赖于类实例的操作。 10. **2.10 toString方法** - 重写`toString()`...