前言:
Object提供了一个拷贝方法,用于重新创建出一个数据一样的对象或者数据的副本。拷贝的意义在于节省创建对象的成本,避免原对象的数据修改。
Clonable接口内部:
可以看到,Clonable接口就只有一副空壳,也就是空接口,空接口干什么的呢?也很好理解,空接口也叫标记接口,表示当前类是可以克隆的,克隆自然不需要什么成员,只需要等着拷贝过来的对象复制就行了
clone方法内部:
可以看到后面有一串字符,throws CloneNotSupportedException
翻译过来就是抛出了CloneNotSupportedException异常(后续关于异常也会出相关的博客)
所以我们调用的时候要在main方法后面加上这一串字符:
整体代码实现就是这样:
注意的点是
1.clone的返回类型
2.throws CloneNotSupportedException异常
3.实现Clonable接口后才能调用
拷贝概念
如上面创建的Sheep对象s和克隆对象c来演示:
浅拷贝
例如我们在Sheep类里面再创建一个对象,想让克隆出来的类内部对象的属性不同于原类内部对象的属性,则我们可以这样:
但是结果发现,虽然改的是克隆对象的数据,但是连着原对象的数据也给改了。原因是因为类的内部对象并没有克隆,改的都是原对象引用出来的数据,如图详解:
这个就是浅拷贝,只拷贝外面的对象,里面的对象则拷贝不到。
深拷贝
要想完成原类和克隆类的内部对象数据不一,我们得让类内部的对象也给克隆出来:
先让wool类实现clone方法:
然后修改一下Sheep类的clone方法,让它先克隆出一个wool类对象再返回:
注意是先实现Cloable接口后才能调用clone方法!!!
然后我们就得到结果,发现只修改了克隆对象的数据:
以上就是运用Object类的克隆方法的注意事项,能否给个赞来支持一下