java的cloneable_Java中的克隆Cloneable

本文讲解了浅克隆与深克隆的区别及应用场景。浅克隆仅复制对象本身及其不可变成员,深克隆则完全复制对象及其所有成员。文章还介绍了如何在Java中实现这两种克隆方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅克隆与深克隆

当拷贝一个变量时,原始变量与拷贝变量引用了同一个对象。那么当改变一个变量所引用的对象时,就会对另一个变量产生影响。形象化一点说,就像某人A有一把遥控,用来控制电视,他把遥控交给了B,B用遥控来改变电视台,则对A来说,他看的节目台也发生相应变化。

Employee e1 =new Employee(“John”,5000);

Employee e2=e1;

e2.raiseSalary(500);

那么,如果我们希望得到一个拷贝,它与原拷贝互不影响,则就引入了克隆的概念。

Employee e2=e1.clone();

这会产生一个新的Employee对象e2,它与被克隆对象e1有相同的属性。并且e2与e1互不影响。

浅克隆

clone()方法是object类的proteced方法,由于这个类对于具体类一无所知,所以只能对各个域进行拷贝。

如果原始对象与拷贝对象的共享的子对象是不可变的,将不会产生任何问题。例如,①对象中的所有数据域是数值或基本类型②像String这样不允许改变的类③在其生命周期中不会发生变化,既没有修改它们的方法,也没有创建对它们的引用的方法

72914c33e4c75504ee3f0913c00b0875.png

浅克隆

域中包含对象的引用,则会使得克隆后的对象和以前的对象有着相同引用的域。这种只是单纯进行域的拷贝就称作浅克隆,而默认的方法就是浅克隆。

深克隆但是,更为常见的情况是子对象是可变的,这就要用到深克隆了。我们需要重新定义clone()方法。对那些非基本型别的域进行特殊的处理,例如本例中的hireDay。我们可以重新定义clone()方法,对hireDay做特殊处理,如下代码:

class Employee implements Cloneable

{

public Employee clone() throws CloneNotSupportedException

{

Employee cloned = (Employee) super.clone();

cloned.hireDay = (Date) hireDay.clone();//克隆可变域

return cloned;

}

}

注意:在Java SE 5.0以前的版本中,clone()方法返回Object类型。

具体的实现方法是:1、实现Cloneable接口2、重写clone()方法,并将其声明为public注释:在Object类中,clone()方法被声明为protected,因此不能直接通过对象调用anObject.clone()来直接克隆一个对象,而要依次克隆可变实例域。

另外,每个数组都包含了一个clone()方法,其返回值是public,而不是protected。可以利用这个方法创建包含所有数据元素拷贝的一个新数组。例如:

int[] array={1,2,3,4,5};

int[] cloned=array.clone();

cloned[0]=0;//不会改变array[0]的值

另外一种实现克隆的方法是Java序列化机制。两者的优缺点如下。克隆:显得比较笨拙,尤其在可变域较多时,则要依次进行拷贝,比较麻烦。java序列化:很容易实现,而且也很安全。但效率低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值