java 关键字 clone

1. 最简单的clone例子

/**
*
*/
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

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值