cor*_*iKa 6 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!");
}
};
Run Code Online (Sandbox Code Playgroud)
如果我选择的话,为什么我不允许再次继承它?
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!");
}
};
Run Code Online (Sandbox Code Playgroud)
我不是说我一定想要,或者甚至可以想到我会这样做的原因.但我很好奇为什么会这样.
好吧,能够子类化匿名类是没有用的.您能够引用匿名类的唯一位置将在其定义的语句中(如您的假设伪代码示例所示).这意味着程序将保证永远不会创建匿名超类的任何实例 - 并且智能编译器应该能够将这两个定义合并到一个类中.
更实际的是,当一个类是final时,编译器和VM可以自由地在调用站点内联其方法.因此,在任何自然无法扩展给定类的情况下,使这些类本质上是最终的是有意义的.
归档时间: |
|
查看次数: |
650 次 |
最近记录: |