匿名内部类和最终修饰符

Jok*_*ker 7 java

根据我的理解 anonymous classes,总是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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上述计划的输出是:

It is not final 0
Run Code Online (Sandbox Code Playgroud)

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

MC *_*ror 1

显式是在源代码中编写的内容。因此,如果某些东西被声明为public final class,则意味着该类显式是Final

隐式是指未在源代码中记录的内容,但在特定构造的上下文中或基于语言规则,元素的行为与使用指定修饰符声明时相同。

例如,enum声明中的关键字enum SomeEnum { }导致SomeEnumbe final,因为语言规则规定了它。其效果与关键字的效果相同final

匿名类是隐式最终的示例是因为不存在可以重写匿名类的语言构造。所以它的行为就像是一样final。我认为“有效”这个词在这里更好。


然而,你不能根据反射如何呈现事物来做出假设。考虑以下片段:

public class Test {
    interface SomeInterface { }
    abstract interface SomeAbstractInterface { }
    static abstract class SomeAbstractClass { }
    enum SomeEnum { }

    public static void main(String arg[]) {
        System.out.println(Modifier.toString(SomeInterface.class.getModifiers()));
        System.out.println(Modifier.toString(SomeAbstractInterface.class.getModifiers()));
        System.out.println(Modifier.toString(SomeAbstractClass.class.getModifiers()));
        System.out.println(Modifier.toString(SomeEnum.class.getModifiers()));
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

abstract static interface
abstract static interface
abstract static
static final
Run Code Online (Sandbox Code Playgroud)

interfaceabstract interface被视为抽象接口。通过反射它们也被认为是静态的。显然,在解析和编译Java源代码的过程中,可以删除或添加一些修饰符。