据我了解,以下代码应该打印true
作为输出。
但是,当我运行这段代码时,它正在打印false
.
来自 Java 文档15.9.5. 匿名类 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.9.5 :
匿名类总是隐式最终的
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()));
}
}
为什么这段代码的行为是这样的?
请注意,自那时以来,JLS 中该特定部分的措辞发生了显着变化。现在(JLS 11)内容如下:
15.9.5。匿名类声明 https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.9.5:
匿名类永远不是最终的(§8.1.1.2 https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.1.2).
The fact that an anonymous class is not final is relevant in casting, in particular the narrowing reference conversion allowed for the cast operator (§5.5 https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.5). It is also of interest in subclassing, in that it is impossible to declare a subclass of an anonymous class, despite an anonymous class being non-final, because an anonymous class cannot be named by an extends clause (§8.1.4 https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.4).
这种措辞上的变化是在 JLS 9 中引入的。问题中匿名类的语义和方法的行为大部分保持不变,目的是避免这个问题所涉及的那种混乱。
The 导致变更的机票 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8161009 says:
自 1.3 以来,javac 的长期行为在很大程度上是:not将课程视为“最终”课程。为了解决这种不一致问题,应该更改规范以准确反映参考实现。
具体来说,几乎不会在设置了 ACC_FINAL 标志的情况下生成匿名类。我们无法在不影响某些序列化客户端的情况下改变这种长期存在的行为(这是允许的,但会造成不必要的破坏)。如果没有编码语言修饰符的类文件,我们就无法忠实地实现 Class.getModifers(它承诺提供“Java 语言修饰符”)。
然而,改变did实际上在某种程度上改变了语义,这也被记录在这个票证中作为可接受的影响:
该更改影响了合法程序集,因为它允许一些在当前规范下被视为非法的强制转换(请参阅JDK-6219964 http://bugs.java.com/view_bug.do?bug_id=JDK-6219964)。但是,在 JLS 中搜索“最终”类的提及后,我预计不会有任何其他影响,这意味着这是一个源兼容的修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)