我的最终数组是如何被修改的?

时间:2014-05-28 20:54:21

标签: java class variables static final

我有类似的东西:

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

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

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

事情是,当我现在使用variable并更改它和其他内容时,它会针对SomeClass的所有实例进行更改。

我认为

final在声明之后无法修改? 那么,为什么variable更像values的副本,但被修改为static final变量?

2 个答案:

答案 0 :(得分:5)

当你做的时候会发生什么

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

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

valuesvariable"指向"相同的参考(即到存储器中的相同位置)。

final的含义是无法更改该引用(即您无法使变量引用内存中的其他位置)。您仍然可以修改变量引用的对象。

答案 1 :(得分:1)

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

使用Arrays.copyOf()

final float[][][] values,只表示无法将values变量分配给新的内存位置。 即values = new float[][][]会抛出异常。