我确定有一个简单的答案,我会在几分钟内感到愚蠢,但在这里,它已经很晚了,我累了......
所以,我可以问,为什么这个代码......
public class TestProcess {
final float[] finalFloats = {0.9f,0.8f,0.7f};
float[] floats;
public static void main(String[] args) {
new TestProcess();
}
public TestProcess(){
floats = finalFloats;
printTotal();
floats[0]=0.1f;
printTotal();
floats = finalFloats;
printTotal();
}
void printTotal(){
float count = 0f;
for(float f : floats){
count+=f;
}
out("Count:"+count);
}
void out(String s){
System.out.println(s);
}
}
给出这个输出
Count:2.4
Count:1.6
Count:1.6
当我期待
Count:2.4
Count:1.6
Count:2.4
我觉得非常愚蠢......!
此问题也被提出link text,如果在其他论坛得到解答,我会在此发帖。
答案 0 :(得分:6)
Java数组是可变引用类型。
当您编写floats = finalFloats;
时,您将floats
字段引用与finalFloats
相同的数组实例。
因此,当您编写floats[0]=0.1f
时,您还要修改原始的finalFloats
数组。
所有final
关键字都阻止您指定finalFloats
指向新实例(例如finalFloats = new float[7]
);它不会阻止你改变实例。
为了使它按照您期望的方式运行,您需要制作数组的副本,如下所示:
floats = Arrays.copyOf(finalFloats, finalFloats.length);