为什么列表必须由final声明

时间:2014-10-24 03:08:02

标签: java trove4j

TIntArrayList list = new TIntArrayList();
final TIntArrayList tempList = new TIntArrayList();
list.add(10086);
list.add(12345);
list.add(1989);
list.forEach(new TIntProcedure() {
    @Override
    public boolean execute(int i) {
        if (i > 10086) {
            tempList.add(i);
        }
        return true;
    }
});

我使用intellij,它提示我通过final声明tempList,为什么tempList必须由final声明?

2 个答案:

答案 0 :(得分:2)

' tempList'的范围在方法内。当方法完成时,' tempList'最终会丢失。但是,您编写的匿名类可能仍在堆上,可以在以后引用。最终确定匿名类仍将按预期运行。

答案 1 :(得分:1)

这是因为虚拟机的工作方式。

首先,要了解这一点,您需要知道内部堆栈和堆栈帧是什么(在虚拟机内部)

局部变量(基元和引用)存储在方法的堆栈帧中,其他方法无法访问。

在您的情况下,方法tempList中无法访问局部变量boolean execute(int i),因为它“属于”封闭方法(它“存在”在本地堆栈框架中)。

但是,为了使它可访问,你声明变量final,这样它就在内部放在方法的“外部”,就好像它是一个私有实例变量,这样它就可以被{{1}访问和其他方法。