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

根据JLS:

15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。

匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.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!");

}

};

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

回答:

好吧,能够继承一个匿名类将是毫无用处的。唯一可以引用匿名类的地方是在定义它的语句中(如您的假设伪代码示例所示)。这意味着将保证该程序永远不会创建匿名超类的任何实例,并且智能编译器应能够将这两个定义折叠为一个类。

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

以上是 为什么所有匿名类都隐式为final? 的全部内容, 来源链接: utcz.com/qa/420287.html

回到顶部