日期:2014-05-20  浏览次数:20636 次

Object clone() 的一些讨论
最近看到了一个关于使用Object   clone()方法进行复制的例子,对这个有点疑问,不知道大家怎么使用这个问题的呢?拿出来讨论一下,hoooo~    
最好拿个例子出来讨论一下,满意送分!

------解决方案--------------------
clone就是对象的复制,在某些场合可以代替new操作,并且能带来性能上更好的效果,以下是摘自CSDN的“qj_peng的专栏”,具体地址:http://blog.csdn.net/qj_peng/archive/2007/05/14/1608298.aspx

java clone
有时我们确实需要clone一个对象,最好的方法还是使用Object的clone方法,由jdk调用native方法来实现,这样效率比较高。先来个shallow clone,再来deep clone。

shallow clone


代码如下:
待clone的对象

package practisejava.others.clone;

/**
* 待clone的对象,必须实现Cloneable这个tag interface
*/
public class ObjectToClone implements Cloneable{
private int i=0;

public void setNum(int i){
this.i=i;
}

public int getNum(){
return this.i;
}

public void tellNum(){
System.out.println( "the number is "+i);
}
// 重写Object的clone
public Object clone() throws CloneNotSupportedException {
return (ObjectToClone)super.clone();
}
}
clone测试

package practisejava.others.clone;

/**
* 测试clone是否成功
*/
public class CloneTest {
public static void main(String[] args) {
ObjectToClone otc = new ObjectToClone();
otc.setNum(888);

// 开始clone了!
ObjectToClone cloneObject = null;
try {
cloneObject = (ObjectToClone) otc.clone();
} catch (CloneNotSupportedException ex) {
System.out.println( "Sorry,Clone Not Supported! ");
}

// 测试clone是否成功
if(cloneObject!=null){
System.out.println( "before clone ");
System.out.println( "ObjectToClone get number : " + otc.getNum()+ "\n ");

System.out.println( "after clone ");
System.out.println( "ObjectToClone get number : " + otc.getNum());

cloneObject.setNum(999);
System.out.println( "CloneObject get number : " + cloneObject.getNum());
}
}
}
执行结果

before clone
ObjectToClone get number : 888

after clone
ObjectToClone get number : 888
CloneObject get number : 999



从运行结果看,修改了clone体的值并没有影响到原来被clone体的值,哈哈,clone成功。高兴得太早了,ObjectToClone里只有简单的非引用属性,如果有引用的属性,还能成吗?答案是否定的!看下面的例子:
被clone对象引用的对象
------解决方案--------------------
上面说的深度clone就是被clone对象中所有的引用类型的成语变量自身也要实现clone方法,这个应该不难理解
------解决方案--------------------
事实上,clone的应用场合不多,几乎可以不用。