java - 在匿名类中的方法中添加 'final' 关键字是否有任何效果?

标签 java

注意:我不是在问这个古老的问题,即为什么在匿名类中访问的外部变量需要声明为 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 a final class (§8.1.1.2) behave as if they are final, 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/

相关文章:

java - JDBC - PostgreSQL - 批量插入+唯一索引

java - 两部分别连接到 PC 的 Cisco IP 电话之间的实时调用功能

java - 类型敏感的语言可以是无类型的吗?

签署 jar 后 Java 小程序仍然出现安全错误

java - 我们是否只需要导入一个包来创建一个对象,或者还需要从该对象调用一个方法?

JAVA:修改、删除、列出一个arraylist通讯录

java - 具有类和子类空错误的数组

java Swing——JPanel 和 PropertyChangeListener

java - 截图并保存到应用程序自己的目录中

java - websocket.send 期间收到 "InvalidStateError: DOM Exception 11"