是否可以将匿名类声明为抽象?

时间:2016-09-04 08:40:26

标签: java abstract-class abstract anonymous-class

我试图找出,如果可以创建匿名内部类作为抽象。我想,它没有意义,因为我试图创建抽象类的实例,但编译器的消息让我感到困惑:

“从Test派生的匿名类”必须是声明为abstract ,或者在Test

中实现抽象方法'method()'

代码:

abstract class Test{
    abstract void method();
}
Test o = new Test(){};


如果可以将匿名类声明为抽象类,请告诉我如何执行此操作。
我很乐意回答。

3 个答案:

答案 0 :(得分:5)

JLS Sec 15.9.5(强调我的):

  

15.9.5。匿名类声明

     

Java编译器会自动从类实例创建表达式派生出一个匿名类声明。

     

匿名类永远不抽象(§8.1.1.1)。

     

匿名类总是隐含最终的(§8.1.1.2)。

     

匿名类始终是内部类(第8.1.3节);它永远不会是静态的(§8.1.1,§8.5.1)。

答案 1 :(得分:0)

你不能也没有意义将匿名类声明为抽象类,因为匿名只被用作本地类一次。

我认为您因为类似问题Class must either be declared abstract or implement abstract method error

而收到此错误

答案 2 :(得分:0)

正如Andy Turner引用的那样,你的问题的答案是否定的。

但是我想你想知道不同的东西。

为什么会收到此编译器消息?

编译器在这里有点误导。它提供了两种可能的解决方案,基于您声明一个类(该匿名类),然后还要创建该类的实例:

  1. 使派生类(匿名类始终是)抽象, 这对于普通类和内部类很好,但对于匿名类是不可能的,所以编译器不应该首先建议它
  2. 实现所有方法,并且在匿名类声明中没有抽象方法
  3. 所以要解决您的实际问题:只需实现method(),这样您的匿名类声明就不再包含抽象方法

    abstract class Test{
        abstract void method();
    }
    Test o = new Test()
    {
      void method()
      {
        // do something 
      };
    };
    

    现在声明了一切,编译器不应该再抱怨了。