我想知道为什么java中的匿名内部类被标记为final。我通读了this 发布但无法理解这个概念。甚至JLS指定所有匿名内部类都是隐式最终的。有人可以详细说明这个概念吗?
答案 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)
因为仅使用匿名内部类如果您只想创建此类的单个对象,那么您甚至不需要为该类命名。所以进一步扩展它没有任何意义。