增强的for循环遍历Java

增强的for循环遍历Java,java,for-loop,reference,Java,For Loop,Reference,我目前正在阅读唐尼的ThinkJava,它最近引入了增强的for循环。有人提到,增强的for循环在遍历数组时没有考虑元素索引。我认为这不会妨碍以下方法的工作: public static double[] powArray(double[] a) { for (double value : a) { value = Math.pow(value, 2.0); } return a; }

我目前正在阅读唐尼的ThinkJava,它最近引入了增强的for循环。有人提到,增强的for循环在遍历数组时没有考虑元素索引。我认为这不会妨碍以下方法的工作:

    public static double[] powArray(double[] a) {
        for (double value : a) {
            value = Math.pow(value, 2.0);
        }
        return a;
    }                 
然而,它似乎是这样的(它所属的其余代码似乎很好)。请注意,当我运行以下命令时,此方法最终返回相同的数组:

    System.out.println(Arrays.toString(powArray(a)));
我想我很难理解这里的问题是否在于如何处理增强的for循环或数组引用。 提前谢谢

查找,其中给出了阵列上增强for循环的等效形式:

[如果
表达式
是数组类型,则相当于]

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}

JVM工作原理的工作心智模型将有所帮助

数组变量的值是一个引用

双精度变量的值是双精度变量

在循环的每次迭代中,
变量都会将数组的一个元素复制到其中

当你这样做的时候

value = Math.pow(value, 2.0);

您只需更改
value
变量(副本)的值。这对数组没有影响,因为数组中的值被复制到
value
的值中,而赋值更改的正是该值。

您应该将value返回到数组,或者只创建新数组,将所有pow值存储到它并返回此数组。

您预期结果会是什么?我认为它将返回一个包含平方元素的数组。查看,其中显示“增强的for语句相当于表单的basic for语句:”。你正在生成一个新的变量,而不是数组元素。我认为你应该考虑接受安迪·特纳的答案。请参阅我编辑的答案,了解原因。我怀疑这会对提问者级别的人有所帮助。我对你的答案进行了升级,并编辑了我自己接受的答案。非常感谢。
double[] a = arr;
for (int i = 0; i < a.length; i++) {
  double value = a[i];
  value = Math.pow(value, 2.0);
}
for (int i = 0; i < a.length; i++) {
  a[i] = Math.pow(a[i], 2.0);
}
value = Math.pow(value, 2.0);