clone()方法、深复制和浅复制

时间:2022-11-18 19:18:28

clone方法

  Java中没有明确提供指针的概念和用法,而实质上没个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如何去操作这个指针而已。

  在实际编程中,经常会遇到从某个已有对象A创建出另一个与A具有相同状态的对象B,并且B的修改不会影响到A的情况,例如Prototype(原型)模式中,就需要clone一个对象实例。

  仅仅通过简单的复制操作显然无法达到这个目的,而Java提供了一个简单有效的clone()方法来满足这个需求。

  Java中所有的类默认都继承自Object类,而Object类中提供了一个clone()方法,作用是返回一个Object对象的复制。这个复制函数返回的是新的对象而不是一个引用。

使用clone()方法的步骤:

  1)实现clone的类首先需要继承Cloneable接口。  Cloneable接口实质上是一个标识接口,没有任何接口方法;

  2)在类中重写Object类中的clone()方法;

  3)在clone方法中调用super.clone(),无论clone类的继承结构是什么,super.clone()都会直接或间接地调用java.lang.Object类的clone()方法;

  4)把浅复制的引用指向原型对象新的克隆体。

  当类中只有一个基本的数据类型时,采用浅复制;

  当类中包含了一些对象时,就需要用到深复制了,实现方法是在对对象调用clone()方法完成复制后,接着对对象中的非基本类型也调用clone()方法完成深复制。

  如何选择使用哪种复制方式呢?

    首先,检查类有无非基本类型(即对象)的数据成员。 若没有,则返回super.clone()即可;若有,确保类中包含的所有非基本类型的成员变量都实现了深复制。

  浅复制、深复制

  浅复制(Shallow Clone):被复制对象的所有变量都含有与原来对象相同的值,而所有对其它对象的引用仍然指向原来的对象。

  换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

  深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,出去那些引用其它对象的变量。  那些引用其它对象的变量将指向被复制的新对象,而不再是原来的那些被引用的对象。

  换言之,深复制把复制的对象所引用的对象都复制了一遍。

  例如定义了如下一个类:

  class Test{

    public int i;

    public StringBuffer s;

  }

  对这个类的对象进行复制时,浅复制与深复制的区别:

        clone()方法、深复制和浅复制