-1

我想知道为什么java中的匿名内部类被标记为final。我已经阅读了这篇 文章,但无法理解这个概念。甚至 JLS 都指定所有匿名内部类都是隐式最终的。有人可以详细说明这个概念吗?

4

4 回答 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 回答