Java 浮动[]行为

Java 浮动[]行为,java,Java,我相信这有一个简单的答案,几分钟后我会觉得自己很愚蠢,但现在已经很晚了,我很累 那么,我能问一下,为什么这个代码 public class TestProcess { final float[] finalFloats = {0.9f,0.8f,0.7f}; float[] floats; public static void main(String[] args) { new TestProcess(); } publi

我相信这有一个简单的答案,几分钟后我会觉得自己很愚蠢,但现在已经很晚了,我很累

那么,我能问一下,为什么这个代码

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
我觉得自己很愚蠢


也有人问过这个问题,如果在其他论坛上得到回答,我将在这里发布。

Java数组是可变的引用类型

当你写
floats=finalFloats时
,则使
浮动
字段引用与
最终浮动
相同的数组实例
因此,当您编写
floats[0]=0.1f
时,您也在修改原始的
finalFloats
数组

final
关键字所做的就是阻止您分配
finalFloats
指向新实例(例如,
finalFloats=newfloat[7]
);它不会阻止您对实例进行变异

要使其按预期的方式运行,需要制作数组的副本,如下所示:

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

问题不在于数组,问题在于您误解了引用的工作方式。(或者没有意识到参考文献在这里起作用)+1-尽管这是一个简单的问题,但你问得对。你展示了你的代码,展示了输出,并告诉我们你期望的行为是什么。是的,我没有得到这里的引用,我想的是原语…doh!啊,好的,谢谢,非常清楚。很明显,我也误解了最后的声明,因为我认为有些东西是不能修改的,请多阅读!非常感谢。我想我犯了一个错误,认为float[]是一个原始的……我累了,这是我唯一的借口……我刚刚意识到这个问题是多么容易,哦,好吧