数组作为对象中的属性

我对 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在构造函数中编写一些循环来从参数中获取每个值?


 (或者这不是问题?)

问题的最后一部分很重要,可能这不是问题。还是人们做“某事”(几个循环来获得深度克隆)?


幕布斯6054654
浏览 146回答 1
1回答

慕码人8056858

这里的问题是 java 并没有真正的二维数组。这个:int[][] x;是一个 int 数组的数组。它不是2D int 数组,尽管 int 数组的数组确实感觉很像 2D 数组。对于大多数意图和目的,它是一个 2D int 数组,除非它不是,并且对于克隆,它不是。数组的clone()impl 创建一个新数组,并将每个值逐字逐句复制到新数组中。这意味着您的 int 数组数组被克隆,但内部 int 数组不是.当将int[][]其视为“这是一个二维数组”时,是的,这是不直观的。当int[][]被视为“一个 int 数组的数组”时,它非常直观。您不会期望一个数组列表在克隆时也会克隆每个单独的数组列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java