我实际上无法复制您提到的行为。我看到一些答案提到浅拷贝是问题的根本原因。如果我错了,请纠正我,浅拷贝只是指在克隆时不会复制一个对象,而是会得到一个引用的副本。可以在这里找到一个很好的解释
In Java, what is a shallow copy?。
在这种情况下,浅拷贝只会确保在克隆数组中反映出原始数组中的更改,但不会阻止任何内容被复制。
int[][] array = new int[][] {{1,2,3},{4,5,6}, {7,8,9}};
int[][] clone = array.clone();
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++)
System.out.println("array["+i+"]["+j+"]"+array[i][j]);
for(int i=0;i<clone.length;i++)
for(int j=0;j<clone[i].length;j++)
System.out.println("clone["+i+"]["+j+"]"+clone[i][j]);
对我来说,克隆已经完美地完成了,也就是说两个数组具有相同的内容。我能想到的唯一原因是在克隆之后我们实际上修改了原始数组(浅复制就会发挥作用),导致克隆数组不显示某些信息。
顺便说一下,我使用的是Java 1.6,希望这不是问题。
编辑:如果我们只需要理解为什么会出现多维数组的浅复制而不是深复制,请看以下两个事实:
1. 在克隆时,对象总是被克隆为浅复制(对象引用的副本),只有原生类型才会得到真正的副本。
在Java中,什么是浅复制?
2. 在Java中,数组实际上是一个对象。
Java中的数组是一个对象吗?
现在将1和2结合起来,我们知道Java中的多维数组只是一个对象,它具有其他数组对象的引用。
类似于ArrayObj-> {ArrayObj,ArrayObj,ArrayObj};
由于我们在对象内部有其他对象(组合),根据Java克隆规则,我们应该得到浅拷贝。