2016-06-12 105 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()試圖實例化一個抽象類,這是不可能的。