float []行为

Dor*_*ori 2 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

给出这个输出

Count:2.4
Count:1.6
Count:1.6
Run Code Online (Sandbox Code Playgroud)

当我期待

Count:2.4
Count:1.6
Count:2.4
Run Code Online (Sandbox Code Playgroud)

我觉得很蠢......

这个问题也被问到链接文本,如果在其他论坛得到解答,我会在这里发帖.

SLa*_*aks 6

Java数组是可变的引用类型.

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

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

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

floats = Arrays.copyOf(finalFloats, finalFloats.length);
Run Code Online (Sandbox Code Playgroud)