我对 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在构造函数中编写一些循环来从参数中获取每个值? (或者这不是问题?)问题的最后一部分很重要,可能这不是问题。还是人们做“某事”(几个循环来获得深度克隆)?
1 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
这里的问题是 java 并没有真正的二维数组。这个:
int[][] x;
是一个 int 数组的数组。它不是2D int 数组,尽管 int 数组的数组确实感觉很像 2D 数组。对于大多数意图和目的,它是一个 2D int 数组,除非它不是,并且对于克隆,它不是。数组的clone()
impl 创建一个新数组,并将每个值逐字逐句复制到新数组中。这意味着您的 int 数组数组被克隆,但内部 int 数组不是.
当将int[][]
其视为“这是一个二维数组”时,是的,这是不直观的。当int[][]
被视为“一个 int 数组的数组”时,它非常直观。您不会期望一个数组列表在克隆时也会克隆每个单独的数组列表。
添加回答
举报
0/150
提交
取消