我想知道为什么java中的匿名内部类被标记为final。我已经阅读了这篇 文章,但无法理解这个概念。甚至 JLS 都指定所有匿名内部类都是隐式最终的。有人可以详细说明这个概念吗?
问问题
128 次
4 回答
5
Final 意味着它们不能被扩展。您将如何扩展匿名内部类?它甚至没有名称来引用它。如果你需要扩展它,你应该让它成为一个合适的类。
于 2013-07-18T05:37:21.483 回答
2
如您所指问题的答案所述:没有办法声明
X 类扩展 Y
当 Y 是匿名类时。它没有名字,因此不能这样称呼它。唯一可能覆盖它的地方是它被声明的地方,可能像这样(实际上不起作用:
new (new AbstactX(){
public void doSomthing(){..}
})(){
@Override
public void doSomething(){..}
}
但你为什么要这样做?你还不如直接写最终的实现。
于 2013-07-18T05:38:55.307 回答
0
JLS 15.9.5 的含义还不是很清楚。当我编译这个类
公共最终类Test1 {
public static void main(String[] args) throws Exception {
Runnable r = new Runnable() {
public void run() {
}
};
}
}
我得到了 Test1.class 和 Test1$1.class。当我用 javap util 反编译它们时,我得到了这个
public final class test.Test1 {
public test.Test1();
public static void main(java.lang.String[]) throws java.lang.Exception;
}
和这个
class test.Test1$1 implements java.lang.Runnable {
test.Test1$1();
public void run();
}
如您所见,匿名类实际上不是最终的。你可以扩展它,试试这个
Class<?> cls = Class.forName("test.Test1$1");
Object mock = Mockito.mock(cls);
System.out.println(mock.getClass());
System.out.println(mock.getClass().getSuperclass());
输出
class test.Test1$1$$EnhancerByMockitoWithCGLIB$$df433a84
class test.Test1$1
这意味着 Mockito 创建了一个扩展我们的匿名类的类
于 2013-07-18T05:44:38.727 回答
0
因为仅使用匿名内部类如果您只想制作此类的单个对象,这就是您甚至不需要给类命名的原因。因此,进一步扩展它没有任何意义。
于 2013-07-18T05:46:42.500 回答