Cloneable接口分析

Cloneable接口是一个标记接口,也就是没有任何内容,定义如下:

package java.lang;
    pubilc interface Cloneable
    {
    }

这里分析一下这个接口的用法

clone方法是在Object中定义的,而且是protected型的,只有实现了这个接口,才可以在该类的实例上调用clone方法,否则会抛出CloneNotSupportException.Object中默认的实现是一个浅拷贝,也就是表面拷贝,如果需要实现深层次拷贝的话,必须对类中可变域生成新的实例.

pubilc class Unsupported{
    public Object clone(){
        Object obj;
        try {
            obj=super.clone();
        } catch (CloneNotSupportedException ex) {
            ex.printStackTrace(); //Exception was thrown
        }
        return obj;//返回的是null
   }
}

加上 implements Cloneable 就可以了.可不可以不实现这个接口,但是覆盖Clone方法.

pubilc class Unnormal{
    public Object clone(){
        return new Unnormal();
    }
}    

这样肯定没有问题的,不过已经和java中的clone机制没有关系了,下面举一个例子说明浅拷贝和深拷贝.

public class ShallowCopy implements Cloneable{
     private Date begin;
     public Date getBegin(){
         return this.begin;
     }
     public void setBegin(Date d){
         this.begin=d;
     }
     public Object clone(){
         Object obj=null;
         try {
             obj=super.clone();
        } catch (CloneNotSupportedException ex) {
             ex.printStackTrace(); 
        }
        return obj;
     }
}

public class DeepCopy implements Cloneable{
     private Date begin;
     public Date getBegin(){
         return this.begin;
     }
     public void setBegin(Date d){
         this.begin=d;
     }
     public Object clone(){
         DeepCopy obj=null;
         try {
             obj=(DeepCopy)super.clone();
         } catch (CloneNotSupportedException ex) {
             ex.printStackTrace(); 
         }
         obj.setBegin((Date)this.getBegin().clone());
         return obj;
    }
}                

 

原文地址:https://www.cnblogs.com/zq-inlook/p/3512394.html