这个问题在这里已有答案:
我一直在读内部类的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();
}
}
所以我有点迷失第二个例子是如何运作的。
这是因为你正在创建一个匿名类 - 你正在定义一个没有名字的抽象类的实现,只能在这里使用然后实例化这个(具体的)类。更多关于它here。
其他示例将在任何地方使用lambdas,其中需要功能接口,例如在流中:
stream.filter(a -> a.isTrue)...
// or
stream.filter(ClassA::isTrue)...
这里lambda和方法引用被视为Predicate
的实现。
在这里,您将创建扩展抽象类的内部类的对象。您可以反编译生成的类文件并亲自查看。
这是代码编译后生成的类。 (我已经反编译了这个类,它看起来像这样:
final class Outer_class$1
extends AnonymousInner
{
public void mymethod()
{
System.out.println("This is an example of anonymous inner class");
}
}
您可以清楚地看到内部类正在为抽象类提供实现。