Java中最终变量的奇怪行为

时间:2013-05-10 11:30:30

标签: java final

在我的java程序中,我使用了一个最终变量。我们知道任何最终变量的值是固定的,不能更改。那么为什么这个特定的程序工作正常?任何人都可以解释。

public static void main(String args[])
{
    int[] integerArray = { 1, 2, 3, 4, 5 };

    for (final int j : integerArray) {
    System.out.println(j);
    }
}

7 个答案:

答案 0 :(得分:3)

它是循环体内的最终 - 但是你有效地为循环的每次迭代声明了一个不同的变量。

就像你写的那样:

for (int i = 0; i < integerArray.length; i++) {
    final int j = integerArray[i];
    System.out.println(j);
}

同样,我们在循环的每次迭代中都有一个名为j的“新”局部变量......但是每个变量都不会改变它的值。

答案 1 :(得分:1)

您正在遍历数组并打印值,但您并未尝试在迭代期间更改final int j

在迭代的每一步都定义了一个新的final int j。您没有覆盖现有final引用中的值。

做类似的事情:

 for (final int j : integerArray) {
    j = 5; // this is a direct override, you won't be able to do this.
    System.out.println(j);
 }

答案 2 :(得分:1)

因为 for-loop j被声明为int j。对于每次迭代,这意味着将创建 j,并且范围是for循环。

现在每个j只有initialized 一次,这符合最终关键字。现在,下面的代码生成编译错误

  for (final int j : integerArray) {
        System.out.println(j);
        j=0; // error, j is getting initialized twice in for-loop context
   }

答案 3 :(得分:1)

你的增强版for循环等同于:

for (int index = 0; index < integerArray.length; index++) {
  final int j = integerArray[index];
  System.out.println(j);
}

正如你所看到的,这里没有矛盾。

答案 4 :(得分:1)

实际有效的代码是这样的:

for (for j=0;j < integerArray.length ; j++ )
{
    final int i = integerArray(j); // declaring final i for each iteration
    System.out.println(i);

}

答案 5 :(得分:0)

对于每次迭代,您将声明一个新的最终变量。它工作正常,因为你没有改变那个变量。

答案 6 :(得分:0)

在每次迭代时,它声明新变量。所以这并不奇怪。