【问题标题】:Why a variable declared inside a method needs to be declared final if it is to be used in an inner class defined within the same method? [duplicate]如果要在同一方法内定义的内部类中使用,为什么在方法内声明的变量需要声明为 final? [复制]
【发布时间】:2026-02-18 22:00:02
【问题描述】:

我知道,这个问题已经被问过了,我很抱歉再次问这个问题,但我无法弄清楚为什么会这样?有人可以帮我解决这个问题吗? 例如-

public class File
{
    public static void main(String[] main)
    {
        File obj=new File();
        obj.method();
    }
    void method()
    {
        for(int i=0;i<10;i++)
        {
            class Inner
            {
                void display()
                {
                    System.out.println("i is : "+i);  //Gives error,i needs to be declared final
                }
            }
            Inner cls=new Inner();
            cls.display();
        }
    }
}

我的问题是-

  • 如果我想在其中使用变量 i,为什么需要将其声明为 final Inner 类的 display() 方法?
  • 如果我想在每个显示方法中显示 i 迭代,那我该怎么做呢?因为如果我声明 i 是最终的 初始值为 0,那么我将无法对其进行迭代。

谢谢.....

【问题讨论】:

  • 如果您知道您提出的问题是重复的,您必须解释为什么重复的问题不能解决您对问题本身的担忧。

标签: java loops nested outer-join


【解决方案1】:

1) 出于安全原因,该变量需要是 final 或有效的 final。如果在修改传递的对象中使用的对象怎么办?

2) 你只需将你的 for 循环移动到类中。没有别的办法。

一个内部类只想使用实例成员,就使用它们,这是你在内部类中唯一可以做的事情。你对此无权指挥。为了实现该功能,Java 制定了最终或有效最终规则。

好的,让我们看看当你创建变量 final 时会发生什么?

这些final 变量的所有副本都将由内部类使用,而不是实际变量。

如果你没有听说过这个词,你可以去这里:Difference between final and effectively final

【讨论】:

  • “有效最终”规则不适用于 Java 7 及更早版本。
  • 另外,原因不是安全性。原因是JVM不支持全闭包。