java - 匿名内部类和 Final 修饰符

标签 java

<分区>

据我正确理解匿名类总是final:

这在JLS 15.9.5中有专门提到

但是,当我运行以下代码来检查它是否显示 Inner 类不是 final 时。

    public class Test{
    static class A<T> {
    }
    public static void main(String arg[]) {
        A<Integer> obj = new A() {
        };
        if ((obj.getClass().getModifiers() & Modifier.FINAL) != 0) {
            System.out.println("It is a final  " + obj.getClass().getModifiers());
        } else {
            System.out.println("It is not final " + obj.getClass().getModifiers());
        }
    }
}

以上程序的输出是:

It is not final 0

请消除我的疑问,因为我无法理解这种行为。

最佳答案

我同意这可能被认为是一个错误,因为 JLS 中的其他情况表现出不同的行为。一个典型的例子是一个接口(interface):根据 section 9.1.1.1 :

Every interface is implicitly abstract.

当运行以下命令时:

interface X {
    void foo();
}

public static void main(String arg[]) {
    System.out.println(Modifier.isAbstract(X.class.getModifiers()));
}

它返回真。

另一个例子是一个枚举,其中 the JLS specifies :

An enum declaration is implicitly final unless it contains at least one enum constant that has a class body

下面的例子与它完全吻合。

enum X {

}

public static void main(String arg[]) {
    System.out.println(Modifier.isFinal(X.class.getModifiers()));  // true
}

关于java - 匿名内部类和 Final 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817768/

相关文章:

java - 如何从 ContextListener 停止执行 Servlet WebApp?

Java 查找扩展的默认桌面应用程序

java - 我需要从 java 中的属性文件中将变量作为字符串传递

java - 如何找到更大的共享目录文件夹并通过电子邮件发送

java - Google App Engine 本地主机后端错误

java - 当 str = 2011/12/12aaaaaaaaa 时,SimpleDateFormat parse(string str) 不会抛出异常?

Java Servlets 转发一个 View ,其中有一个指向 css 的链接

java - 从内容 URI 获取目录路径

java - Java中什么时候调用对象类型而不是对象的方法,特别是在静态绑定(bind)中?

java - 用单个对象的克隆填充数组