首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们真的在这里实例化一个抽象类吗?

我们真的在这里实例化一个抽象类吗?
EN

Stack Overflow用户
提问于 2012-07-18 23:18:13
回答 4查看 167关注 0票数 0
代码语言:javascript
复制
// Concrete implementation built atop skeletal implementation
  static List<Integer> intArrayAsList(final int[] a) {
    if (a == null)
      throw new NullPointerException();
    return new AbstractList<Integer>() {
      public Integer get(int i) {
        return a[i]; // Autoboxing 
      }

      @Override
      public Integer set(int i, Integer val) {
        int oldVal = a[i];
        a[i] = val; // Auto-unboxing
        return oldVal; // Autoboxing
      }

      public int size() {
        return a.length;
      }
    };
  }

到目前为止,我知道我们根本不能实例化一个抽象类。但是,我们在return new AbstractList<Integer>()上做的事情有什么不一样的呢?我很困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-18 23:20:58

No,您正在创建一个匿名类。您正在创建抽象类的子类,同时提供一个实现并实例化它。

如果你尝试这样做:

代码语言:javascript
复制
return new AbstractList<Integer>();

你会得到一个错误,因为你不会提供一个具体的实现。

如果你感到困惑,你可以随时查看官方教程。这就是:Java Inner Classes

票数 2
EN

Stack Overflow用户

发布于 2012-07-18 23:25:28

您正在创建一个继承抽象类的匿名类。您需要将abstract类的所有抽象方法实现到匿名类中。

票数 1
EN

Stack Overflow用户

发布于 2012-07-18 23:20:22

不,它不是实例化抽象类,因为代码提供了该类的实现。它就像一个匿名的内部类。

作为信息,所有类型的内部类在编译过程之后都会生成一个.class文件。因此,代码如下:

Test.java

代码语言:javascript
复制
public class Test {

    abstract class Foo {
        abstract void foo();
    }

    public Foo bar() {
        return new Foo() {
            @Override
            void foo() {
                System.out.println( "foo!!!" );
            }
        };
    }

    public static void main( String[] args ) {
        new Test().bar().foo();
    }

}

将生成:

测试方法:文件的公共类,(Test.java)

  • Test$Foo.class: class.

  • Test$1.class:内部的抽象内部类,
  • 方法内部编码的匿名内部类。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11544701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档