clone() java_Clone()方法详解

本文详细介绍了Java中对象克隆的原理,包括如何实现克隆以及克隆的两种类型:浅拷贝和深拷贝。通过示例代码展示了如何在自定义类中实现深拷贝以确保对象之间的独立性。浅拷贝仅复制对象本身,而深拷贝则递归复制对象内部的可变对象,确保新旧对象完全分离。
摘要由CSDN通过智能技术生成

一、克隆的原理与应用

clone在堆上分配内存,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。如果,想要对该对象进行处理,又想保留原来数据进行接下来的操作,clone就很方便。

二、克隆的实现

1、被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。Cloneable 接口实际上是个标识接口,没有任何接口方法。

2、覆盖Object.clone()方法。

三、浅拷贝与深拷贝

浅拷贝:在填充新对象域的时候,进行简单的字段赋值。

深拷贝:按照惯例,此方法返回的对象应该独立于该对象(正被复制的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。(简单来说,就是将该对象内部的对象也克隆一份,而不是简单的引用赋值)

(可变对象:对象创建后字段值可以改变)

浅拷贝:

classHead {

String s;voidset(String s1) {

s=s1;

}

}public class Person implementsCloneable{

Head head;

Person(Head head) {this.head =head;

}protected Object clone() throwsCloneNotSupportedException{return super.clone();

}public static void main(String[] args) throwsCloneNotSupportedException{

Person p= new Person(newHead());

Person p1=(Person)p.clone();

System.out.println("p == p1 " + (p ==p1));

System.out.println("p.head == p1.head " + (p.head ==p1.head));

}

}

输出结果:

p == p1 false

p.head == p1.head true

结果分析:

可以从结果过中看到,克隆创建了一个新的Person对象,但是p.head与p1.head仍然指向同一对象,也就是说p与p1仍然存在联系,这是我们不想看到的。

深拷贝:

class Head implementsCloneable{

String s;voidset(String s1) {

s=s1;

}protected Object clone() throwsCloneNotSupportedException{return super.clone();

}

}public class Person implementsCloneable{

Head head;

Person(Head head) {this.head =head;

}protected Object clone() throwsCloneNotSupportedException{

Person p= (Person)super.clone();

p.head=(Head)head.clone();returnp;

}public static void main(String[] args) throwsCloneNotSupportedException{

Person p= new Person(newHead());

Person p1=(Person)p.clone();

System.out.println("p == p1 " + (p ==p1));

System.out.println("p.head == p1.head " + (p.head ==p1.head));

}

}

输出结果:

p == p1 false

p.head == p1.head false

结果分析:要实现深层拷贝要将对象内部的对象拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值