变量"effectively final"是什么意思?

17

匿名类的文档中指出:

一个匿名类不能访问其封闭范围内未声明为 final 或有效 final 的局部变量。

我不理解什么是“有效 final”。有人能提供一个例子帮助我理解吗?


8
https://dev59.com/iGEi5IYBdhLWcg3wyO44 - 尽管我认为在Java的伪闭包中,对局部变量的访问要求是“final”,但我经常犯错/过时了 :-/ - user2864740
2个回答

25

“Effectively final”意味着在获取初始值后从未更改。

一个简单的例子:

public void myMethod() {
    int a = 1;
    System.out.println("My effectively final variable has value: " + a);
}

这里,a 没有声明为 final,但由于它从未被更改,因此被视为 有效的 final

从Java 8开始,可以以以下方式使用:

public void myMethod() {
    int a = 1;
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("My effectively final variable has value: " + a);
        }
    };
}

在Java 7及之前的版本中,a必须声明为final才能在类似这样的本地类中使用,但从Java 8开始,它只需要是有效的final即可。


当我们在变量前声明final关键字时,编译器不允许我们更改变量的值。但是根据有效final的定义,没有必要在变量前声明final关键字。那么,是否可以更改有效变量的值呢?也就是说,当我们更改值时,变量是否还是有效final的? - Harmeet Singh Taara
@Harmeet:确实,如果您更改了该值,它将不再是有效地最终的,因此您无法更改有效地最终变量的值。 - Keppil

5
根据文档
初始化后其值从未更改的变量或参数被认为是 effectively final

你能添加一个链接到相应的文档吗? - Behe
@Behe 抱歉错过了文档路径。请在http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html找到。 - Kick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接