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[]是一个原始的……我累了,这是我唯一的借口……我刚刚意识到这个问题是多么容易,哦,好吧