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; } }