注意:我不是在问这个古老的问题,即为什么在匿名类中访问的外部变量需要声明为 final。
在 Java 中创建匿名类时,您可以根据需要添加其他方法:
Runnable r = new Runnable() {
public void run() {
internal();
}
public void internal() {
.. code ..
}
};
但是,Java 还允许您将附加方法声明为final
:
public final void internal() { ... }
我的问题是:那些方法不是已经有效地完成了吗,添加 final
关键字有什么效果吗?
最佳答案
关于final
methods的Java规范说:
A
private
method and all methods declared immediately within afinal
class (§8.1.1.2) behave as if they arefinal
, since it is impossible to override them.
来自Anonymous Class Declarations :
An anonymous class is always implicitly
final
(§8.1.1.2).
因此,匿名类已经是final
,这使得它的所有方法都final
。您可以添加 final
修饰符,但这是多余的。
Sotirios Delimanolis 的有趣评论表明反射 API 实际上不会报告匿名类的 final
修饰符:
public class Main {
public static void main(String[] args) {
Main anon = new Main() {};
System.out.println(Modifier.isFinal(anon.getClass().getModifiers())); // prints false
}
}
这显然是一个已知错误 ( JDK-8129576 ),计划在 Java 9 中修复。
关于java - 在匿名类中的方法中添加 'final' 关键字是否有任何效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621221/