编程足球 发表于 2013-2-3 14:41:51

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 二月 110: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()); //1System.out.println(c1.getStrValue());//c1 的值System.out.println(c2.getIntValue());//2System.out.println(c2.getStrValue());//c2 的值// c1 和 c2 有不同的地址System.out.println(c1);//com.study.effective.clone.CloneClass@de6cedSystem.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 二月 111:08:26          * @version : 1.0 */class UnCloneClass1{public String value;}/**    ** @className :ShadowClone   * @package : com.study.effective* @Description :影子克隆的例子    * @author:lgf    * @date :2012 二月 110: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@c17164System.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 二月 111: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 二月 110: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@c17164System.out.println(depth); //effective.clone.ShadowClone@1fb8ee3// 指向不同的地址System.out.println(depthClone.unClass);//effective.clone.UnCloneClass2@61de33System.out.println(depth.unClass);//effective.clone.UnCloneClass2@14318bb}}
页: [1]
查看完整版本: java 关键字 clone