在我的应用程序中有一个抽象类,可以多次使用,如下所示:
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行是什么? 我知道我们无法实例化一个抽象类。这个声明被称为匿名类吗?
答案 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。- 包含构造函数参数的圆括号,就像普通的类实例创建表达式一样。注意:当你 实现一个接口,没有构造函数,所以你使用了一个 一对空括号,如本例所示。
- 一个正文,它是一个类声明体。更具体地说,在正文中,方法声明是允许的,但语句不是。