提示信息

Java8新特性:Effectively final

孤独与戈 已关注

Java 8引入了一个新的特性称为"Effectively final"(实际上是final)。它允许在Lambda表达式或匿名内部类中访问并且使用非final变量,只要这些变量在使用前没有被修改。

在Java 7以前,Lambda表达式或匿名内部类只能访问和使用final变量。这是因为匿名内部类的实例可能会在创建后被延迟执行,而在其执行时变量可能已经被修改。为了解决这个问题,Java 8引入了Effectively final的概念。

Effectively final变量是指在初始化之后没有再次被修改的变量。换句话说,一旦变量被赋值后,在后续代码中不允许再修改其值。这样,Lambda表达式或匿名内部类就可以访问和使用这些变量,而不需要将它们声明为final。

下面是一个使用Effectively final变量的例子:

  1. public static void main(String[] args) {
  2. String name = "John";
  3. int age = 30;
  4. // Lambda表达式访问Effectively final变量
  5. Greeting greeting = () -> System.out.println("Hello " + name + "! You are " + age + " years old.");
  6. greeting.sayHello();
  7. }
  8. interface Greeting {
  9. void sayHello();
  10. }

在上面的例子中,变量nameage被Lambda表达式访问和使用。尽管它们不是final变量,但它们在使用之前没有被修改,因此它们被视为Effectively final变量。

注意,一旦Effectively final变量被同一个作用域内的Lambda表达式或匿名内部类使用,就不能再对其进行修改。否则,编译器将会报错。这是因为在使用Effectively final变量时,编译器会生成一个隐含的final变量的副本,以确保它们在执行时的值不会被修改。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
孤独与戈 关注 已关注

最近一次登录:2023-10-09 12:59:02   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图