java基础之克隆

Java提高篇——对象克隆(复制)

浅克隆

被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)。

再覆盖clone()方法,访问修饰符设为public方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)。

浅克隆不会调用类的构造方法。

深克隆

其实就是将引用对象也执行它的clone方法,例

java.util.Date:

/**

* Return a copy of this object.

*/public Object clone() { 

    Date d =null; 

    try { 

        d = (Date)super.clone(); 

        if(cdate !=null) { 

            d.cdate = (BaseCalendar.Date) cdate.clone(); 

        } 

    } catch(CloneNotSupportedException e) {}// Won't happen  return d; 


深克隆还可通过序列化实现(如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式来实现对象的深克隆。)

序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现Serializable接口,否则无法实现序列化操作。

Java语言提供的Cloneable接口和Serializable接口的代码非常简单,它们都是空接口,这种空接口也称为标识接口,标识接口中没有任何方法的定义,其作用是告诉JRE这些接口的实现类是否具有某个功能,如是否支持克隆、是否支持序列化等。

你可能感兴趣的:(java基础之克隆)