为什么所有匿名类都隐式最终?

时间:2011-12-21 01:17:48

标签: java final anonymous-class

根据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!");
    }
};

如果我选择的话,为什么我不允许再次继承它?

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!");
    }
};

我不是说我一定想要,或者甚至可以想到我会这样做的原因。但我很好奇为什么会这样。

1 个答案:

答案 0 :(得分:6)

嗯,能够继承匿名类是没有用的。您能够引用匿名类的唯一位置将在其定义的语句中(如您的假设伪代码示例所示)。这意味着程序将保证永远不会创建匿名超类的任何实例 - 并且智能编译器应该能够将这两个定义合并为一个类。

更实际的是,当一个类是最终的时,编译器和VM可以自由地在调用站点内联其方法。因此,在任何自然无法扩展给定类的情况下,使这些类本质上是最终的是有意义的。