Jok*_*ker 45 java final anonymous-class jls
据我了解,下面的代码应该打印出来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)
有人可以帮我理解这种行为.
Hul*_*ulk 47
请注意,自那时起,该特定部分的JLS中的措辞发生了重大变化.它现在(JLS 11)写道:
匿名类永远不会是最终的(§8.1.1.2).
匿名类不是final的事实与转换相关,特别是转换运算符允许的缩小引用转换(第5.5节).它在子类化中也很有意义,因为尽管匿名类是非final的,但是不可能声明匿名类的子类,因为不能通过extends子句(第8.1.4节)来命名匿名类.
这种措辞的变化是在JLS 9中引入的.匿名类的语义和问题中方法的行为保持不变,目的是避免这个问题的混淆.
自1.3以来,javac的长期行为在很大程度上并未将这些类视为"最终".为了解决这种不一致性,应更改规范以准确反映参考实现.
具体来说,几乎不会在设置ACC_FINAL标志的情况下生成匿名类.我们不能在不影响某些序列化客户端的情况下改变这种长期行为(这是允许的,但是会造成不必要的破坏).而且我们不能忠实地实现Class.getModifers(它承诺提供"Java语言修饰符"),而没有编码语言修饰符的类文件.
| 归档时间: |
|
| 查看次数: |
1742 次 |
| 最近记录: |