Java中的回调函数为什么只能访问final变量?

经常写JS的话对函数式编程应该不陌生,JS是天然支持函数式的,而在Java中,需要用一个接口来实现伪函数编程,类似下图


image.png
image.png

而在写的过程中编译器报错,当在函数内部使用外部变量时必须使用final声明,具体的原因可以参考这篇文章https://blog.csdn.net/cuipengfei1/article/details/9153481

这是因为在Java中匿名接口不允许修改外部变量,设置成final是为了安全考虑(当然设置成final也不会影响一个类对内部的属性做get或set方法,只是避免这个类不会会更改)

简单来说,如果在内部可以修改外部变量,由于Java方法只有值传递没有引用传递,会导致对外部变量的修改不一定生效,造成数据不同步问题

而在C# 和Scala中是有引用传递机制的,所以可以修改外部变量也不会产生负担

在Java8中这种问题已经得到改善


image.png

例如在JAVA8环境下

image.png

这种代码并不会编译报错

而在JAVA7环境中

image.png

这种代码会编译报错

当然,对于ext = null这种修改引用的写法,JAVA7和JAVA8都会报错

你可能感兴趣的:(Java中的回调函数为什么只能访问final变量?)