为什么匿名内部类被隐式标记为final?

时间:2013-07-18 05:34:53

标签: java

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

4 个答案:

答案 0 :(得分:5)

最终意味着他们无法延期。你会如何扩展匿名内部课程?它甚至没有引用它的名称。如果你需要扩展它,你应该把它变成一个合适的类。

答案 1 :(得分:2)

正如你在问题的答案中所述:没有办法宣告

类X延伸Y

当Y是匿名类时。它没有名称因此不能像这样引用。唯一可以覆盖它的地方是在声明它的地方,也许就是这样(实际上并不起作用:

new (new AbstactX(){
    public void doSomthing(){..}
})(){
    @Override
    public void doSomething(){..}
}

但你为什么要那样做?你也可以直接写下最终的实现。

答案 2 :(得分: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创建了一个扩展我们的匿名类

的类

答案 3 :(得分:0)

因为仅使用匿名内部类如果您只想创建此类的单个对象,那么您甚至不需要为该类命名。所以进一步扩展它没有任何意义。