抽象类的实例化[重复]

问题描述 投票:2回答:2

我一直在读内部类的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(); 
   }
}

所以我有点迷失第二个例子是如何运作的。

java abstract-class anonymous-class
2个回答
3
投票

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

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

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

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


2
投票

在这里,您将创建扩展抽象类的内部类的对象。您可以反编译生成的类文件并亲自查看。

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

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

您可以清楚地看到内部类正在为抽象类提供实现。

© www.soinside.com 2019 - 2024. All rights reserved.