服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java中的clone机制


  java中有两种clone方式,一种是浅拷贝,一种是深拷贝.
object 定义了clone方法,而且定义为protected保护型,返回object.

如果你要使自定义的类能够被clone,就必须实现cloneable接口并且
重写clone()方法.


class clonetest1() implements cloneable
{
java.util.date date;
public object clone()
{
try {
return super.clone();
}
catch (clonenotsupportedexception ex) {
    //如果没有实现cloneable接口,抛出异常
return null;
}
  }
}

clonetest1简单的实现了clone()方法,只是简单的调用object的clone()方法.
这种方式属于浅拷贝,只是clone了clonetest1的表层.测试如下:
clonetest1 src=new clonetest1();
clonetest1 des=(clonetest1)src.clone();
system.out.println(src==des); //false 说明有两个clonetest1的实例.
system.out.println(src.date==des.date); //true 指向相同的数据成员.

有时候我们需要一个完全的备份,就是深层次的拷贝

class clonetest2 implements cloneable{
java.util.date date;
public object clone(){
try {
clonetest2 ct=(clonetest2)super.clone();
ct.date=date.clone();
return ct;
}
catch (clonenotsupportedexception ex) {
return null;
}
}
}

上面的实现就是一个深拷贝了,要实现深拷贝类中的数据成员都得是cloneable的(当然
你也可以不是,那就是自找麻烦):
class notcloneable{
public string str;
}
class clonetest3{
notcloneable nc;
public clone(){
try
{
clonetest3 ct=(clonetest3)super.clone();
ct.nc=new notcloneable();
ct.nc.str=str;
return ct;
}
catch (clonenotsupportedexception ex) {
return null;
}
}
}
这样虽然也实现了深拷贝,但是非常不好.

扫描关注微信公众号