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
在basicfor
循环的控制子句中(在其声明右侧的任何地方)的范围内,因此它在那里隐藏了另一个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];
}
}
}