当前位置: 首页 > 知识库问答 >
问题:

显示不正确修饰符的匿名内部类

法和安
2023-03-14

据我所知,以下代码应该已打印为输出true

但是,当我运行此代码时,它正在打印false

来自匿名类15.9.5的Java文档:

匿名类总是隐式最终的

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()));
    }
}

为什么这个代码会这样?

共有3个答案

吴嘉禧
2023-03-14

匿名类被认为是隐式的final,因为您不能创建它们的子类。这并不意味着修饰符。应该为匿名类设置FINAL修饰符。

景英杰
2023-03-14

匿名类永远不会是最终类(§8.1.1.2)。

JLS 11-15.9.5。匿名类声明

我不知道这背后的原因,但是,根据@Hulk的回答和这个bug报告,以前版本的规范似乎稍微误导了我们,说匿名类是最终的。

经清野
2023-03-14

请注意,自那时以来,JLS这一特定部分的措辞发生了重大变化。现在(JLS 11)写道:

15.9.5。匿名类声明:

匿名类永远不是最终类(§8.1.1.2)。

匿名类不是final这一事实与cast相关,特别是cast运算符允许的缩小引用转换(§5.5)。子类化也很有趣,因为尽管匿名类是非最终类,但不可能声明匿名类的子类,因为匿名类不能用extends子句命名(§8.1.4)

JLS 9中引入了这一措辞变化。匿名类的语义和问题中方法的行为基本上保持不变,目的是避免与这个问题有关的那种混淆。

导致改变的票证上写着:

自1.3以来,javac的长期行为在很大程度上不是将类视为“final”。为了解决这种不一致性,应修改规范以准确反映参考实现。

具体来说,匿名类几乎从不使用ACC_FINAL标志集生成。我们无法在不影响某些序列化客户端的情况下更改这种长期行为(这是允许的,但会造成不必要的破坏)。我们不能忠实地实现类。getModifiers(promise提供“Java语言修饰符”)没有编码语言修饰符的类文件

然而,这种变化确实在某种程度上改变了语义学,这也被记录在这张票中,作为一种可接受的影响:

该更改影响了合法程序集,因为它允许一些在当前规范下被视为非法的强制转换(参见JDK-6219964)。但是,在搜索了JLS中提到的“final”类之后,我没有预料到任何其他影响,这意味着这是一个源代码兼容的修复程序。

 类似资料:
  • 问题内容: 据我了解,以下代码应已打印为输出。 但是,当我运行此代码时,它正在打印。 来自Java文档 匿名类15.9.5。: 匿名类始终是隐式最终的 为什么这段代码会这样? 问题答案: 请注意,自那时以来,该特定部分的JLS中的措词已发生重大变化。现在(JLS 11)显示: 15.9.5。匿名类声明: 匿名类永远不会是最终的(第8.1.1.2节)。 匿名类不是最终的事实与强制转换有关,尤其是强制

  • 问题内容: 这个问题已经在这里有了答案 : 匿名内部类显示不正确的修饰符 (4个答案) 去年关闭。 据我正确理解 总是: 这已经在 但是,当我运行以下代码来检查它是否显示该类不是。 上面程序的输出是: 请清除我的疑问,因为我无法理解此行为。 问题答案: 显式 是在源代码中写的东西。因此,如果将某些东西声明为,则意味着该类是 明确的final 。 隐式 不是在源代码中写下的,而是在某种构造的上下文中

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 有人能告诉我代码有什么问题吗?它只显示第一行和表头information.thks

  • 我正在尝试使用一个名为'jQuery.InstagramFeed'的库,它允许我在不使用访问令牌的情况下显示用户feed中的图像。所以,我一直在尝试使用它,但是,出于某种原因,它并没有向我展示任何东西。 我已经研究了几个星期了,我已经尝试了在这里的很多帖子(以及其他论坛)中提出的很多解决方案,比如下面这些: TypeError:$不是函数调用jQuery函数 “未捕获的TypeError:$不是函