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声明?
答案 0 :(得分:2)
' tempList'的范围在方法内。当方法完成时,' tempList'最终会丢失。但是,您编写的匿名类可能仍在堆上,可以在以后引用。最终确定匿名类仍将按预期运行。
答案 1 :(得分:1)
这是因为虚拟机的工作方式。
首先,要了解这一点,您需要知道内部堆栈和堆栈帧是什么(在虚拟机内部)
局部变量(基元和引用)存储在方法的堆栈帧中,其他方法无法访问。
在您的情况下,方法tempList
中无法访问局部变量boolean execute(int i)
,因为它“属于”封闭方法(它“存在”在本地堆栈框架中)。
但是,为了使它可访问,你声明变量final,这样它就在内部放在方法的“外部”,就好像它是一个私有实例变量,这样它就可以被{{1}访问和其他方法。