根据我的理解 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)
请清除我的疑问,因为我无法理解这种行为.
显式是在源代码中编写的内容。因此,如果某些东西被声明为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)
和interface都abstract interface被视为抽象接口。通过反射它们也被认为是静态的。显然,在解析和编译Java源代码的过程中,可以删除或添加一些修饰符。