如何在foreach循环中使用最终变量

时间:2014-02-17 22:17:31

标签: java foreach final

考虑这段代码

public static void main(String[] args) {
    for(final String s : Arrays.asList("a","b","c")){
        System.out.println(s);
    }
}

此代码不是用于特定目的,而是用于演示final foreach-loop变量的用法。

这是如何工作的?单个变量如何为final,但每个循环都赋予不同的值。或者这个变量在不同的范围\ stacks中多次声明?

3 个答案:

答案 0 :(得分:5)

这在Java语言规范(JLS)14.14.2中解释:

  

增强的for语句具有以下形式:

EnhancedForStatement:
    for ( FormalParameter : Expression ) Statement

FormalParameter:
    VariableModifiers_opt Type VariableDeclaratorId

VariableDeclaratorId:
    Identifier
    VariableDeclaratorId []
     

...

     

增强的for语句相当于一个基本的for语句   形式:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiers_opt TargetType Identifier =
        (TargetType) #i.next();
    Statement
}

因此,Identifier在循环的每次迭代中重新声明。

答案 1 :(得分:1)

在该上下文中允许final背后的主要思想是让您在匿名类中使用循环变量。除此之外,final不会改变循环变量s的语义:它以与通常相同的方式遍历集合的元素。

使用final的另一个影响是,您不再被允许为s分配新值。这通常是一个坏主意,尽管the compiler lets you do it

答案 2 :(得分:0)

它只是意味着在设置对象引用后无法修改它。所以在这种情况下,“final”仅适用于每次迭代。 :d