5

以下文档Object#clone()

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

但是的文档java.util.Arrays并没有表明Arrays implements Cloneable.

数组如何实现Cloneable

4

2 回答 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
于 2013-11-08T06:24:10.567 回答
5

java.util.Arrays是一个包含在 Java 数组上操作的实用程序的类,不要与数组本身混淆。

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

java.util.Arrays另一方面,不实现这些接口,只提供静态方法来实现对数组执行的常用功能。

当您克隆一维数组(例如 )时Object[],将使用包含原始数组元素的副本而不是引用的新数组执行“深拷贝”。

然而,多维数组的克隆(如Object[][])是“浅拷贝”,也就是说它只创建一个新数组,每个元素数组都是对原始元素数组的引用。

于 2013-11-08T06:24:39.020 回答