Cloneable接口分析

Cloneable接口是一個標記接口,也就是沒有任何內容,定義以下:java

package java.lang;
    pubilc interface Cloneable
    {
    }

這裏分析一下這個接口的用法this

clone方法是在Object中定義的,並且是protected型的,只有實現了這個接口,才能夠在該類的實例上調用clone方法,不然會拋出CloneNotSupportException.Object中默認的實現是一個淺拷貝,也就是表面拷貝,若是須要實現深層次拷貝的話,必須對類中可變域生成新的實例.spa

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方法.
code

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

這樣確定沒有問題的,不過已經和java中的clone機制沒有關係了,下面舉一個例子說明淺拷貝和深拷貝.
orm

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;
    }
}                
相關文章
相關標籤/搜索