2
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声明?

4

2 回答 2

2

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

于 2014-10-24T03:24:16.667 回答
1

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

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

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

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

但是,为了使其可访问,您将变量声明为 final,这样它在内部被放置在方法的“外部”,就像它是一个私有实例变量一样,以便它可以被execute()其他方法访问。

于 2014-10-24T03:24:56.537 回答