2016-06-12 6 views
1

ので、私はIntelliJの中で、このコードスニペットを書いた:なぜ抽象クラスをインスタンス化できますか?私はJavaで抽象クラスを理解しようとしている

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()は抽象クラスをインスタンス化しようとしますが、これは不可能です。

関連する問題