你知道什么是Effectively final吗?下面的文章要给大家仔细讲解的就是java Effectively final,一起来了解一下相关知识吧。
什么是Effectively final?
java当中,局部内部类和匿名内部类访问的局部变量必须由final修饰,以此保证内部类和外部类的数据一致性,可是,从java8开始的话,可以不用加final修饰,系统默认添加,当然了,在java8之前的话是不允许的,java就将这个功能叫做Effectively final功能。
编写相同的代码,分别在java7和java8下面运行。
代码:
public class Test { public static void main(String[] args) { String name = "C语言中文网"; new Runnable() { @Override public void run() { System.out.println(name); } } } }
下面是java7的编译结果。
在Java 7当中出现代码错误,提示我们必须显式的声明这个变量为final的(run 方法中代码为输出name语句,也就是。
下面是Java 8编译的结果。
图2:
图3:
因为系统会默认添加final修饰符,所以在图2和图3当中,可以在匿名内部类中直接使用非final变量,而final修饰的局部变量不能在被重新赋值,所以图3中出现编译错误。
也就是说从Java 8开始,它不要求程序员必须将访问的局部变量显式的声明为final的,只要该变量不被重新赋值就可以。
一个非final的局部变量或方法参数,它的值在初始化后就从未更改,那么这个变量就是effectively final。
在Lambda表达式当中,使用局部变量时,也要求这个变量必须是final的,所以effectively final在Lambda表达式上下文中非常有用。
Lambda表达式在编程中是经常使用的,而匿名内部类是很少使用的。
那么,我们在Lambda编程中每一个被使用到的局部变量都去显示定义成final吗?很明显的,这不是一个好方法。
所以,Java 8引入了effectively final新概念。
小结,规则没有改变,Lambda表达式和匿名内部类访问的局部变量必须是final的,只是不需要程序员显式的声明变量为final的,从而节省时间。
对于Effectively final功能的一些介绍你都了解了吧,更多相关java基础知识,可以继续通过奇Q工具网来了解哦。
推荐阅读: