在java中我们有和接口cloneable我想要理解的是为什么抽象类实现那个接口仍然没有抽象类中接口的clone()方法的实现?
答案 0 :(得分:0)
Cloneable接口只是为了表明该类支持Object.clone()中的clone方法。
一个类实现了Cloneable接口,以向Object.clone()方法指示该方法合法地为该类的实例创建一个字段的副本。
您不必实现此方法,Object.clone会以本机代码为您执行此操作:
protected native Object clone() throws CloneNotSupportedException;
看看这些链接: Object class source code和 Cloneable Interface docs
尽管如此,如果你在层次级别有一个抽象类,你不必在子类中实现Cloneable:
abstract class Animal implements Cloneable {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private int age;
@Override
public Dog clone() throws CloneNotSupportedException {
return (Dog)super.clone();
}
克隆仍支持Java
答案 1 :(得分:0)
在java中我们有和接口cloneable我想要理解的是 为什么抽象类实现那个接口仍然没有 在抽象类中实现接口的clone()方法?
Object类为Object
方法的clone()
方法提供默认实现。
当您查看Object
课程时,您可以看到clone()
在其签名中指定了特定关键字:native
。
protected native Object clone() throws CloneNotSupportedException;
native
关键字应用于方法,以指示它是在JNI
(Java本机接口)中实现的。
因此,实现存在于某个地方(可能在C函数中,但不仅仅是...),而不是直接在方法的Java源代码中。
最后,您应该将Cloneable interface
视为其代表:标记interface
。如果您希望自己反对克隆,请执行此操作,如果您不在乎,请不要执行任何操作:
一个类实现Cloneable接口以指示 Object.clone()方法,该方法的合法性 该类的实例的field-for-field副本。调用对象 克隆方法在未实现Cloneable的实例上 接口导致异常CloneNotSupportedException 抛出。
现在,如果clone()
方法(浅拷贝)的默认实现与您想要克隆对象的方式不匹配,请随意覆盖此对象的类中的clone()