注意:我不是在问一个古老的问题,为什么在匿名类中访问的外部变量需要被声明为final。
在Java中创建匿名类时,如果需要,可以添加其他方法:
Runnable r = new Runnable() {
public void run() {
internal();
}
public void internal() {
.. code ..
}
};
但是,Java还允许您将其他方法声明为final
:
public final void internal() { ... }
我的问题是:这些方法是否已经有效最终,添加final
关键字是否有效?
答案 0 :(得分:13)
关于final
methods的Java规范说:
private
方法和在final
类(第8.1.1.2节)中立即声明的所有方法都表现为final
,因为无法覆盖它们。
和Anonymous Class Declarations:
匿名类总是隐式
final
(第8.1.1.2节)。
因此,匿名类已经是final
,它的所有方法都是final
。您可以添加final
修饰符,但这是多余的。
Sotirios Delimanolis的有趣评论表明,Reflection 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中修复。