for-each循环中迭代变量的生命周期是多少

时间:2016-01-10 18:29:49

标签: java

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);
    }
}

}

3 个答案:

答案 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),则会导致编译错误。