Java:new Abstract Class(){}这个声明叫什么?

时间:2014-08-18 18:04:46

标签: java abstract-class

在我的应用程序中有一个抽象类,可以多次使用,如下所示:

public class Myclass{
    int amount;
    String name;
    public void printResultsFromDB(){
        new MyabstractClass(name){
            @Override
            String getDataFromDB(){
                //some implementation
            }
        };
    }
}

public abstract MyabstractClass{
    String name;
    public MyabstractClass(String name){
        this.name = name;
    }
    abstract String getDataFromDB();
    void execute(){
        //Some implementation
    }
}

我想知道代码中的第5行是什么? 我知道我们无法实例化一个抽象类。这个声明被称为匿名类吗?

3 个答案:

答案 0 :(得分:2)

这在Java中称为匿名类型。它允许您实现接口或扩展抽象类,而无需为其命名类。

如果经常实现接口或抽象类,并且为每个实现创建一个新类最终会导致混乱的类混乱,这将非常有用。一个很好的例子是Java的Runnable接口,它只允许将void方法传递给不带参数的方法。

您可以在此处找到更多相关信息:http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

答案 1 :(得分:1)

您没有实例化抽象类。它是扩展MyabstractClass的anonymous inner class。它仍然必须提供任何抽象方法的实现。

它适用于您希望为一个案例提供一些自定义实施的情况,但您不希望在其他任何地方重复使用它。

答案 2 :(得分:1)

这是一个允许您实现接口的匿名类。

来自Oracle docs

  

匿名类表达式包含以下内容:

     
      
  • 新操作员
  •   
  • 要实现的接口的名称或要扩展的类。在此示例中,匿名类正在实现接口
      的HelloWorld。
  •   
  • 包含构造函数参数的圆括号,就像普通的类实例创建表达式一样。注意:当你   实现一个接口,没有构造函数,所以你使用了一个   一对空括号,如本例所示。
  •   
  • 一个正文,它是一个类声明体。更具体地说,在正文中,方法声明是允许的,但语句不是。
  •