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接口只是起一个标记作用 自身感受 存在就有价值,无论你多么渺小卑微,但你就是这个社会的一部分,社会需要你,去构造出更精彩的社会
1.Java 中内置了一些很有用的接口 , Cloneable 就是其中之一 . Object 类中存在一个 clone 方法 , 调用这个方法可以创建一个对象的 " 拷贝 ". 2.来说说调用 clone 方法的注意事项:首先要先 实现Cloneable 接口,然后 重写克隆方法,这里我们会发现, Cloneable 是个空接口,就因为是,空接口才可以被继承。 代码: class Money implements Cloneable { public double m = 10.9; @Override protected Object CloneNotSupportedException { return super.clone(); } } public class Person implements 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接口出现了。
本文将详细探讨这两种复制方式的区别,以及如何利用Java的Cloneable接口来实现它们,帮助大家在面试和实际工作中更加游刃有余地应对相关问题。 三、使用Cloneable接口实现深浅复制接下来就用代码案例是分析讲解深拷贝与浅拷贝。Java提供了Cloneable接口来支持对象的复制。实现Cloneable接口的类需要重写clone()方法。 复杂例子接下就是实现Cloneable接口,重写clone()方法,如果是浅拷贝直接返回父级clone方法即可,如果是深拷贝这需要重新创建对象,如下: protected Object clone 使用Cloneable接口可以方便地实现对象的复制,但需要注意正确实现深拷贝逻辑。 Java的Cloneable接口提供了对象复制的机制,但实现深拷贝时需特别小心,确保所有引用类型属性都被正确复制,理解并正确应用这两种复制方式是编写高质量Java程序的关键,欢迎大家在评论区指点。
接下来我们将从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 接口实现原型模式 public class Graphics implements Cloneable { private final String color; 实现了 cloneable 接口,可以克隆一个区别于当前对象的另外一个新的对象,但对于对象中的引用,却不能进行克隆,你虽得到了他的人,但你却得不到他的心,如果想要得到他的心怎么办?拿钱砸他! 但是前提是他的心允许克隆(实现了 cloneable 接口)。 接口 // 引用类型实现了 cloneable 接口 public class Size implements Cloneable { public int width; public 优势: JDK 的 cloneable 接口是基于内存数据的直接复制,速度相较于 new 关键字创建对象更加快速;同时简化了创建过程(不会执行构造方法)。
然而,如果某个类的实例要调用clone()方法,该类必须显式地实现Cloneable接口。 在以下场景中,你可能会遇到这个异常: 当你尝试克隆一个没有实现Cloneable接口的类的实例时。 可能出错的原因 类型错误:尝试对一个没有实现Cloneable接口的类实例调用clone()方法。 接口的类的clone方法,会抛出异常 } } 正确代码示例 要让上面的代码工作,你需要确保MyClass实现了Cloneable接口,并且正确地覆盖了clone()方法(如果需要的话)。 这里是一个修正后的例子: public class MyClass implements Cloneable { // 实现Cloneable接口 private int value;
本节我们会讨论 Cloneable 接口,这个接口指示一个类提供了一个安全的 clone() 方法。 如果选择第 1 项或第 2 项,类必须:实现 Cloneable 接口;重新定义 clone() 方法,并指定 public 访问修饰符。 Cloneable 接口Cloneable 接口的出现与接口的正常使用并没有关系。具体来说,Cloneable 接口没有指定 clone() 方法,clone() 方法是从 Object 类继承的。 Cloneable 接口只是作为一个标记,指示类设计者了解克隆过程。 下面来看创建深拷贝的 done() 方法的一个例子:class Employee implements Cloneable { // ...
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方法进行同步的说明
原型类必须实现cloneable接口,实现clone方法。 二、实例 创建一个小兵的原型 public class BatmanPrototype implements Cloneable{ //横坐标 private double x; 这就需要重写原型的clone方法以及原型属性需要实现Cloneable接口。 public class BatmanPrototype implements Cloneable{ //横坐标 private double x; //纵坐标 private 三、源码实例 实现了Cloneable的接口都属于这种模式。
前提是类实现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
Prototype类需要具备以下两个条件: 实现Cloneable接口。 Java中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。 这里的孙悟空类SunWukong 是具体原型类,而 Java 中的Cloneable 接口是抽象原型类。 原型模式在JDK源码中的应用 首先查看 JDK 中的 Cloneable 接口。 public interface Cloneable { } 我们只需要在源码中看哪些类实现了 Cloneable 接口即可。下面是 ArrayList 类的实现代码。