Java 为什么名单必须在最后一天公布

Java 为什么名单必须在最后一天公布,java,trove4j,Java,Trove4j,我使用intellij,它提示我按final声明tempList,为什么必须按final声明tempList?方法中包含“tempList”的范围。当该方法完成时,“圣殿骑士”最终将丢失。但是,您编写的匿名类可能仍在堆上,可以稍后引用。将其设置为final将确保匿名类仍按预期运行。这是因为虚拟机的工作方式 首先,要理解这一点,您需要知道内部堆栈和堆栈帧是什么(在虚拟机内部) 局部变量(原语和引用)存储在方法的堆栈框架中,其他方法无法访问 在您的例子中,局部变量templast在方法boolean

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

方法中包含“tempList”的范围。当该方法完成时,“圣殿骑士”最终将丢失。但是,您编写的匿名类可能仍在堆上,可以稍后引用。将其设置为final将确保匿名类仍按预期运行。

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

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

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

在您的例子中,局部变量
templast
在方法
boolean execute(int i)
中不可访问,因为它“属于”封闭方法(它“存在”在局部堆栈框架中)


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

很好,因为语言需要它。我认为这是因为(原始)语言编写者犯了一个错误——这里的final除了提醒您内部类的引用之外,实际上没有什么作用。但是您必须使用final,否则内部类不能使用引用。从Java 8开始,它实际上不必声明为final,尽管它必须是“有效的”final。我的观点是“不需要final”。
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;
    }
});