`

克隆(Cloneable )

    博客分类:
  • Java
阅读更多

克隆

Object.clone() 访问修饰符为 protected ,如果某个类没有重写此方法,则这个类除被自己与子类能调用 clone() 方法外(实质上此时该类与子类访问的都是继承自 Object clone() 方法),其他不管与这个类是在同一包还是不同包都是不可见的(这个好比:一个 B 类继承了 A 类, A 类在一个包中, B C在同另一包中,如果 A 中有一个 protected 方法没有在 B 中重写,则在C类中是不能调用的,即使现在 BC 为同包,因为实际上该方法属于 A 类,C与 A 是不同包不子类关系)。

集合类 ArrayList 重写了 clone 方法,但却是浅复制,在克隆集合类时,他不会循环去调用集合中对象的克隆方法,所以是浅拷贝,之所以这样设计,可能原因就是放在集合里的对象不一定都具有克隆的能力。所以如果想对 ArrayList 进行深层拷贝,以下操作是必须的:克隆了 ArrayList 之后,必须遍历 ArrayList 中的每个对象,逐一克隆。对 HashMap 做深层拷贝时,也必须做类似的操作。

Object.clone() 能够按对象大小创建足够的内存空间,从旧对象到新对象,复制所有的比特位。   这被称为逐位复制。但是, Object.clone() 在执行操作前,会先检查此类是否可克隆,即检查   它是否实现了 Cloneable 接口。如果没有实现此接口, Object.clone() 会抛出 CloneNotSuppo  rtedException 异常,说明它不能被克隆。

 

使某类具有克隆能力要具备以下三点:

1 、类要实现 Cloneable 标志接口 , 即使重写了 clone 方法 , 如果类没有重写 Object clone 方法时会抛出 CloneNotSupportedException 异常 ( 注:当然是要在调用 Object clone 方法时才会抛出 )

2 、将自己的克隆方法申明成 public ,为了其他类可以克隆

3 、在重写的方法中调用父类克隆方法: super.clone()

 

java 常用 API 中重写了克隆的类有:

  java.util.EnumMap.clone()    java.util.EnumSet.clone()

  java.util.ArrayList.clone()    java.util.LinkedList.clone()

  java.util.Vector.clone()  java.util.HashMap.clone()

  java.util.Hashtable.clone()    java.util.TreeMap.clone()

  java.util.IdentityHashMap.clone()    java.util.TreeSet.clone()

  java.util.HashSet.clone()    java.util.Calendar.clone()

  java.util.GregorianCalendar.clone()    java.util.Date.clone()

 

分享到:
评论

相关推荐

    java 深克隆 浅克隆

    浅克隆是通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来实现的。当一个对象被浅克隆时,新创建的对象会拥有原始对象的所有字段的副本,但是这些字段如果是引用类型(比如对象),则新旧对象共享同一...

    java 深克隆浅克隆

    为了实现浅克隆,你需要确保你的类实现了`Cloneable`接口,并重写了`clone()`方法。 2. 深克隆(Deep Clone): 深克隆则会创建一个与原始对象完全独立的新实例,包括所有引用的对象。在深克隆过程中,不仅复制对象...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    在Java编程语言中,克隆是一种创建对象副本的技术,它允许我们复制一个对象的状态而不影响原始对象。...在设计类和系统时,应考虑对象复制的需求,并决定是否实现`Cloneable`接口,以及选择哪种克隆策略。

    clone 深度克隆对象

    此外,如果对象内部包含不可克隆的对象(如final类型的对象或没有实现Cloneable接口的对象),则需要手动处理这些特殊情况。 对于第二种方式,我们首先将对象序列化为字节流,然后将字节流反序列化回新的对象。这种...

    设计模式-克隆模式(讲解及其实现代码)

    实现克隆模式通常需要实现`Cloneable`接口,并重写`Object`类中的`clone()`方法。但需要注意的是,`Object`的`clone()`方法默认是保护级别的,需要在类中将其开放为公开方法。此外,由于`clone()`方法是基于二进制流...

    JAVA浅克隆与深克隆

    // 实现Cloneable接口并重写clone()方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } // Student.java public class Student extends Parent { ...

    java深度克隆

    - **性能开销**:序列化与反序列化实现的深度克隆在性能上不如使用`Cloneable`接口的方式,但其适用范围更广。 - **兼容性问题**:使用`Cloneable`接口时需要注意类的继承关系和实现细节。 - **异常处理**:无论哪种...

    克隆和序列化(Java )

    2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅克隆只会复制对象自身的属性,如果对象中包含其他对象的引用,那么这些引用会被共享。 3. **深克隆**:深克隆需要递归...

    Cloneable:使用C#Source Generator自动生成克隆方法

    安装可克隆您应该安装 : Install-Package Cloneable或者通过 .NET Core 命令行界面: dotnet add package Cloneable来自包管理器控制台或 .NET Core CLI 的任一命令都将下载并安装 Cloneable 和所有必需的依赖项。...

    java的深度克隆的例子

    在Java中,克隆操作是通过实现`Cloneable`接口和重写`Object`类的`clone()`方法来完成的。但需要注意的是,`clone()`方法默认执行的是浅克隆,因此如果对象中包含对其他对象的引用,这些引用不会被复制。为了实现...

    JAVA_对象克隆

    1. 实现`Cloneable`接口:为了让对象可以被克隆,首先需要在类声明中添加`implements Cloneable`。 2. 覆盖`clone()`方法:重写`clone()`方法,通常只需返回`super.clone()`,但要注意处理可能抛出的`...

    gson深度克隆jar包

    Gson深度克隆是一个利用Gson库实现对象深度克隆的工具,主要通过将对象序列化为JSON字符串,再从JSON字符串反...易用性:无需实现Cloneable接口,适合快速开发。 性能考虑:适用于小到中等规模对象,性能开销相对较低。

    Java对象的复制克隆

    为了使对象可克隆,子类需要实现 `Cloneable` 接口,这是一个标记接口,不包含任何方法,只是告诉Java虚拟机(JVM)该对象支持克隆。同时,由于 `clone()` 是 `native` 方法,它的执行效率通常高于普通的Java方法。 ...

    java克隆对象(两种方法)

    java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 CloneNotSupportedException) * 注意: * 1.被克隆对象.clone()出的对象,是被克隆对象的当前状态 * 2.被克隆对象 如果...

    cloneable-readable:安全地克隆可读流

    克隆可读 安全地克隆可读流。 'use strict'var cloneable = require ( 'cloneable-readable' )var fs = require ( 'fs' )var pump = require ( 'pump' )var stream = cloneable ( fs . createReadStream ( './...

    如何进行Java对象的克隆.pdf

    一个类要实现克隆必须重写 Object 类的 clone() 方法,并且要实现 Cloneable 接口。 例如,我们可以创建一个 Person 类,该类有一个 name 属性,并实现了 Cloneable 接口。在 clone() 方法中,我们可以创建一个新的...

Global site tag (gtag.js) - Google Analytics