为什么所有匿名类都隐式为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