作者:haijiaoxu_512 | 来源:互联网 | 2023-09-14 09:45
jdk1.8中Cloneable接口的源码如下:
/*Cloneable接口源代码,JDK1.8*/
public interfaceCloneable {
}
我们会发现一件很有意思的事情,那就是Cloneable接口竟然没有定义任何的接口方法,这是为什么呢?
Cloneable接口之所以没有定义任何的接口的原因其实很简单,那就是在Java中,所有类的终极父类已经将clone()方法定义为所有类都应该具有的基本功能,只是将该方法声明为了protected类型。该方法定义了逐字段拷贝实例的操作。它是一个native本地方法,因此没有实现体,而且在拷贝字段时,除了Object类的字段外,其子类的新字段也将被拷贝到新的实例中。
/*Object类中clone()方法的定义*/
protected native Object clone() throws CloneNotSupportedException;
看到这里,有同学可能会想,既然Object类中既然已经有了一个定义实例拷贝操作的方法,那为什么还是需要让想具备实力拷贝功能的类实现Cloneable接口呢?其实,Cloneable接口在这里起到了一种标识的作用,表明实现它的类具备了实例拷贝功能,在Cloneable接口的官方javadoc文档中有这样一段话:
"Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown. JDK1.8"
也就是说,如果一个类不实现该接口就直接调用clone()方法的话,即便已将clone()方法重写为public,那还是会抛出“不支持拷贝”异常。因此,要想使一个类具备拷贝实例的功能,那么除了要重写Object类的clone()方法外,还必须要实现Cloneable接口。下面的代码即可以使一个Cloneableclass具备了浅拷贝实例(关于浅拷贝和深拷贝的含义将会在下一节介绍,在这里读者只需要将它看作普通拷贝即可)的功能。
class CloneableClass implementsCloneable {/** user code....*/@Overridepublic Object clone() throwsCloneNotSupportedException {return super.clone();
}//clone
}/*CloneableClass*/