【Java基础】Cloneable接口源码分析

jdk1.8中Cloneable接口的源码如下:

/*Cloneable接口源代码,JDK1.8*/
public interface Cloneable {
}

  我们会发现一件很有意思的事情,那就是Cloneable接口竟然没有定义任何的接口方法,这是为什么呢?

  Cloneable接口之所以没有定义任何的接口的原因其实很简单,那就是在Java中,所有类的终极父类已经将clone()方法定义为所有类都应该具有的基本功能,只是将该方法声明为了protected类型。该方法定义了逐字段拷贝实例的操作。它是一个native本地方法,因此没有实现体,而且在拷贝字段时,除了Object类的字段外,其子类的新字段也将被拷贝到新的实例中。

<span style="font-size: 18px;">/*Object类中clone()方法的定义*/
protected native Object clone() throws CloneNotSupportedException;</span>

  

  看到这里,有同学可能会想,既然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 implements Cloneable {
    
    /*
     * user code....
     */
 
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }// clone
 
}/*CloneableClass*/

 

posted @ 2020-11-30 20:13  3KBLACK  阅读(142)  评论(0)    收藏  举报