抽象的实例化类

Instantiation of abstract classes

我一直在阅读 this guide 内部 classes 并且发现了这个有趣的匿名示例 class。

因此,默认情况下我们无法实例化抽象 class,例如

abstract class AnonymousInner {
   public abstract void mymethod();
}

public class Outer_class {
   public static void main(String args[]) {
      AnonymousInner inner = new AnonymousInner();
      inner.mymethod(); 
   }
}

给出一个错误,指出我们无法实例化一个抽象 class。 但是这样做很好-

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(); 
   }
}

所以我有点不知道第二个例子是如何工作的。

这是因为你正在创建一个匿名的 class - 你正在就地定义你的抽象 class 的实现,没有名字,只能在这里使用,然后实例化它(具体)class。更多信息 here.

其他示例是在任何需要功能接口的地方使用 lambda,例如在流中:

stream.filter(a -> a.isTrue)...
// or
stream.filter(ClassA::isTrue)...

此处 lambda 和方法引用被视为 Predicate.

的实现

在这里,您正在创建 inner class 的对象,它扩展了 abstract class。你可以反编译生成的class文件,自己看看。

这是代码编译后生成的class。 (我反编译了 class,它看起来像这样:

final class Outer_class
  extends AnonymousInner
{
  public void mymethod()
  {
    System.out.println("This is an example of anonymous inner class");
  }
}

您可以清楚地看到 inner class 正在为 abstract class 提供实现。