1. 最简单的clone例子
2. 影子克隆
3. 深度克隆
/**
*
*/
package com.study.effective.clone;
/**
* 简单的Clone例子
* 1. 必须实现Cloneable接口,这个类才可以调用clone方法,不然会报错
* @className :CloneClass
* @package : com.study.effective
* @Description :最简单的Clone例子.
* @author:lgf
* @date :2012 二月 1 10:29:09
* @version : 1.0
*/
public class CloneClass implements Cloneable{
// 定义测试属性
private int intValue;
private String strValue;
public int getIntValue() {
return this.intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String getStrValue() {
return this.strValue;
}
public void setStrValue(String strValue) {
this.strValue = strValue;
}
/**
* 克隆测试
* 最简单的例子
* 就是直接调用自身的super.clone();
*/
public Object clone(){
CloneClass o = null;
try {
o = (CloneClass)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public static void main(String[] args) {
CloneClass c1 = new CloneClass();
c1.setIntValue(1);
c1.setStrValue("c1 的值");
CloneClass c2 = (CloneClass)c1.clone();
c2.setIntValue(2);
c2.setStrValue("c2 的值");
System.out.println(c1.getIntValue()); // 1
System.out.println(c1.getStrValue()); // c1 的值
System.out.println(c2.getIntValue()); // 2
System.out.println(c2.getStrValue()); // c2 的值
// c1 和 c2 有不同的地址
System.out.println(c1);//com.study.effective.clone.CloneClass@de6ced
System.out.println(c2);//com.study.effective.clone.CloneClass@c17164
}
}
2. 影子克隆
package com.study.effective.clone;
/**
* @className :UnCloneClass1
* @package : com.study.effective.clone
* @Description :未重载clone方法
* @author:lgf
* @date :2012 二月 1 11:08:26
* @version : 1.0
*/
class UnCloneClass1{
public String value;
}
/**
*
* @className :ShadowClone
* @package : com.study.effective
* @Description :影子克隆的例子
* @author:lgf
* @date :2012 二月 1 10:40:58
* @version : 1.0
*/
public class ShadowClone implements Cloneable{
//基本属性
public int intValue;
//对象属性
public UnCloneClass1 unClass;
public ShadowClone(UnCloneClass1 unClass,int intValue){
this.unClass = unClass;
this.intValue = intValue;
}
public Object clone(){
ShadowClone o = null;
try {
o = (ShadowClone)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public static void main(String[] args) {
// 影子克隆
UnCloneClass1 cloClass = new UnCloneClass1();
cloClass.value = "影子克隆例子";
ShadowClone shadowclone = new ShadowClone(cloClass,10);
ShadowClone shadow = (ShadowClone)shadowclone.clone();
// 打印值UnCloneClass1 类的 value值
System.out.println(shadowclone.unClass.value); //影子克隆例子
System.out.println(shadow.unClass.value); //影子克隆例子
shadowclone.unClass.value = "克隆类的新值";
System.out.println(shadowclone.unClass.value); //克隆类的新值
System.out.println(shadow.unClass.value); //克隆类的新值
// 查看地址
System.out.println(shadowclone); //effective.clone.ShadowClone@c17164
System.out.println(shadow); //effective.clone.ShadowClone@1fb8ee3
//effective.clone.UnCloneClass1@61de33 两个类的unClass 属性指向同一个地址
System.out.println(shadowclone.unClass);
System.out.println(shadow.unClass);
}
}
3. 深度克隆
package com.study.effective.clone;
/**
* @className :UnCloneClass2
* @package : com.study.effective.clone
* @Description :实现重载clone 方法的对象
* @author:lgf
* @date :2012 二月 1 11:10:31
* @version : 1.0
*/
class UnCloneClass2 implements Cloneable{
public String value;
/**
* 类本身重载clone方法
*/
public Object clone(){
UnCloneClass2 o = null;
try {
o = (UnCloneClass2)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
/**
*
* @className :DepthClone
* @package : com.study.effective
* @Description :深度克隆
* @author:lgf
* @date :2012 二月 1 10:59:17
* @version : 1.0
*/
public class DepthClone implements Cloneable{
public int intValue;
public UnCloneClass2 unClass;
public DepthClone(UnCloneClass2 unClass,int intValue){
this.unClass = unClass;
this.intValue = intValue;
}
public Object clone(){
DepthClone o = null;
try {
o = (DepthClone)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
o.unClass = (UnCloneClass2)unClass.clone();
return o;
}
public static void main(String[] args) {
// 影子克隆
UnCloneClass2 cloClass = new UnCloneClass2();
cloClass.value = "影子克隆例子";
DepthClone depthClone = new DepthClone(cloClass,10);
DepthClone depth = (DepthClone)depthClone.clone();
// 打印值UnCloneClass1 类的 value值
System.out.println(depthClone.unClass.value); //影子克隆例子
System.out.println(depth.unClass.value); //影子克隆例子
depthClone.unClass.value = "克隆类的新值";
System.out.println(depthClone.unClass.value); //克隆类的新值
System.out.println(depth.unClass.value); //影子克隆例子
// 查看地址
System.out.println(depthClone); //effective.clone.ShadowClone@c17164
System.out.println(depth); //effective.clone.ShadowClone@1fb8ee3
// 指向不同的地址
System.out.println(depthClone.unClass); //effective.clone.UnCloneClass2@61de33
System.out.println(depth.unClass); //effective.clone.UnCloneClass2@14318bb
}
}