抽象类的实例化

时间:2019-03-07 14:00:05

标签: java abstract-class anonymous-class

我一直在阅读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(); 
   }
}

所以我有点迷失了第二个示例的工作原理。

2 个答案:

答案 0 :(得分:3)

这是因为您要创建一个匿名类-您正在定义没有名称的抽象类的实现,该实现只能在此处使用,然后实例化此(具体)类。进一步了解here

其他示例将在需要功能接口的地方(例如流中)使用lambda:

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

这里的lambda和方法引用被视为Predicate的实现。

答案 1 :(得分:2)

在这里,您正在创建 inner 类的对象,该对象扩展了 abstract 类。您可以反编译生成的类文件,然后自己查看。

这是在代码编译后将生成的类。 (我已经对该类进行了反编译,它看起来像这样:

Get

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