【问题标题】:How is my final array being modified?我的最终数组是如何被修改的?
【发布时间】:2014-05-28 20:54:21
【问题描述】:

我有类似的东西:

(SomeClass)
public static final float[][][] values = {...};

public float[][][] variable = values;

所以,我创建了这个类的一个新实例,并将 values 传递给这个类的一个 public 成员,就像我在上面所做的那样。

问题是,当我现在使用 variable 并对其进行更改时,SomeClass 的所有实例都会更改它。

final我想声明后不能修改? 那么为什么variable 不像values 的副本,而是像static 一样被修改,但不是 final 变量?

【问题讨论】:

  • final 表示您无法重新分配变量。这并不意味着变量引用的对象是不可变的。此外,赋值不会创建对象的副本。
  • @user2357112,好的。 Braj,谢谢,要读这个。 :)

标签: java class variables static final


【解决方案1】:

当你这样做时会发生什么

public static final float[][][] values = {...};

public float[][][] variable = values;

valuesvariable 都“指向”同一个引用(即内存中的同一个位置)。

final 的意思是您不能更改该引用(即您不能使变量引用内存中的另一个位置)。您仍然可以修改该变量引用的对象。

【讨论】:

  • 感谢您的解释。 :) 不知道决赛是这样的。所以,clone() 给了我内存中相同的位置,而不是我猜的其他地方的克隆东西?
  • @andy:你没有在你展示给我们的代码中调用cloneclone 复制对象,但默认行为是浅拷贝,而不是深拷贝;它不会克隆对象数组中的对象,对于多维数组,它不会克隆子数组,只会克隆顶级数组。
  • @user2357112 是的,但是我在发布之前尝试过,但没有成功,所以我只是在问。好的,谢谢。 :)
【解决方案2】:

因为声明public float[][][] variable = values 正在复制值的内存位置。所以更改variable[][][],就是更改与values[][][] 相同的内存位置。

使用Arrays.copyOf()

final float[][][] values,仅仅意味着不能将values 变量分配给新的内存位置。 IE。 values = new float[][][] 会抛出异常。

【讨论】:

  • 好的。但是Arrays.copyOf() 会不会有点笨重?因为我必须对数组中的数组执行此操作,然后将它们放在一起,如我所见?
  • copyOf 不会删除它。这是一个浅拷贝,这是一个多维数组。
  • 啊,好电话,我没有在多维数组上使用 copyOf()。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多