Java数组如何实现Cloneable?

use*_*578 5 java arrays clone

来自以下文件Object#clone():

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

文档java.util.Arrays并未表明这一点Arrays implements Cloneable.

阵列如何实现Cloneable

Cyr*_* Ka 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印:

class [I
class java.lang.Object
Run Code Online (Sandbox Code Playgroud)


Tay*_* Hx 5

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

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

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

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

多维数组(如Object[][])的克隆是“浅表副本”,也就是说,它仅创建一个新数组,每个元素数组都引用原始元素数组。