程序運行的結果為:
a:0
b:1
在實際編程中,經常會遇到從某個已有的對象A創建出另外一個與A具有相同狀態的對象B,並且對B的修改不會影響到A的情況,例如Prototype(原型)模式中,就需要clone一個對象實例。在Java語言中,僅僅通過簡單的賦值操作顯然無法達到這個目的,而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、把淺復制的引用指向原型對象新的克隆體。
淺復制和深復制
Java語言在重載clone()方法時也會出現同樣的問題,當類中只有一些基本的數據類型時,采用上述方法就可以了,但是當類中包含了一些對象時,就需要用到深復制了,實現方法是對對象調用clone方法完成復制后,接着對對象中的非解百納類型的屬性也調用clone()方法完成深復制。具體事例如下:
運行結果為:
a:Sat Mar 28 19:46:34 CST 2015
b:Thu May 28 19:46:34 CST 2015
確保類中包含的所有非基本類型的成員變量都實現了深復制
Object o=super.clone(); //先執行淺復制
對每一個對象attr執行下列語句
o.attr=this.getAttr().clone();
淺復制和深復制區別:
淺復制:被復制對象的所有變量都含有與原來對象相同的值,而所有對象的其他對象的引用仍然指向原來的對象。換言之,淺復制所考慮的對象,而不復制它所引用的對象。
深復制:被復制對象的所有變量都含有與原來對象相同的值,除去那些引用其他對象的變量。哪些引用其他對象的變量將指向被復制的新對象,而不再是原有的那些被引用的對象。深復制的對象所引用的對象都復制了一遍。