Java Lambda 表达式中为什么不能修改外部变量?

因为lambda在设计时,局部变量存在内存的栈中,考虑到了多线程执行时,可能外部的代码已经执行完了,但是lambda中的代码还没执行完,此时局部变量在栈中已经被销毁了,lambda再去引用栈中的局部变量地址,就会报异常,所以java在lambda中直接将局部变量clone,引用新的地址,防止引用到原来的局部变量地址,由于lambda引用的是新地址,所以不能修改局部变量的值。

而成员变量存在堆中,静态变量存在方法区中,不会导致引用地址被回收,所以lambda可以直接修改引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lambda表达式,可以对成员变量和静态变量进行读写操作。 对于成员变量,可以通过引用的方式在lambda表达式对其进行读写操作。Lambda表达式可以捕获外部变量,包括成员变量。通过这种方式,我们可以在lambda表达式直接访问和修改成员变量的值。例如: ```java public class MyClass { private int myMemberVariable = 10; public void myMethod() { MyInterface myLambda = () -> { System.out.println(myMemberVariable); // 10 myMemberVariable = 20; System.out.println(myMemberVariable); // 20 }; myLambda.myMethod(); } interface MyInterface { void myMethod(); } } ``` 在上面的例子,我们在lambda表达式读取并修改了类`MyClass`的成员变量`myMemberVariable`的值。 对于静态变量,由于它们属于整个类而不是对象的实例,可以直接通过类名进行访问和修改。因此,lambda表达式也可以对静态变量进行操作。例如: ```java public class MyClass { private static int myStaticVariable = 10; public static void myMethod() { MyInterface myLambda = () -> { System.out.println(myStaticVariable); // 10 myStaticVariable = 20; System.out.println(myStaticVariable); // 20 }; myLambda.myMethod(); } interface MyInterface { void myMethod(); } } ``` 在上面的例子,我们在lambda表达式读取并修改了类`MyClass`的静态变量`myStaticVariable`的值。 综上所述,在lambda表达式可以访问和修改成员变量和静态变量,从而拥有对它们的读写权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值