当前位置: 移动技术网 > IT编程>开发语言>Java > 浅析Java中clone()方法浅克隆与深度克隆

浅析Java中clone()方法浅克隆与深度克隆

2019年07月22日  | 移动技术网IT编程  | 我要评论

   现在clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的clone机制是如何工作的?

     1. clone©

     假设现在有一个employee对象,employee tobby =new employee(“cmtobby”,5000),通
常我们会有这样的赋值employee cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,这样cindyelf或者tobby的一个操作都可能影响到对方。

打个比方,如果我们通过cindyelf.raisesalary()方法改变了salary域的值,那么tobby通过getsalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候我们就可以使用clone来满足我们的需求。

employee cindy=tobby.clone(),这时会生成一个新的employee对象,并且和tobby具有相同的属性值和方法。

      2. shallow clone&deep clone

clone是如何完成的呢?object在对某个对象实施clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是shallow clone。

这样,问题就来了咯,以employee为例,它里面有一个域hireday不是基本型别的变量,而是一个reference变量,经过clone之后就会产生一个新的date型别的reference,它和原始对象中对应的域指向同一个date对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的,过程下图所示:

 这个时候我们就需要进行deep clone了,对那些非基本型别的域进行特殊的处理,例如本例中的hireday。我们可以重新定义clone方法,对hireday做特殊处理,如下代码所示:

 class employee implements cloneable 
{ 
  public object clone() throws clonenotsupportedexception 
  { 
   employee cloned = (employee) super.clone(); 
  cloned.hireday = (date) hireday.clone() 
  return cloned; 
  } 
}

3. clone()方法的保护机制

在object中clone()是被申明为protected的,这样做是有一定的道理的,以employee

类为例,通过申明为protected,就可以保证只有employee类里面才能“克隆”employee对象,原理可以参考我前面关于public、protected、private的学习笔记。

4. clone()方法的使用

clone()方法的使用比较简单,注意如下几点即可:

a. 什么时候使用shallow clone,什么时候使用deep clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable

b. 调用clone()方法的对象所属的类(class)必须implements clonable接口,否则在调用clone方法的时候会抛出clonenotsupportedexception。

希望本篇文章可以帮助到小伙伴们

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网