我有类似的东西:
(SomeClass)
public static final float[][][] values = {...};
public float[][][] variable = values;
所以,我创建了这个类的一个新实例,并将values
传递给了这个类的public
成员,就像我在那里做的那样。
事情是,当我现在使用variable
并更改它和其他内容时,它会针对SomeClass
的所有实例进行更改。
final
在声明之后无法修改?
那么,为什么variable
更像values
的副本,但被修改为static
但不 final
变量?
答案 0 :(得分:5)
当你做的时候会发生什么
public static final float[][][] values = {...};
public float[][][] variable = values;
values
和variable
"指向"相同的参考(即到存储器中的相同位置)。
final
的含义是无法更改该引用(即您无法使变量引用内存中的其他位置)。您仍然可以修改变量引用的对象。
答案 1 :(得分:1)
因为声明public float[][][] variable = values
正在复制值的内存位置。因此,更改variable[][][]
,正在更改与values[][][]
相同的内存位置。
使用Arrays.copyOf()
final float[][][] values
,只表示无法将values
变量分配给新的内存位置。
即values = new float[][][]
会抛出异常。