Java的克隆技术

本文介绍了Java中的克隆技术,通过实例展示了如何实现`Cloneable`接口并重写`clone()`方法来创建对象的副本。内容包括如何调用`super.clone()`避免`CloneNotSupportedException`异常,并返回克隆后的对象。
摘要由CSDN通过智能技术生成

 

public class Unclone implements Cloneable{

 

private String name = "hc";

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public Object clone(){

Object o = null;

try {

o = super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return o;

}

@Override

public String toString() {

return name;

}

}

package com.huangcheng.clone;
import java.util.HashMap;
import java.util.Map;
/**
 * Java之中把一个对象“=”另一个对象的操作,本质是把右边对象的引用赋给了左边的对象
 * 例如:C1=C2,就是把C2对象的引用赋给了C1,此时C1与C2都同时指向同一块内存空间,
 * 此时对任意一个对象的操作都会引起另外一个对象的改变。
 * 
 * 有时我们希望得到这样的一个对象,这个对象的初始值跟另外一个是一模一样的,同时我们又希望在改变
 * 新对象的同时原先的对象不会有所改变,这里运用克隆就会简洁很多,当然也许你会说我可以New一个
 * 新对象,然后再对这个对象进行一一赋值,这样的方法是比较费时间的,同时也降低了运行效率
 * 例如:有对象C1,我们想得到另一个对象C2,而且C2的初始值跟C1一模一样,同时我们希望对 C2的修改
 * 不会影响到C1的改变,这种时候就用克隆
 * 
 * 调用父类clone()方法的类必须继承Cloneable接口,否则会报CloneNotSupportedException错误
 * @author hc
 *
 */
public class Testclone implements Cloneable{
private int i = 1;
private StringBuffer strbuf = new StringBuffer("你们好?");
private HashMap<Integer, String> map = new HashMap<Integer, String>();
private Unclone unclone = new Unclone();
public Testclone(){
map.put(1, "abc");
map.put(2, "ABC");
unclone.setName("刘德华!");
}
public Object clone(){
Testclone o = null;
try {
o = (Testclone)super.clone();
//此处对对象的引用类型的属性进行深度复制,如果没有进行深度复制,
//那么当你对新对象的引用属性改变时,也会引起本来对象引用属性的改变
//试着把下面这三行代码注释掉,运行出来的效果是完全不一样的
o.unclone = (Unclone) unclone.clone();
o.strbuf = new StringBuffer();
o.map = (HashMap<Integer, String>) map.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public static void main(String[] args) {
Testclone c1 = new Testclone();
System.out.println("---------------实现克隆之前C1的值-----------------");
System.out.println("c1:整形I的值:"+c1.i+",Stringbuffer的值:"+c1.strbuf+",map的值:"+c1.map.entrySet()+", unclone的值:"+c1.unclone);
Testclone c2 = (Testclone)c1.clone();
//修改C2对象的各个值
c2.i = 99;
c2.strbuf = c2.strbuf.append("我很好!");
c2.map.put(3, "EFG");
c2.unclone.setName("张含韵");
//修改完毕
System.out.println("---------------实现克隆之后C1与C2的值-----------------");
System.out.println("c1:整形I的值:"+c1.i+",Stringbuffer的值:"+c1.strbuf+",map的值:"+c1.map.entrySet()+", unclone的值:"+c1.unclone);
System.out.println("c2:整形I的值:"+c2.i+",Stringbuffer的值:"+c2.strbuf+",map的值:"+c2.map.entrySet()+", unclone的值:"+c2.unclone);
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值