【问题标题】:Instantiation of abstract classes [duplicate]抽象类的实例化[重复]
【发布时间】:2019-03-07 14:00:04
【问题描述】:

我一直在阅读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 oop java-8 functional-programming anonymous-class


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      相关资源
      最近更新 更多