在项目文件lambda:Lambda v4的状态根据第7节,变量捕获,提到....我们的意图是禁止捕获可变的局部变量。原因是这样的成语:int sum = 0;list.forEach(e -> { sum += e.size(); });基本上是连续的; 写这样没有竞争条件的lambda体是很困难的。除非我们愿意强制执行 - 最好是在编译时 - 这样的函数无法逃避其捕获线程,否则这个特性可能会导致比它解决的更多麻烦。编辑:另外需要注意的是,当你在内部类中访问它们时,局部变量在内部类的构造函数中传递,而这对于非最终变量不起作用,因为非最终变量的值可以在构造之后更改。在实例变量的情况下,编译器传递类的引用,类的引用将用于访问实例变量。因此,在实例变量的情况下不需要它。PS:值得一提的是,匿名类只能访问最终的局部变量(在JAVA SE 7中),而在Java SE 8中,您可以有效地访问lambda内部的最终变量以及内部类。
因为实例变量总是通过对某个对象的引用的字段访问操作来访问,即some_expression.instance_variable。即使您没有通过点表示法显式访问它,例如instance_variable,它也被隐含地视为this.instance_variable(或者如果您在内部类中访问外部类的实例变量OuterClass.this.instance_variable,那么它是在引擎盖下this.<hidden reference to outer this>.instance_variable)。因此,永远不会直接访问实例变量,而您直接访问的实际“变量” this(由于它不可分配,因此是“有效的最终”),或者是某个其他表达式开头的变量。