obj.clone().getClass()==obj.getClass(),即它们具有相同的类型。还有一点,因为只是简单的将对象的空间进行复制,所以如果类具有引用类型的实例变量的话,也只是将这个引用进行拷贝,并不复制其引用的对象。这就导致拷贝对象的引用实例变量与原对象的指向相同的对象,这就是传说中的“浅拷贝”。如果实例变量引用的对象是不可变的,类似于String,则拷贝对象与原对象不能互相影响,这样的拷贝是成功的。但是如果引用的是可变对象,它们就会影响彼此,对于成功的拷贝而言,这是不允许的。可以对可变的实例变量对象进行特殊处理,以实现拷贝对象和原对象不能相互影响的“深拷贝”。
由于Object.clone()方法是protected的,所以它只能在lang包中的类或是其子类的方法内部被调用,所以,如果像下面这样调用,会编译出错,在Person kobe_bak=kobe.clone();报错,说clone只能在Object的protected作用域访问。
class Person implements Cloneable
{
private int age;
private String name;
private Date birth;
public Person(int a,String n,Date b){
age=a;
name=n;
birth=b;
}
public static void main(String[] args){
Person kobe=new Person(33,"kobe",new Date());
Person kobe_bak=kobe.clone();
}
}
clone方法的作用域限制不允许我们在其它地方访问,那我们就重写Object的clone方法,并扩大访问作用域为public,在Person类中添加clone的方法重写,调用super.clone(),也就是Object.clone()。
@Override
public Object clone(){
return super.clone();
}
然后编译,可以通过,接着运行程序,结果在Person kobe_bak=kobe.clone();抛出CloneNotSupportedException异常。这是因为Java只有一个类实现了Cloneable接口,才表示这个类可以被克隆。所以要想拷贝一个类的对象,必须让它实现Cloneable接口。这个接口只是一个标记接口,没有声明任何方法。
接下来,让Person类实现Cloneable接口,然后编译,运行,这个对象就被成功的克隆了。所以要想一个类可以被clone,必须满足两点:
第一,它必须实现了Cloneable接口,否则会抛出CloneNotSupportedException异常。
第二,它必须提供一个public的clone方法,也就是重写Object.clone()方法,否则编译不能通过。
第三,对于存在可变域的类,在clone方法中需要对这些可变域进行拷贝。
class Person implements Cloneable
{
private int age;
private String name;
private Date birth;
public Person(int a,String n,Date b){
age=a;
name=n;
birth=b;
}
public static void main(String[] args){
Person kobe=new Person(33,"kobe",new Date());
Person kobe_bak=kobe.clone();
}
@Override
public Object clone(){
Person p=(Person)super.clone();
//Date类型的birth域是可变变的,需要对其克隆,进行深拷贝
//Date类实现的克隆,直接调用即可
p.birth=this.birth.clone();
return p;
}
}
转自:http://www.crazyit.org
分享到:
相关推荐
今天小编就为大家分享一篇关于Java Clone深拷贝与浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
拷贝对象是java中经常会遇到的问题。java中存在两种类型,基础类型和引用类型。...Object对象中提供了一个clone方法,来供我们对java对象进行拷贝。 protected native Object clone() throws CloneNot
下面小编就为大家带来一篇深入理解JavaScript中的对象复制(Object Clone)。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
* 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 CloneNotSupportedException) * 注意: * 1.被克隆对象.clone()出的对象,是被克隆对象的当前状态 * 2.被克隆对象 如果...
主要介绍了java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口
(抱歉,我无法修改下载积分,本想着免积分的)C#浅拷贝(MemberwiseClone等多种方法)与深拷贝(反射、多种反序列化)实例
目录一、深拷贝与浅拷贝解析浅拷贝深拷贝二、数组拷贝的方式1.for循环来拷贝2.System.arraycopy( )拷贝3.Arrays.copyOf( )拷贝4.clone( )拷贝5.解释三、四种拷贝方式效率比较1. System.arraycopy( )2.Arrays.copyOf...
深化理解JavaScript中的对象复制(Object Clone)_.docx
详细的描述了Java中 clone方法使用
Java深浅clone测试代码 流拷贝 Cloneable
本文实例讲述了JavaScript对象的浅拷贝和深拷贝。分享给大家供大家参考,具体如下: 1、浅拷贝 仅仅复制对象的引用,而不是对象本身。 var person = { name: 'Alice', friends: ['Bruce', 'Cindy'] } var student...
下面小编就为大家带来一篇java object 之clone方法全面解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建
重写clone()方法,因为Object的clone()的修饰符是protected; @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; 实现Cloneable接口,否则会抛出...
主要介绍了Java中实现深拷贝的两种方式—clone() & Serialized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校
Object.clone()地位冠军:待定作者:亚历克斯·洛尔舞台:0-稻草人动机使用散布运算符... ,可以很容易地对对象进行浅表克隆。 在某些情况下,需要创建对象的深层克隆。 本地复制引用的内存比手动克隆要有效得多。...
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。