Java中for-each和传统for循环在阴影方面有什么不同?

Java中for-each和传统for循环在阴影方面有什么不同?,java,for-loop,foreach,Java,For Loop,Foreach,这是我的代码: class HelloWorld { char[] foo = {'a', 'b'}; // This will compile void foo() { for (char foo : foo) { } } // This will not compile void bar() { for (char foo = 0; foo < foo.length; foo++) {

这是我的代码:

class HelloWorld {

    char[] foo = {'a', 'b'};

    // This will compile
    void foo() {
        for (char foo : foo) {
        }
    }

    // This will not compile
    void bar() {
        for (char foo = 0; foo < foo.length; foo++) {
        }
    }
}

使foo中的loop编译但bar失败的两个循环声明之间有什么区别?

我们可以通过查看的关于增强的
for
在处理数组时如何工作的描述来了解区别:

增强型for语句相当于以下形式的基本for语句:

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}
这就是为什么您可以在增强的
for
中避开阴影,而不是在传统的
for
中,后者需要访问原始数组(获取其
长度
,获取
i
的条目等)


有关增强的
for
循环及其答案的详细信息。

Java语言规范以不同的方式定义了两个
char foo的作用域:

在基本函数的ForInit部分声明的局部变量的范围
声明(§14.14.1)包括以下所有内容:

  • 它自己的初始值设定项
  • for
    语句的ForInit部分右侧的任何其他声明符
  • 表达式和ForUpdate部分的
    for
    语句
  • 所载声明
在的FormalParameter部分声明的局部变量的范围 增强的
for
语句(§14.14.2)是包含的语句

()


这很好地解释了您观察到的行为:局部
foo
在basic
for
循环的控制子句中(在其声明右侧的任何地方)的范围内,因此它在那里隐藏了另一个
foo
,但是在增强的
for
循环中,它的作用域只是循环语句——它不在循环控制子句中的任何位置。

您在逻辑上操作/比较字符和整数之间的[<]值->这怎么可能是非EORNEUO您在字符类型中使用++吗?如果IRerection变量的名称foo与数组变量的名称foo相同,那么必须是error为什么
bar
使用
char
变量?它不应该是一个
int
?如果使用
int
,它是否仍表现出相同的行为?
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}
void foo() {
    { // Freestanding block for scope, though not really needed as `foo` has
      // nothing else in it
        char[] a = foo;       // T[] #a = Expression;
        for (int i = 0; i < a.length; i++) {
            char foo = a[i];  // {VariableModifier} TargetType Identifier = #a[#i];
        }
    }
}