float []行为

时间:2010-07-15 23:51:39

标签: java

我确定有一个简单的答案,我会在几分钟内感到愚蠢,但在这里,它已经很晚了,我累了......

所以,我可以问,为什么这个代码......

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,如果在其他论坛得到解答,我会在此发帖。

1 个答案:

答案 0 :(得分:6)

Java数组是可变引用类型。

当您编写floats = finalFloats;时,您将floats字段引用与finalFloats相同的数组实例。
因此,当您编写floats[0]=0.1f时,您还要修改原始的finalFloats数组。

所有final关键字都阻止您指定finalFloats指向新实例(例如finalFloats = new float[7]);它不会阻止你改变实例。

为了使它按照您期望的方式运行,您需要制作数组的副本,如下所示:

floats = Arrays.copyOf(finalFloats, finalFloats.length);