Object的clone()方法、深拷贝、浅拷贝

原文:http://yangyangmyself.iteye.com/blog/1050674

obj.clone().getClass()==obj.getClass(),即它们具有相同的类型。还有一点,因为只是简单的将对象的空间进行复制,所以如果类具有引用类型的实例变量的话,也只是将这个引用进行拷贝,并不复制其引用的对象。这就导致拷贝对象的引用实例变量与原对象的指向相同的对象,这就是传说中的“浅拷贝”。如果实例变量引用的对象是不可变的,类似于String,则拷贝对象与原对象不能互相影响,这样的拷贝是成功的。但是如果引用的是可变对象,它们就会影响彼此,对于成功的拷贝而言,这是不允许的。可以对可变的实例变量对象进行特殊处理,以实现拷贝对象和原对象不能相互影响的“深拷贝”。

  由于Object.clone()方法是protected的,所以它只能在lang包中的类或是其子类的方法内部被调用,所以,如果像下面这样调用,会编译出错,在Person kobe_bak=kobe.clone();报错,说clone只能在Object的protected作用域访问。 

Java代码 收藏代码
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()。

Java代码 收藏代码
@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方法中需要对这些可变域进行拷贝。

Java代码 收藏代码
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;    
}    

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
在 Java 中,对象的拷贝可以分为深拷贝浅拷贝浅拷贝(Shallow Copy)是指创建一个新对象,新对象的属性和原对象的属性值相同,如果属性是引用类型,则仅复制引用而不复制引用对象本身。换句话说,浅拷贝只是复制了引用,两个对象将共享同一个引用对象。 深拷贝(Deep Copy)是指创建一个新对象,同时复制其引用类型的属性所引用的对象,而不是仅复制引用。深拷贝会创建一个完全独立的对象,修改其中一个对象的属性不会影响另一个对象。 在 Java 中,要实现深拷贝可以使用以下几种方式: 1. 实现 Cloneable 接口并重写 clone() 方法: ```java public class MyClass implements Cloneable { private int num; private MyObject obj; @Override protected Object clone() throws CloneNotSupportedException { MyClass cloned = (MyClass) super.clone(); cloned.obj = (MyObject) obj.clone(); return cloned; } } ``` 2. 使用序列化和反序列化: ```java import java.io.*; public class MyClass implements Serializable { private int num; private MyObject obj; public MyClass deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream output = new ByteArrayOutputStream(); ObjectOutputStream objOutput = new ObjectOutputStream(output); objOutput.writeObject(this); ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); ObjectInputStream objInput = new ObjectInputStream(input); return (MyClass) objInput.readObject(); } } ``` 需要注意的是,要实现深拷贝,对象及其引用类型的属性必须都要实现 Cloneable 接口或者是可序列化的。另外,深拷贝可能会带来性能上的开销,因为需要复制对象及其引用类型的属性。因此,在使用深拷贝时要谨慎考虑性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值