据我了解,下面的代码应该打印出来true.
但是,当我运行此代码时,它正在打印false.
匿名类总是隐式最终的
public class Test {
public static void main(String args[]) {
Object o = new Object() {
};
System.out.println("Annonymous class is final: " + Modifier.isFinal(o.getClass().getModifiers()));
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解这种行为.
根据JLS:
15.9.5匿名类声明编译器自动从类实例创建表达式派生匿名类声明.
匿名类永远不是抽象的(第8.1.1.1节).匿名类始终是内部类(第8.1.3节); 它永远不会是静态的(§8.1.1,§8.5.2). 匿名类总是隐式最终的(§8.1.1.2).
这似乎是一个特定的设计决定,所以它有可能有一些历史.
如果我选择这样的课程:
SomeType foo = new SomeType() {
@Override
void foo() {
super.foo();
System.out.println("Hello, world!");
}
};
Run Code Online (Sandbox Code Playgroud)
如果我选择的话,为什么我不允许再次继承它?
SomeType foo = new SomeType() {
@Override
void foo() {
super.foo();
System.out.println("Hello, world!");
}
} {
@Override
void foo() {
System.out.println("Hahaha, no super foo for you!");
}
};
Run Code Online (Sandbox Code Playgroud)
我不是说我一定想要,或者甚至可以想到我会这样做的原因.但我很好奇为什么会这样.