考虑这段代码
public static void main(String[] args) {
for(final String s : Arrays.asList("a","b","c")){
System.out.println(s);
}
}
此代码不是用于特定目的,而是用于演示final
foreach-loop
变量的用法。
这是如何工作的?单个变量如何为final
,但每个循环都赋予不同的值。或者这个变量在不同的范围\ stacks中多次声明?
答案 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