for-each循环中迭代变量的生命周期是多少?最终变量不能用作for循环中的迭代变量,但for-each循环可以。原因是什么?
class Example1{
public static void main(String args[]){
int[] marks={10,20,30,40,50,60,70};
for(final int a : marks){
System.out.println(a);
}
}
}
class Example2{
public static void main(String args[]){
int[] marks={10,20,30,40,50,60,70};
for(final int a=0;a<marks.length;a++){ //compile error
System.out.println(a);
}
}
}
class Example3{
public static void main(String args[]){
int[] marks={10,20,30,40,50,60,70};
int a=0; // final int a is illegal
for(;a<marks.length;a++){
System.out.println(a);
}
}
}
答案 0 :(得分:1)
任何变量的范围都是定义的{
}
括号。但是在这种情况下,它是for-each本身的限制。
// you cannot use `a` here
for(final int a : marks){
System.out.println(a);
}
// you cannot use `a` here
答案 1 :(得分:0)
我不确定,但似乎要创建(分配),生存(使用)和终止(解除分配)范围变量的定义。这发生在功能括号和参数中。生命。
从这个例子:
for (final int a : marks) {
System.out.println(a);
}
此处,a
中的()
分配在内存中,a
分配在{}
中。因此,您有两个分配,两个创建。在括号末尾 - 使用函数结束 - ,两个变量被解除分配并从内存中销毁。
因此,在a
之外使用{}
是不可能的,因为它已被销毁。要使用此值(不确定是否会使用for loop
,但要理解这个想法),您必须在函数的{}
之外创建,如下所示:
int a = 0; // variable inside class
foo() {
a = 3; // changed from foo function
}
bar() {
System.out.println(a); // used from bar function
}
从上面的示例中,您可以看到a
可以在foo()
函数之外使用,因为它的分配在它之外(在{...} 之外)。< / p>
答案 2 :(得分:0)
您在这里混淆了两件事:范围,其他人已经解释过,以及最终修饰符。您可以在以下情况下使用final
:
for(final int a : marks) {
...
}
因为a
一旦进入范围就永远不会改变。它对循环的每次迭代都会改变,但实质上它是每次迭代的新变量。
但是,您无法在此处使用final
:
for(final int a=0; a<marks.length; a++) { // compile error
...
}
因为循环变量随着每次迭代而改变,因为for
语句中的第三个表达式,在您的情况下是a++
(换句话说,将{1}添加到a
,如果a
被声明为final
),则会导致编译错误。