我一直在阅读this guide的内部类,并遇到了这个有趣的匿名类示例。
因此,默认情况下,我们无法实例化抽象类,例如
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner();
inner.mymethod();
}
}
给出一个错误,指出我们无法实例化抽象类。 但是这样做是很好的-
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
所以我有点迷失了第二个示例的工作原理。
答案 0 :(得分:3)
这是因为您要创建一个匿名类-您正在定义没有名称的抽象类的实现,该实现只能在此处使用,然后实例化此(具体)类。进一步了解here。
其他示例将在需要功能接口的地方(例如流中)使用lambda:
stream.filter(a -> a.isTrue)...
// or
stream.filter(ClassA::isTrue)...
这里的lambda和方法引用被视为Predicate
的实现。
答案 1 :(得分:2)
在这里,您正在创建 inner 类的对象,该对象扩展了 abstract 类。您可以反编译生成的类文件,然后自己查看。
这是在代码编译后将生成的类。 (我已经对该类进行了反编译,它看起来像这样:
Get
您可以清楚地看到 inner 类正在为 abstract 类提供实现。