java中clone(java中clone方法是深度拷贝吗)
华为云服务器特价优惠火热进行中! 2核2G2兆仅需 38 元;4核4G3兆仅需 79 元。购买时间越长越优惠!更多配置及优惠价格请咨询客服。
合作流程: |
今天给各位分享java中clone的知识,其中也会对java中clone方法是深度拷贝吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
微信号:cloud7591如需了解更多,欢迎添加客服微信咨询。
复制微信号
本文目录一览:
java代码 clone()函数的作用是什么?
从楼主对回答的追问上发现,楼主的连JAVA基本的语法都很差啊。=号是赋值运算符,不是比较。
double[] vectorValue;
vectorValue = vectorValue.clone();
这个段代码执行肯定报错了。但他还的意思还是很明确的。
首先:double[] vectorValue; 这个是定义了一个double类型的数组变量vectorValue。
其次:vectorValue = vectorValue.clone(); //这个是将vectorValue 克隆一份,赋值给自己。也就是说vectorValue变量指向了新的一块内存区域。
举个例子可能更能说明问题。
public class TestMain implements Cloneable {
private int i ;
public TestMain(int i){
this.i = i ;
}
@Override
protected Object clone() {
// TODO Auto-generated method stub
return new TestMain(this.getI()+1);
}
public int getI() {
return i;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestMain tm1 = new TestMain(1);
TestMain tm2 = tm1;
tm1 = (TestMain)tm1.clone();
System.out.println(tm1.getI()); //tm1指向的是通过clone()方法创建的新的对象的地址,i的值已经是2了。
System.out.println(tm2.getI()); //tm2指向的还是tm1创建时的地址,i的值为1
}
}

在java中 clone为什么要用super.clone()方法?
1.Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态得找到目前正在调用clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达到shallowcopy的目的。 \x0d\x0a 所以你调用super.clone() 得到的是当前调用类的副本,而不是父类的副本。根本没有必用调用this.clone();\x0d\x0a2.要让实例调用clone方法就需要让此类实现Cloneable接口,API里面还有句话是:如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常,这便是“合法”的含义。 但请注意,Cloneable接口只是个标签接口,不含任何需要实现的方法,就像Serializable接口一样。\x0d\x0a\x0d\x0a总之,一般如果你的子类没有特殊需要而重写clone()方法就直接用super.clone() 就行了。
java如何实现对象的深克隆?
/**定义用户**/
publicclassUser{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
}
/**地址**/
publicclassAddress{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
}
重载clone()方法
Object父类有个clone()的拷贝方法,不过它是protected类型的,
我们需要重写它并修改为public类型。
除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。
重写代码
让我们修改一下User类,Address类,实现Cloneable接口,使其支持深拷贝。
/**
*地址
*/
publicclassAddressimplementsCloneable{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
@Override
publicAddressclone()throwsCloneNotSupportedException{
return(Address)super.clone();
}
}
/**
*用户
*/
publicclassUserimplementsCloneable{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
@Override
publicUserclone()throwsCloneNotSupportedException{
Useruser=(User)super.clone();
user.setAddress(this.address.clone());
returnuser;
}
}
需要注意的是,super.clone()其实是浅拷贝,
所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。
扩展:
为什么要克隆?
大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?
答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。
提个醒,我们常见的Objecta=newObject();Objectb;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。
而通过clone方法赋值的对象跟原来的对象时同时独立存在的。
java中clone的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中clone方法是深度拷贝吗、java中clone的信息别忘了在本站进行查找喔。
