Cloneable 接口指示了一个类提供了一个安全的clone方法。...注意: Cloneable接口的出现与接口的正常实现没有关系。具体讲,它(Cloneable接口)没有指定clone方法,这个方法是从Object类继承的(应该是实现接口的类从Object类继承)。...Cloneable接口的作用只是作为一个标记,指示 类设计者 了解克隆过程。...Cloneable接口是Java提供的一组标记接口(tagging interface)之一。有些程序员也称之为记号接口(marker interface)。...当然,Employee和Date类实现了Cloneable接口,所以不会抛出这个异常。
步骤:1、建立两个简单的POJO:Teacher和Student 2、Teacher类实现了Cloneable接口,重写clone方法 3、在main方法中建立teacher,然后clone,比较teacher...和clone出来的teacher Teacher类: public class Teacher implements Cloneable,Serializable{ private String name
要想实现克隆,只需定义的类声明下cloneable这个标记性接口,并且衍生重写Object类中就有的clone()方法即可. 为什么类要首先声明cloneable标记接口,然后重写clone()方法?...因为不声明cloneable调用clone()方法会抛出CloneNotSupportedException异常,源码如下: protected Object clone() throws CloneNotSupportedException...(this instanceof Cloneable)) { throw new CloneNotSupportedException(“Class ” + getClass().getName()...+ ” doesn’t implement Cloneable”); } return internalClone(); } /* * Native helper method for cloning...实现深克隆(实现很简单只需要引用类型变量实现cloneable接口即可),相比浅克隆,只需做如下修改. public class Animal implements Cloneable{ private
谢谢大家的支持…… 视频地址:http://edu.csdn.net/lecturer/994 自我介绍 大家好,我叫能复制,英文名字叫“Cloneable”, 住java.lang这个家,我这个人怎么说...//Cloneable内部实现 package java.lang; public interface Cloneable { } 替自己说几句话吧!...如果类没有实现Cloneable接口,调用类对象的clone方法抛出CloneNotSupportedException Object类的clone方法是Protected,所以你必须覆盖Object里面的...clone()方法才能让其它的类可以使用该类的clone方法 Cloneable接口只是起一个标记作用 自身感受 存在就有价值,无论你多么渺小卑微,但你就是这个社会的一部分,社会需要你,去构造出更精彩的社会
; } public void setName(String name) { this.name = name; } } public class SomeClass implements Cloneable
Object clone() throws CloneNotSupportedException; 一个本地方法,protected权限: 这样做是为避免我们创建每一个类都默认具有克隆能力 1.2 实现Cloneable...接口 我们要使用一个对象的clone方法,必须Cloneable接口,这个接口没有任何实现,跟 Serializable一样是一种标志性接口 如果不实现Cloneable接口,会抛出CloneNotSupportedException...异常 重写clone方法,使用public修饰(否则外部调用不到),调用父类的clone方法 如下: public class CloneModel implements Cloneable{...例子: class Model2{ int height; } public class CloneModel implements Cloneable{ private String...getModel2()==cloneModel2.getModel2()); } 执行返回:true 3.2 如何实现深克隆 还是上面的例子,我们改下代码 class Model2 implements Cloneable
先来看看JDK的解释: java.lang.Cloneable A class implements the Cloneable interface to indicate to the java.lang.Object.clone...Invoking Object’s clone method on an instance that does not implement the Cloneable interface results...Author: unascribed See Also: java.lang.CloneNotSupportedException java.lang.Object.clone() 意思就是: 此类实现了 Cloneable...如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。...这个时候就需要Cloneable接口出现了。
接下来我们将从Cloneable接口的源码入手,对其技术细节和使用方法进行详细的介绍。 二、源码分析 打开JavaSE源码找到Coloneable接口,其源代码如下。...我们会发现一件很有意思的事情,那就是Cloneable接口竟然没有定义任何的接口方法,这是为什么呢?.../*Cloneable接口源代码,JDK1.8*/ public interface Cloneable { } Cloneable接口之所以没有定义任何的接口的原因其实很简单,那就是在Java...其实,Cloneable接口在这里起到了一种标识的作用,表明实现它的类具备了实例拷贝功能,在Cloneable接口的官方javadoc文档中有这样一段话: “Invoking Object...因此,要想使一个类具备拷贝实例的功能,那么除了要重写Object类的clone()方法外,还必须要实现Cloneable接口。
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
先定义一个原型复制的接口 type Cloneable struct { Clone() Cloneable } 再实现一个原型管理器 type PrototypeManager struct...{ prototypes: make(map[string]Cloneable), } } func (p *PrototypeManager) Get(name string) Cloneable...{ return p.prototypes[name] } func (p *PrototypeManager) Set(name string, prototype Cloneable) {...() Cloneable } type PrototypeManager struct { prototypes map[string]Cloneable } func NewPrototypeManager...() *PrototypeManager { return &PrototypeManager{ prototypes: make(map[string]Cloneable), } } func
目的是如果一个类想要允许其他人克隆它,那么它应该支持Cloneable接口并使用公共克隆方法覆盖默认的受保护克隆方法。不幸的是,由于在时间迷雾中方便丢失的原因,Cloneable接口没有定义克隆方法。...有些类声称支持Cloneable,但不小心忘记支持克隆方法。开发人员对Cloneable应该如何工作以及克隆应该做什么感到困惑。不幸的是,向Cloneable添加”克隆”方法将是一种不兼容的更改。...轶事证据表明,在实践中,有许多类支持Cloneable接口,但无法提供公共克隆方法。经过讨论,TRC一致建议我们不要修改现有的Cloneable接口,因为兼容性影响。...尝试克隆未实现Cloneable接口的实例会导致抛出CloneNotSupportedException异常。 Cloneable接口声明没有方法。...因此Cloneable的诞生是为了表明程序员的意图。所以,简而言之。 Cloneable的目的不是表明你有一个公共clone()方法。
本节我们会讨论 Cloneable 接口,这个接口指示一个类提供了一个安全的 clone() 方法。...如果选择第 1 项或第 2 项,类必须:实现 Cloneable 接口;重新定义 clone() 方法,并指定 public 访问修饰符。...Cloneable 接口Cloneable 接口的出现与接口的正常使用并没有关系。具体来说,Cloneable 接口没有指定 clone() 方法,clone() 方法是从 Object 类继承的。...Cloneable 接口只是作为一个标记,指示类设计者了解克隆过程。...下面来看创建深拷贝的 done() 方法的一个例子:class Employee implements Cloneable { // ...
通过 cloneable 接口实现原型模式 public class Graphics implements Cloneable { private final String color;...实现了 cloneable 接口,可以克隆一个区别于当前对象的另外一个新的对象,但对于对象中的引用,却不能进行克隆,你虽得到了他的人,但你却得不到他的心,如果想要得到他的心怎么办?拿钱砸他!...但是前提是他的心允许克隆(实现了 cloneable 接口)。...接口 // 引用类型实现了 cloneable 接口 public class Size implements Cloneable { public int width; public...优势: JDK 的 cloneable 接口是基于内存数据的直接复制,速度相较于 new 关键字创建对象更加快速;同时简化了创建过程(不会执行构造方法)。
原型类必须实现cloneable接口,实现clone方法。...二、实例 创建一个小兵的原型 public class BatmanPrototype implements Cloneable{ //横坐标 private double x;...这就需要重写原型的clone方法以及原型属性需要实现Cloneable接口。...public class BatmanPrototype implements Cloneable{ //横坐标 private double x; //纵坐标 private...三、源码实例 实现了Cloneable的接口都属于这种模式。
,该接口表示该类能够复制且具有复制的能力说了这么长一串,就是告诉大家:必须实现 Cloneable 接口原型模式里有哪些角色呢?...碰巧Java中的 Cloneable 接口就可以表示它具体原型类。它就是负责实现复制或克隆现有实例的类示例来看看克隆羊的例子吧!...public class Sheep implements Cloneable { private String name; private Integer age; private...String没有实现Cloneable,但它是“不可变的”,表现出来的是“深拷贝”的特性。...好在我们的 Sheep 也实现了 Cloneable 类。克隆一份 sheep 对象赋值回去就达到深拷贝的效果了。
11.Override clone judiciously 大意为 明智地重写clone方法 说到clone方法,我们来提一提Cloneable这个接口,这个接口是用来作为一种标记某对象允许被clone...你并不应该仅仅由于实现了Cloneable接口就去直接调用一个对象的clone方法。...的异常 一个接口这样被使用是极其罕见的,从未见过其他的接口有这样的作用 一般来说,实现一个接口是用来让这个能够做某些事情,而Cloneable则是修改了父类的protected方法的实现,如果实现Cloneable...Note that all arrays are considered to implement the interface Cloneable and that the return type of...的接口,这样就给了子类自由,让子类决定是否去实现cloneable接口 还需要提及的就是,当你想编写一个线程安全的类,并且这个类继承了Cloneable的接口的话,你就应该对clone方法进行同步的说明
, java.io.Serializable public class CopyOnWriteArrayList implements List, RandomAccess, Cloneable..., java.io.Serializable 我们可以看到ArrayList和CopyOnWriteArrayList都实现了List,RandomAccess,Cloneable,Serializable...大家第一个想到的可能就是创建一个新的接口,继承List, RandomAccess, Cloneable, java.io.Serializable,然后createList返回该新创建的接口即可。...public interface ListInterface extends List, RandomAccess, Cloneable, java.io.Serializable {}...答案当然是可以的,看下面的例子: public & RandomAccess & Cloneable & java.io.Serializable, E> T
前提是类实现Cloneable接口,Cloneable接口没有任何方法,是一个空接口,也可以称这样的接口为标志接口,只有实现了该接口,才会支持clone操作。...Object中有一个clone方法,为什么还必须要实现Cloneable接口呢,这就是cloneable接口这个标志接口的意义,只有实现了这个接口才能实现复制操作, 因为jvm在复制对象的时候,会检查对象的类是否实现了...Cloneable这个接口,如果没有实现,则会报CloneNotSupportedException异常。...例如: package com.miivii.javalib; public class Bean implements Cloneable { private String name;...只是修改Bean,其他不变再看打印 package com.miivii.javalib; public class Bean implements Cloneable { private
Cloneable接口与Serializable接口都是定义接口而没有任何的方法。Cloneable可以实现对象的克隆复制,Serializable主要是对象序列化的接口定义。...JDK提供的Cloneable接口正是为了解决对象复制的问题而存在。Cloneable结合Serializable接口可以实现JVM对象的深度复制。...Java JDK定义的接口 本文涉及到的两个接口都是功能定义接口没有实际的方法声明: java.lang.Cloneable /* * Copyright (c) 1995, 2004, Oracle...{ } Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!...接口对Java对象进行克隆 实现克隆的步骤: 1.让该类实现java.lang.Cloneable接口; 2.
过了一段时间,我们来观察一下本体与分身的生存状态: 在Java语言中,Object类实现了Cloneable接口,一个对象可以通过调用Clone()方法生成对象,这就是原型模式的典型应用。...但需要注意的是,clone()方法并不是Cloneable接口里的,而是Object类里的,Cloneable是一个标识接口,标识这个类的对象是可被拷贝的,如果没有实现Cloneable接口,却调用了clone...(this instanceof Cloneable)) { throw new CloneNotSupportedException("Class " + getClass().getName...() +" doesn't implement Cloneable"); } return internalClone();}// Native helper method for cloning.private...// 乡镇街道 public String street; } } // 这是一个更复杂的、支持深拷贝的用户类 public class User implements Cloneable
领取专属 10元无门槛券
手把手带您无忧上云