Cloneable

作者: 抬头挺胸才算活着 | 来源:发表于2021-12-24 17:38 被阅读0次
    • 如何实现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的使用

    相关文章

      网友评论

          本文标题:Cloneable

          本文链接:https://www.haomeiwen.com/subject/gfglqrtx.html