【问题标题】:How do Java arrays implement Cloneable?Java 数组如何实现 Cloneable?
【发布时间】:2013-11-20 02:10:38
【问题描述】:

来自the documentation of Object#clone()

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

但是the documentation of java.util.Arrays 并不表示Arrays implements Cloneable

数组如何实现Cloneable

【问题讨论】:

  • java.util.Arrays 类不是数组实例的基类。其实它所有的方法都是静态的,并没有实现Cloneable接口。

标签: java arrays clone


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您混淆了java.util.Arrays,这是一个包含处理数组的方法的普通类,以及数组本身,它们在 Java 语言中是一种相当特殊的构造,但仍然是具有合成类的对象。这是实现Cloneable 的此类。它也直接派生自Object。看看JLS page on arrays,这个主题很清楚。

    例如看这段代码(取自前面提到的 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 for Array 类一样吗?
    • @user2488578 我知道的最接近的是:docs.oracle.com/javase/specs/jls/se5.0/html/arrays.html
    • 最好的参考是我提到的页面。数组的 Javadoc 会很短,它的唯一成员(从 Object 继承的除外)是 length 及其实现 clone()
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2012-01-28
    • 2011-08-25
    • 2017-12-26
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多