数组作为对象中的属性

时间:2019-02-04 15:02:43

标签: java arrays class reference attributes

我对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 个答案:

答案 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?