【问题标题】:How clone method and cloneable interface are interlinked while compile time? [closed]编译时克隆方法和可克隆接口如何相互关联? [关闭]
【发布时间】:2012-05-22 07:29:04
【问题描述】:

如果你实现了一个接口,编译器会要求你提供这些方法的实现。但是在调用重写的 clone() 方法的情况下,编译器如何知道在类声明中没有提到特定的接口(在这种情况下是 Cloneable)。编译器如何将此映射告诉用户 CloneNotSupported ?它与后期绑定有关吗?

我认为 JVM 有关于方法区域中每个类的信息,例如它正在扩展哪些类以及它正在实现哪些接口。所以调用 clone() 方法将检查那些存储的关于类的元数据并发现Cloneable 不在那个接口列表中?这是接近正确答案的地方吗?

【问题讨论】:

    标签: java oop late-binding


    【解决方案1】:

    你明白了。基本上,Object.clone() 方法执行以下操作:

    if (!(this instanceof Cloneable)) {
        throw new CloneNotSupportedException(); 
    }
    

    The javadoc 解释它:

    首先,如果这个对象的类没有实现接口 可克隆,然后抛出 CloneNotSupportedException。

    请注意,编译器与此无关。这一切都发生在运行时。

    【讨论】:

    • 虽然克隆是原生的 :) +1 代码 sn-p
    • 我在哪里可以找到这张支票?它来自克隆()的本机实现?请注意,我已经覆盖了 clone() 方法并且没有调用 super.clone()。而且我的封闭类没有实现可克隆。
    • 是的,它是在方法的本机代码中完成的。 javadoc 说:按照惯例,返回的对象应该通过调用 super.clone 来获得。遵循这个约定,或者选择另一个方法名,或者实现一个复制构造函数。
    猜你喜欢
    • 2012-06-26
    • 2012-12-23
    • 1970-01-01
    • 2011-10-06
    • 2011-08-24
    • 2014-07-02
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多