javaclone对象克隆老手都在用的技巧分享!

吉云

今儿个,咱来聊聊Java里的clone()方法,这可是个有意思的小东西。说白,clone就是“复制”的意思,在咱Java里,就是把一个对象给完完整整地复制一份。

动手前的准备

我以为这玩意儿简单得很,不就是复制个对象嘛后来才发现,这里头还藏着不少门道。

javaclone对象克隆老手都在用的技巧分享!

要用clone(),得让你的类实现Cloneable接口。这接口啥也没定义,就一个空壳子,但它就像一个通行证,告诉JVM:“这个类可以被复制!”

开始实践

我就在我的类里重写Object的clone()方法。这方法默认是protected的,咱得把它改成public,这样才能在外面用。

我直接在clone()方法里调用*()。心想,这不就完事嘛Java都帮咱搞定。


public class MyObject implements Cloneable {

javaclone对象克隆老手都在用的技巧分享!

private int value;

// 构造函数和其他方法...

@Override

public Object clone() throws CloneNotSupportedException {

return *();

javaclone对象克隆老手都在用的技巧分享!

遇到的坑

结果,我发现事情没那么简单。如果我的类里只有基本类型的数据(像int、double这种),那这么做没问题。可一旦有引用类型(比如数组、其他对象),问题就来。

我发现,复制出来的对象和原来的对象,它们里面的引用类型竟然指向同一个地方!也就是说,改复制的对象,原来的对象也跟着变。这可不行,这哪是复制,简直就是“共享”嘛

深拷贝与浅拷贝

javaclone对象克隆老手都在用的技巧分享!

这时候,我就知道,原来clone()还分“深拷贝”和“浅拷贝”。

  • 浅拷贝:只复制对象本身,不复制它里面的引用类型。
  • 深拷贝:把对象本身和它里面的引用类型都复制一份,这样复制出来的对象才真正独立。

实现深拷贝

javaclone对象克隆老手都在用的技巧分享!

要实现深拷贝,就不能简单地调用*()。得自己动手,把里面的引用类型也一个个地clone()一遍。


public class MyObject implements Cloneable {

private int value;

private OtherObject other; // 假设OtherObject也实现Cloneable接口

// 构造函数和其他方法...

javaclone对象克隆老手都在用的技巧分享!

@Override

public Object clone() throws CloneNotSupportedException {

MyObject cloned = (MyObject) *(); // 先浅拷贝

* = (OtherObject) *(); // 再深拷贝other对象

return cloned;

javaclone对象克隆老手都在用的技巧分享!

这么一来,复制出来的对象和原来的对象就完全独立,改复制的对象,再也不会影响到原来的对象。

总结

clone()方法还是挺有用的,但用的时候得小心。要记住区分深拷贝和浅拷贝,根据自己的需要选择合适的拷贝方式。不然,一不小心就会踩坑,到时候可就麻烦。

这回实践让我对Java的clone()机制有更深的理解,也算是涨点经验。以后再遇到类似的问题,咱也就不慌。

javaclone对象克隆老手都在用的技巧分享!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]