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开发
3浏览
作为java初级程序员,该去国企还是私企?

作为java初级程序员,该去国企还是私企?

java开发
5浏览
java微信开发框架使用文档,如何新建微服务?

java微信开发框架使用文档,如何新建微服务?

java开发
7浏览
如何深刻理解JavaWeb中session和cookie?

如何深刻理解JavaWeb中session和cookie?

java开发
6浏览
php和java相比,应该往哪个方向发展?

php和java相比,应该往哪个方向发展?

java开发
3浏览
web开发JAVA,GO,PHP,Python哪种语言好?

web开发JAVA,GO,PHP,Python哪种语言好?

java开发
8浏览
java开发app案例教程,java开发手机app教程

案例app开发app开发手机app教程手机开发手机appjavajava开发
73浏览
java如何实现对象的深克隆?

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

java开发
2浏览
Java网站系统建设有什么好处?

Java网站系统建设有什么好处?

java开发
2浏览
web前端和java,哪个比较好一些呢?

web前端和java,哪个比较好一些呢?

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

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

java开发
6浏览
什么场景用java,什么场景用python?

什么场景用java,什么场景用python?

java开发
5浏览
哪些网站可以在线构建java框架?

哪些网站可以在线构建java框架?

java开发
6浏览
Java编程中的性能优化如何实现?

Java编程中的性能优化如何实现?

java开发
6浏览
选择web前端还是java后端呢?

选择web前端还是java后端呢?

java开发
4浏览
java做web比python做web好在哪?

java做web比python做web好在哪?

java开发
4浏览
Go语言出后,Java还是最佳选择吗?

Go语言出后,Java还是最佳选择吗?

java开发
9浏览
net和java两个方向哪个比较好?

net和java两个方向哪个比较好?

java开发
5浏览
java软件开发到底是干什么的?

java软件开发到底是干什么的?

java开发
4浏览
java开发一个网站平台技术方面需要考虑哪些?

java开发一个网站平台技术方面需要考虑哪些?

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