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

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

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


那么,能够继承一个匿名类是很没用的。 唯一可以引用匿名类的地方就在它定义的语句中(如你假设的伪代码示例所示)。 这意味着程序将保证永远不会创建任何匿名超类的实例 - 并且智能编译器应该能够将两个定义合并到一个类中。

更实际的是,当一个类是最终的时候,编译器和虚拟机可以自由地在呼叫站点内插它的方法。 所以在任何情况下自然不可能扩展一个给定的类,那么使这样的类在本质上是最终的是合理的。

链接地址: http://www.djcxy.com/p/91983.html

上一篇: Why are all anonymous classes implicitly final?

下一篇: Why can't inner classes declare static members?