2012-07-18 101 views
0
// 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>()这里没有做同样的事情吗?我很困惑 。我们是否在这里实例化一个Abstract类?

+8

这是你的抽象类的**匿名内部子类**的一个实例。 – 2012-07-18 15:20:29

+0

它看起来像一个静态方法 – 2012-07-18 15:20:42

+0

@MarkoTopolnik我也认为它是一个匿名的子类,但为什么这里没有扩展'关键字'? – Geek 2012-07-18 15:22:06

回答

2

没有,你正在创建一个匿名。你是你的抽象类的子类,你提供了一个实现并同时实例化它。

如果你试试这个:

return new AbstractList<Integer>(); 

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

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

+0

为什么关键字'extends'缺失? – Geek 2012-07-18 15:24:04

+0

@Makoto当然我是继承....遵循'@ Override'注释。没有继承就无法重写。 – Geek 2012-07-18 15:26:48

+0

在这种情况下是隐含的。 – 2013-05-13 23:46:21

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

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

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; 
    } 
}; 

是Equivilent到:

... 

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; 
    } 
} 
相关问题