我们实际上是在实例化一个Abstract类吗?

时间:2012-07-18 15:18:13

标签: java

// 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>()做同样的事情是不是有什么意义呢?我很困惑。

4 个答案:

答案 0 :(得分:2)

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

如果您尝试这样做:

return new AbstractList<Integer>();

您将收到错误,因为您不会提供具体的实现。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

就像信息一样,所有类型的内部类在编译过程之后都会生成.class文件。所以,代码:

<强> Test.java

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.class:文件的公共类(Test.java)
  • Test $ Foo.class:Test类中的抽象内部类。
  • 测试$ 1.class:在bar方法中编码的匿名内部类。

答案 3 :(得分:0)

,您正在创建一个匿名类。

您的密码:

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 myNewClass()

...


public class myNewClass extends 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;
    }
}