`

克隆(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()

 

分享到:
评论

相关推荐

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

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

    详解Java中的克隆技术

    有关Java中的克隆技术的详细讲述,其中讲解了“浅复制”和“深复制”的用法和区别,继承了Java中的封装类Cloneable

    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 ( './...

    deep_cloneable:这个宝石给每一个ActiveRecord

    deep_cloneable 这个gem为每个ActiveRecord :: Base对象提供了进行深度克隆的可能性,该克隆包括用户指定的关联。 这是的Rails 3+升级。要求Ruby 1.9.3、2.0.0、2.1.5、2.2.2、2.3.0、2.4.4、2.5.5、2.6.3(已测试)...

    Java浅克隆与深克隆

    浅克隆: package testclone; public class ShallowClone implements Cloneable { public String name; public String[] name2; public ShallowClone() { name2 = new String[2]; } public Object clone() {...

    bigcoder84#study-notes#_4Object中的clone方法1

    Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口

    GOF23之原型模式

    一、核心作用: ...实现Cloneable接口和重写clone()方法 四、示例: 一、浅克隆 实体类: package com.hezeu.prototype; import java.io.Serializable; import java.util.Date; /** *@Classname She

    06 类与对象31

    1.在类定义中实现Cloneable接口 2.在类中覆盖基类的clone()方法,声明为public,注意 4.使用clone方法时要进行强制转换 1.“浅克隆

    List集合之ArrayList

    ArrayList集成AbstractList抽象类,实现了List、RandomAccess、Cloneable、java.io.Serializable这四个接口,其中我们可以看到,实现了Cloneable和Serializable接口就代表着ArrayList是支持克隆和序列化的,这里有个...

    蓝桥杯leetcode-JavaBase:Java一些类测试用例

    深克隆和浅克隆 2. Compare 实现Compare和Comparator的区别 3. Hash Hash值比较、HashSet特点、Final特点 4. Iterator 迭代器的用法 5. KeyWord volatiled和atomic 6. List ArrayList和LinkedList的区别和删除时注意...

    brain-brew-starter:可克隆的仓库过去是Brain Brew的新起点

    克隆或分叉仓库 安装一般要求 Python 3.7以上 点子 Pipenv 使用提供的Pipfile和pipenv install创建一个新的pipenv。 这安装及其要求。 (注意,如果愿意,您可以简单地运行pip install brain-brew ,但建议使用虚拟...

    ippo:不可变,静态类型,可克隆和可序列化的自动生成的纯老式PHP对象

    国际植保组织 不可变- with s一起使用with而不是setter 静态类型-您的工具喜欢它可克隆-没有参考共享可序列化-JSON,数组和字符串―自动生成的普通PHP对象。 :shield: 在其最严格的级别上验证lib的源代码及其生成的...

    超实用的面试题整理

    HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap存数据的过程是: HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一...

    java编程常见问题

    当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。 47.java.lang.EnumConstantNotPresentException 枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象...

    结合JVM解读浅拷贝和深拷贝

    一个类想要使用克隆方法 重写clone()方法,因为Object的clone()的修饰符是protected; @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; 实现Cloneable接口,否则...

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

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

Global site tag (gtag.js) - Google Analytics