2016-06-12 89 views
1

我想了解Java的抽象类,所以我在的IntelliJ写了这个代码片段:为什么我可以实例化这个抽象类?

AutoCloseable ac = new BufferedInputStream(new InputStream() { 
     @Override 
     public int read() throws IOException { 
      return 0; 
     } 
}); 

@Overrideread()存根被的IntelliJ自动创建。

由于InputStream是一个抽象类,为什么我可以用new关键字实例化它?


而另一件事。当我删除方法存根这样的:

AutoCloseable ac = new BufferedInputStream(new InputStream()); 

的IDE说InputStream是抽象的,因此不能被实例化(如预期)。

那么,为什么前者是有效的而后者不是?

这个read()方法从哪里来?

回答

4

在第一个例子中,您没有实例化InputStream。您正在实例化一个匿名类,它扩展了InputStream并实现了唯一的抽象方法InputStream - read()。这个匿名类不是抽象的,所以你可以实例化它。

另一方面,new InputStream()试图实例化一个抽象类,这是不可能的。