为何for循环内可重复声明同名变量,主程序中却不行?
关于Java循环内变量作用域与ArrayList存储的疑问
我正在学习Java的Lambda表达式,需要创建一个变量列表。我发现在for循环的每次迭代中创建同名的String变量,在循环外是无法访问的——这一点我查资料知道是因为循环内变量的作用域限制。但奇怪的是,把这些循环内创建的变量添加到循环外定义的ArrayList里,之后遍历列表却完全没问题,哪怕变量的值都一样,也能正常存入数组。
示例代码
import java.util.ArrayList; public class Lambda { public static void main(String[] args) { ArrayList<String> names = new ArrayList<String>(); for(int i = 0; i<10; i++) { String name = "name: "; names.add(name); } names.forEach((name) -> {System.out.println(name);}); System.out.println("\n***********************************\n"); for(String temp: names) { System.out.println(temp); } } }
原因解释
- 循环内的
String name是每次迭代都会创建一个新的局部变量,它的作用域只限于当前迭代的循环体内部,所以循环外不能直接使用这个变量名。 - 执行
names.add(name)时,实际上是把这个变量指向的String对象的引用存入了ArrayList。虽然每次迭代的变量名都是name,但它们指向的是字符串常量池里的同一个对象(Java会复用字符串字面量),所以ArrayList里存的是多个指向同一对象的引用,但这完全不影响存储和遍历——Java只关心引用是否有效,不管变量名是否重复。 - 遍历ArrayList的时候,操作的是列表里存储的引用,和原来循环内的
name变量已经没有关联了,自然不会出现作用域相关的错误。
内容的提问来源于stack exchange,提问作者aidan gaskin
相关产品推荐
相关产品推荐

