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