Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口扩展了可克隆性_Java_Cloneable - Fatal编程技术网

Java接口扩展了可克隆性

Java接口扩展了可克隆性,java,cloneable,Java,Cloneable,我不明白为什么我们不能做到以下几点: interface MyInterface extends Cloneable {} class myClazz implements MyInterface { public Object clone() { return null; } } class test{ public static void main(String[]a){ MyInterface o = new myClazz(); o.c

我不明白为什么我们不能做到以下几点:

interface MyInterface extends Cloneable {}

class myClazz implements MyInterface {
    public Object clone() { return null; }
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.clone(); // IMPOSSIBLE
    }
}
但这很管用

interface Misc{
    public void testM();
}

interface MyInterface extends Misc{}

class myClazz implements MyInterface {
    public void testM() {}
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.testM(); // OK
    }
}
Cloneable怎么了


谢谢,

这只是因为clone()在
对象中不是公共的。如果您在接口中声明
public Object clone()
,换句话说,如果您将第一个示例与第二个示例相同,那么第一个示例将起作用。

可克隆的
接口没有任何方法。
它只是一个标记接口(受
保护
)检查


如果您想要一个
clone
方法,您需要自己声明它。

这是因为
Cloneable
接口不是一个正常的接口,而是一个或多或少的标记接口,它向JVM确保实现它的类的
clone
方法是合法的,并且实际工作

正如文档所述,
Cloneable
接口没有声明
clone
方法的签名。该方法在您从
对象
类声明的任何类中固有地继承,但默认情况下它受
保护
。这就是为什么你应该在你声明的中间接口<代码> MySudio中使它成为<代码>公共< /代码>。 请看Java文档中给出的提示:

请注意,此接口不包含克隆方法。因此,仅仅因为对象实现了该接口,就不可能克隆对象。即使以反射方式调用clone方法,也不能保证它会成功

将Clone()方法添加到MyInterface接口。