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