由于访问权限违规,后代没有看到clone()?

时间:2014-08-26 18:16:48

标签: java object inheritance clone

当我在课堂上实施Cloneable时,请说班级AA, class AA是可复制的 - 我可以在它的对象上调用clone() 没有获得CloneNotSupportedException。我能做到这一点 没有覆盖clone() (尽管建议将对象与其克隆保持独立)。

当一个类是Cloneable时,它的后代也是如此。

在以下代码中,

class ZZ {protected void mm(){System.out.println("+++");}}

class AA extends ZZ implements Cloneable {    
    // ...
    protected Object clone () throws CloneNotSupportedException {return super.clone();}
    AA cloneMe() throws CloneNotSupportedException { return (AA)clone(); }
}

class C extends AA  {
    public static void main(String[] args) throws CloneNotSupportedException {
        C c = new C();        
        AA a = new AA(); 
        AA a22 = (AA)(c.clone());   
        AA a3 = a.cloneMe();   
        C c2 = (C)c.clone();  

        AA a21 = (AA)a.clone();   
        a.mm();
    }
}

我收到了检查错误

clone() has protected access in Object

    AA a21 = (AA)a.clone();   

当我在clone()中评论AA的实施时,即

   // protected Object clone () throws CloneNotSupportedException {return super.clone();}

由于AA是可克隆的,我应该能够克隆它的实例而不在clone()本身中实现AAAAclone()继承Object

那么 - 怎么会出现这个错误?

TIA。

// =======================================

编辑:

我遇到与上面代码相​​同的问题,但类ZZ除外,它是以下代码:

class AA implements Cloneable {    
    // ...
    // protected Object clone () throws CloneNotSupportedException {return super.clone();}
    AA cloneMe() throws CloneNotSupportedException { return (AA)clone(); }
}

class C extends AA  {
    public static void main(String[] args) throws CloneNotSupportedException {
        C c = new C();        
        AA a = new AA(); 
        AA a22 = (AA)(c.clone());   
        AA a3 = a.cloneMe();   
        C c2 = (C)c.clone();  

        AA a21 = (AA)a.clone();   

    }
}

ZZ用于显示"孙子"的protected方法的调用。通过以类似的方式调用clone(),不会给出与错误相同的错误。

// ============================================= ==

修改-2:

super.clone() operation not works in Derived Class中的答案说

"Clone is one of the early designs in java and it has flaws".

这似乎是唯一的解释。正在寻找进一步的验证。

我之前和没有成功地研究过这个问题 - 除了他们在Java文档中的解释之外,还有更多关于本机方法的内容。仍然 - clone()的内部是任何更多 - 如何实施,如何克隆成员等以及它是如何管理"这个不寻常的访问权限?并根据情况??

0 个答案:

没有答案