请注意,所有数组都被认为实现了接口
Cloneable
。否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
但是的文档java.util.Arrays
并没有表明Arrays implements Cloneable
.
数组如何实现Cloneable
?
请注意,所有数组都被认为实现了接口
Cloneable
。否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
但是的文档java.util.Arrays
并没有表明Arrays implements Cloneable
.
数组如何实现Cloneable
?
您很困惑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.util.Arrays
是一个包含在 Java 数组上操作的实用程序的类,不要与数组本身混淆。
数组是一个容器对象,它包含固定数量的单一类型的值。它们是在 Java 语言中明确定义的一种特殊类型的 Object。所有 Java 数组都实现java.lang.Cloneable
和java.io.Serializable
.
java.util.Arrays
另一方面,不实现这些接口,只提供静态方法来实现对数组执行的常用功能。
当您克隆一维数组(例如 )时Object[]
,将使用包含原始数组元素的副本而不是引用的新数组执行“深拷贝”。
然而,多维数组的克隆(如Object[][]
)是“浅拷贝”,也就是说它只创建一个新数组,每个元素数组都是对原始元素数组的引用。