克隆
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()
相关推荐
安装可克隆您应该安装 : Install-Package Cloneable或者通过 .NET Core 命令行界面: dotnet add package Cloneable来自包管理器控制台或 .NET Core CLI 的任一命令都将下载并安装 Cloneable 和所有必需的依赖项。...
有关Java中的克隆技术的详细讲述,其中讲解了“浅复制”和“深复制”的用法和区别,继承了Java中的封装类Cloneable
java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)
* 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 CloneNotSupportedException) * 注意: * 1.被克隆对象.clone()出的对象,是被克隆对象的当前状态 * 2.被克隆对象 如果...
克隆可读 安全地克隆可读流。 'use strict'var cloneable = require ( 'cloneable-readable' )var fs = require ( 'fs' )var pump = require ( 'pump' )var stream = cloneable ( fs . createReadStream ( './...
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(已测试)...
浅克隆: package testclone; public class ShallowClone implements Cloneable { public String name; public String[] name2; public ShallowClone() { name2 = new String[2]; } public Object clone() {...
Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口
一、核心作用: ...实现Cloneable接口和重写clone()方法 四、示例: 一、浅克隆 实体类: package com.hezeu.prototype; import java.io.Serializable; import java.util.Date; /** *@Classname She
1.在类定义中实现Cloneable接口 2.在类中覆盖基类的clone()方法,声明为public,注意 4.使用clone方法时要进行强制转换 1.“浅克隆
ArrayList集成AbstractList抽象类,实现了List、RandomAccess、Cloneable、java.io.Serializable这四个接口,其中我们可以看到,实现了Cloneable和Serializable接口就代表着ArrayList是支持克隆和序列化的,这里有个...
深克隆和浅克隆 2. Compare 实现Compare和Comparator的区别 3. Hash Hash值比较、HashSet特点、Final特点 4. Iterator 迭代器的用法 5. KeyWord volatiled和atomic 6. List ArrayList和LinkedList的区别和删除时注意...
克隆或分叉仓库 安装一般要求 Python 3.7以上 点子 Pipenv 使用提供的Pipfile和pipenv install创建一个新的pipenv。 这安装及其要求。 (注意,如果愿意,您可以简单地运行pip install brain-brew ,但建议使用虚拟...
国际植保组织 不可变- with s一起使用with而不是setter 静态类型-您的工具喜欢它可克隆-没有参考共享可序列化-JSON,数组和字符串―自动生成的普通PHP对象。 :shield: 在其最严格的级别上验证lib的源代码及其生成的...
HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap存数据的过程是: HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一...
当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。 47.java.lang.EnumConstantNotPresentException 枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象...
一个类想要使用克隆方法 重写clone()方法,因为Object的clone()的修饰符是protected; @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; 实现Cloneable接口,否则...
主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...