java从匿名类到lambda表达式
当使用下面的匿名类时,变量x
us调用没有问题
interface Age {
int x = 21;
void getAge();
}
class AnonymousDemo {
public static void main(String[] args) {
Age oj1 = new Age() {
@Override
public void getAge() {
// printing age
System.out.print("Age is "+x);
}
};
oj1.getAge();
}
}
但当我对下面的lambda表达式使用相同的代码时,出现了一个异常:
interface Age {
int x = 21;
void getAge();
}
class AnonymousDemo {
public static void main(String[] args) {
Age oj1 = () -> { System.out.print("Age is "+x); };
oj1.getAge();
}
}
这里有什么问题?知道lambda表达式只是实现匿名类的缩写
# 1 楼答案
实际上,lambda表达式不仅仅是“实现匿名类的缩写”。使用lambda表达式的好处是,它可以直接访问
this
类(调用它的类)的实例,而匿名类则不能(它有自己的this
实例)https://stackoverflow.com/a/22640484 而且
https://stackoverflow.com/a/33874965
例如:
或者
我建议读一下:Java8 Lambdas vs Anonymous classes
# 2 楼答案
x
未被识别为来自Age
接口的字段。您必须执行静态导入(import static Age.x
)或指定x
的来源: