我对Java比较陌生,我刚刚学到了这一点
import java.util.Arrays;
public class Foo {
private int[][] foo;
public Foo(int[][] arr) {
this.foo = arr;
}
@Override
public String toString() {
return Arrays.deepToString(this.foo).replace("],", "],\n");
}
public static void main(String[] args) {
int[][] p = { { 0, 0 }, { 0, 0 } };
Foo g = new Foo(p.clone()); // doesn't work with p nor p.clone()
System.out.println(g);
p[0][0] = 1;
System.out.println(g);
}
}
在这里,我创建了一个引用了另一个对象的对象,由于可以引用刚刚作为构造函数的参数传递给我的东西,因此我可以从外部更改该对象。
尽管我理解为什么会发生,但这对我来说却是违反直觉的。如果我将某些内容另存为对象的属性,则希望该对象具有外部无法访问的“私有”副本。
我尝试使用.clone()
并没有解决。所以问题是...
通常如何进行?我是否需要在构造函数中编写一些for
循环才能从参数中获取所有值?
问题的最后一部分很重要,可能这不是问题。还是人们做“某事”(一些循环以获得深层克隆)?
答案 0 :(得分:3)
这里的问题是java确实没有二维数组。这个:
int[][] x;
是一个int数组的数组。它不是2D int数组,当然,一个int数组的数组确实感觉很像2D数组。在大多数情况下,它是2D int数组,除非不是,否则是克隆。数组的clone()
隐含一个新数组,并将每个值逐字复制到新数组中。这意味着您的int数组数组是克隆的,但是内部的int数组不是。
当将int[][]
视为“这是一个2D数组”时,这是不直观的。将int[][]
视为“一个int数组的数组”时,这非常直观。克隆数组列表时,您也不希望同时克隆每个单独的数组列表。
Soo ..您如何深度克隆数组(数组的数组)?有关很多选项,请参见How do I do a deep copy of a 2d array in Java?: