内部类中词法作用域说明:
内部类中使用变量名(以及 this)非常容易出错。内部类中通过继承得到的成员(包括来自 Object 的方法)可能会把外部类的成员掩盖(shadow),此外未限定(unqualified)的 this 引用会指向内部类自己而非外部类。
lambda表达式词法作用域:
相对于内部类,lambda 表达式的语义就十分简单:它不会从超类(supertype)中继承任何变量名,也不会引入一个新的作用域。lambda 表达式基于词法作用域,也就是说 lambda 表达式函数体里面的变量和它外部环境的变量具有相同的语义(也包括 lambda 表达式的形式参数)。此外,’this’ 关键字及其引用在 lambda 表达式内部和外部也拥有相同的语义。
public class TestA { @Override public static void main(String[] args) { |
基于词法作用域的理念,lambda 表达式不可以覆盖任何其所在上下文中的局部变量,它的行为和那些拥有参数的控制流结构(例如 for 循环和 catch 从句)一致。
int i = 0; int sum = 0; for (int i = 1; i < 10; i += 1) { //这里会出现编译错误,因为i已经在for循环外部声明过了 sum += i; } |