今儿个,咱来聊聊Java里的clone()方法,这可是个有意思的小东西。说白,clone就是“复制”的意思,在咱Java里,就是把一个对象给完完整整地复制一份。
动手前的准备
我以为这玩意儿简单得很,不就是复制个对象嘛后来才发现,这里头还藏着不少门道。
要用clone(),得让你的类实现Cloneable接口。这接口啥也没定义,就一个空壳子,但它就像一个通行证,告诉JVM:“这个类可以被复制!”
开始实践
我就在我的类里重写Object的clone()方法。这方法默认是protected的,咱得把它改成public,这样才能在外面用。
我直接在clone()方法里调用*()。心想,这不就完事嘛Java都帮咱搞定。
public class MyObject implements Cloneable {

private int value;
// 构造函数和其他方法...
@Override
public Object clone() throws CloneNotSupportedException {
return *();

遇到的坑
结果,我发现事情没那么简单。如果我的类里只有基本类型的数据(像int、double这种),那这么做没问题。可一旦有引用类型(比如数组、其他对象),问题就来。
我发现,复制出来的对象和原来的对象,它们里面的引用类型竟然指向同一个地方!也就是说,改复制的对象,原来的对象也跟着变。这可不行,这哪是复制,简直就是“共享”嘛
深拷贝与浅拷贝
这时候,我就知道,原来clone()还分“深拷贝”和“浅拷贝”。
- 浅拷贝:只复制对象本身,不复制它里面的引用类型。
- 深拷贝:把对象本身和它里面的引用类型都复制一份,这样复制出来的对象才真正独立。
实现深拷贝
要实现深拷贝,就不能简单地调用*()。得自己动手,把里面的引用类型也一个个地clone()一遍。
public class MyObject implements Cloneable {
private int value;
private OtherObject other; // 假设OtherObject也实现Cloneable接口
// 构造函数和其他方法...

@Override
public Object clone() throws CloneNotSupportedException {
MyObject cloned = (MyObject) *(); // 先浅拷贝
* = (OtherObject) *(); // 再深拷贝other对象
return cloned;

这么一来,复制出来的对象和原来的对象就完全独立,改复制的对象,再也不会影响到原来的对象。
总结
clone()方法还是挺有用的,但用的时候得小心。要记住区分深拷贝和浅拷贝,根据自己的需要选择合适的拷贝方式。不然,一不小心就会踩坑,到时候可就麻烦。
这回实践让我对Java的clone()机制有更深的理解,也算是涨点经验。以后再遇到类似的问题,咱也就不慌。