-
如何实现Cloneable接口?
1、让该类实现java.lang.Cloneable接口;
实现Cloneable接口后对象才可以使用super.clone(),不然直接使用会报CloneNotSupportedException异常。
2、重写(Override)Object的clone()方法;
3、一般会调用super.clone() -
浅拷贝与深拷贝
super.clone()只能复制基本类型和引用类型的引用,因此是浅拷贝。 -
如何实现深拷贝
在浅拷贝的基础上调用引用类型的clone方法或者自己new对应的类型。 -
为什么实现Cloneable接口后对象才可以使用super.clone()
clone是一个native方法,代码如下:
可以看到该方法检查了当前类是否实现了Cloneable接口,如果没有调用到这里就会抛出异常
作者:木女孩
链接:https://www.zhihu.com/question/52490586/answer/130744569
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#ifdef ASSERT
// Just checking that the cloneable flag is set correct
if (obj->is_array()) {
guarantee(klass->is_cloneable(), "all arrays are cloneable");
} else {
guarantee(obj->is_instance(), "should be instanceOop");
bool cloneable = klass->is_subtype_of(SystemDictionary::Cloneable_klass());
guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
}
#endif
// Check if class of obj supports the Cloneable interface.
// All arrays are considered to be cloneable (See JLS 20.1.5)
if (!klass->is_cloneable()) {
ResourceMark rm(THREAD);
THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
}
参考资料:
Java中Cloneable的使用
网友评论