You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:32:50