Java数组如何实现Cloneable接口?

5
Object#clone() 文档 可以得知:

请注意,所有数组都被认为实现了 Cloneable 接口。否则,此方法创建此对象类的新实例,并使用与此对象对应字段的内容完全初始化所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅复制”,而不是“深复制”操作。

但从 java.util.Arrays 类文档 中找不到 Arrays implements Cloneable 的信息。
那么,数组是如何实现 Cloneable 的呢?

2
java.util.Arrays类不是数组实例的基类。事实上,它的所有方法都是静态的,并且它不实现Cloneable接口。 - Kevin A. Naudé
2个回答

5
您可能会混淆 java.util.Arrays,这是一个普通类,包含一些用于处理数组的方法和数组这个在Java语言中相当特殊但仍然是对象和一个合成类。这个类实现了 Cloneable 接口,也直接继承自 Object 类。可以查看关于数组的JLS页面,这个网页非常清楚地阐述了这个问题。
例如,看一下下面这段代码(从前面提到的JLS中摘取):
class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

这将打印出以下内容:
class [I
class java.lang.Object

我能否获得一些文档来参考数组,就像我们有Java Docs的Array类一样? - user2488578
我所了解的最接近的是:http://docs.oracle.com/javase/specs/jls/se5.0/html/arrays.html - Taylor Hx
最好的参考资料是我提到的那个页面。数组的Javadoc会相当简短,它唯一的成员(除了从Object继承的成员)是length和它的clone()实现。 - Cyrille Ka

5

java.util.Arrays是一个包含Java数组实用工具的类,不要与数组本身混淆。

数组是一种容器对象,它包含一个固定数量的同一类型的值。它们是在Java语言中明确定义的特殊类型的对象。所有Java数组都实现了java.lang.Cloneablejava.io.Serializable接口。

相反,java.util.Arrays没有实现这些接口,只提供实现数组常用函数的静态方法。

当您克隆单维数组(比如Object[])时,会执行"深度拷贝",新数组包含原始数组元素的副本而非引用。

然而,多维数组(如Object[][])的克隆是"浅层拷贝",即只创建一个单独的新数组,每个元素数组都是对原始元素数组的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接