java如何实现对象的深克隆?

陈芝兰

30天以前 2浏览
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方法赋值的对象跟原来的对象时同时独立存在的。


本文仅代表作者观点,版权归属原创作者,如需转载请在文中标注来源及作则名字。

免责声明:本文系转载编辑文章,仅做分享只用,如有疑问请联系邮箱:110@zbj.com

java开发
大家都在看
java软件开发可以用哪些软件?

java软件开发可以用哪些软件?

java开发
6浏览
Java程序猿与网络安全哪个行业前景更好?

Java程序猿与网络安全哪个行业前景更好?

java开发
3浏览
web编程用JavaScript怎么样?

web编程用JavaScript怎么样?

java开发
3浏览
现在JAVA和前端哪个需求量大一点?

现在JAVA和前端哪个需求量大一点?

java开发
2浏览
WEB前端和JAVA哪个需求量大?

WEB前端和JAVA哪个需求量大?

java开发
2浏览
java如何实现对象的深克隆?

java如何实现对象的深克隆?

java开发
2浏览
javascript、JSP、JS有什么区别和联系?

javascript、JSP、JS有什么区别和联系?

java开发
2浏览
JAVA大家都用什么开发环境?

JAVA大家都用什么开发环境?

java开发
5浏览
java和javaWeb的区别关系?

java和javaWeb的区别关系?

java开发
2浏览
java的web开发需要用多线程吗?

java的web开发需要用多线程吗?

java开发
2浏览
Java的前景真的就比web前端好吗?

Java的前景真的就比web前端好吗?

java开发
2浏览
javascriptxxs攻击如何解决?

javascriptxxs攻击如何解决?

java开发
3浏览
想从事于开发岗位,JAVA和HTML5选择哪个好?

想从事于开发岗位,JAVA和HTML5选择哪个好?

java开发
5浏览
Java中常用的开发工具有哪些?

Java中常用的开发工具有哪些?

java开发
6浏览
PHP和Java相比哪个更好?为什么?

PHP和Java相比哪个更好?为什么?

java开发
2浏览
怎么看JAVA开源项目的源码?

怎么看JAVA开源项目的源码?

java开发
6浏览
作为一个java程序员经常上的网站?

作为一个java程序员经常上的网站?

java开发
3浏览
Javaweb技术中Java和JSP有什么关系?

Javaweb技术中Java和JSP有什么关系?

java开发
2浏览
java软件开发可以用哪些软件?

java软件开发可以用哪些软件?

java开发
3浏览
Java和web前端那个更有发展前进呢?

Java和web前端那个更有发展前进呢?

java开发
2浏览
点赞
收藏
分享