为了账号安全,请及时绑定邮箱和手机立即绑定

数组作为对象中的属性

数组作为对象中的属性

幕布斯6054654 2022-06-04 15:23:02
我对 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 数组的数组”时,它非常直观。您不会期望一个数组列表在克隆时也会克隆每个单独的数组列表。


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信