0

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

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

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

7 回答 7

3

它在循环体内是最终——但您实际上是在为循环的每次迭代声明一个不同的变量。

就好像你这样写:

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

同样,我们j在循环的每次迭代中调用了一个“新”局部变量……但是这些变量中的每一个都不会改变它的值。

于 2013-05-10T11:31:44.717 回答
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);
 }
于 2013-05-10T11:33:23.647 回答
1

因为在for 循环 j中被声明为int j. 这意味着对于每次迭代,都会创建一个新的,其 范围是 for 循环。j

现在每个jinitialized 只有一次,它遵循 final 关键字。现在下面的代码生成编译错误

  for (final int j : integerArray) {
        System.out.println(j);
        j=0; // error, j is getting initialized twice in for-loop context
   }
于 2013-05-10T11:33:33.363 回答
1

您的增强 for 循环等效于:

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

如您所见,这里没有矛盾。

于 2013-05-10T11:33:42.643 回答
1

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

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

}
于 2013-05-10T11:34:05.020 回答
0

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

于 2013-05-10T11:33:39.220 回答
0

在每次迭代时,它都会声明新变量。所以这不是奇怪的行为。

于 2013-05-10T11:33:55.740 回答