增强的for循环中局部变量的范围

Eyp*_*ros 7 java foreach scope

关于变量范围,我有一个相当简单的问题.

我熟悉增强的For-Loops,但我不明白为什么我应该声明一个新变量来保存每个元素.一个例子可能澄清我的问题:

        int[] ar = {1, 2, 3};
        int i = 0;
        for(i : ar) {  // this causes an error if I do not declare a new variable: int i
//        for(int i : ar) // this works fine
            System.out.println(i);
        }
Run Code Online (Sandbox Code Playgroud)

那么我为什么要声明这个新变量呢?毕竟i可以在for循环中访问.我不想使用任何以前的值i,只是不想声明一个新的变量.(我猜测其他可迭代项目使用相同的变量可能会更快).

我想这就是增强For For-Loop的构建方式,但这不会打破整个范围的想法吗?

上述行为引发了一个问题.编译器是否对整个循环使用相同的变量for并只更新其值,或者为每次迭代创建一个新变量

一个有趣的部分是,如果我保持int i的声明(for循环之前和之内)我甚至得到编译器错误

重复的局部变量i

这使得(至少对我来说)事情有点奇怪.所以我不能ifor循环中使用先前声明的变量,但我也不能在其中声明一个具有相同名称的新变量.

use*_*421 4

那么为什么我应该声明这个新变量呢?

因为这就是语法的定义方式。

毕竟 i 可以在 for 循环内访问。

这就是语义。这与语法无关。

我不想使用任何以前的 i 值,只是不想声明一个新变量。(我猜想对于其他可迭代项目,使用相同的变量可能会更快)。

不要猜测性能。测试和测量。但在这种情况下,没有什么可测量的,因为任何工作代码都比任何非工作代码更快。

  • 奇怪的是,这被接受为答案。它并没有开始回答问题。 (2认同)