将'final'关键字添加到匿名类中的方法是否有效?

时间:2016-06-03 18:29:28

标签: java

注意:我不是在问一个古老的问题,为什么在匿名类中访问的外部变量需要被声明为final。

在Java中创建匿名类时,如果需要,可以添加其他方法:

Runnable r = new Runnable() {
    public void run() {
        internal();
    }

    public void internal() {
        .. code ..
    }
};

但是,Java还允许您将其他方法声明为final

public final void internal() { ... }

我的问题是:这些方法是否已经有效最终,添加final关键字是否有效?

1 个答案:

答案 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中修复。