java8 Effectively final详细介绍

KLQ 2020-09-07 15:03:31 java常见问答 6925

你知道什么是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的编译结果。

java7的编译结果

在Java 7当中出现代码错误,提示我们必须显式的声明这个变量为final的(run 方法中代码为输出name语句,也就是System.out.println(name);

下面是Java 8编译的结果。

图2:

Java 8编译的结果

图3:

Java 8编译的结果

因为系统会默认添加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工具网来了解哦。

推荐阅读:

java静态内部类详细介绍

java实例内部类详细介绍

java内部类最简单的应用分享,使用方法实例