2016-06-12 2 views
1

Я пытаюсь понять абстрактные классы в Java, так что я написал этот код в IntelliJ:Почему я могу создать экземпляр этого абстрактного класса?

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

@Override и read() окурок был создан автоматически IntelliJ.

С InputStream - абстрактный класс, почему я могу создать его с помощью ключевого слова new?


И еще одно. При удалении метода окурок так:

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

В среде IDE говорит, что InputStream является абстрактным и, следовательно, не может быть реализован (как и ожидалось).

Итак, почему первый действует, а последний нет?

И откуда этот метод read()?

ответ

4

Вы не создаете экземпляр InputStream в первом примере. Вы создаете анонимный класс, который расширяет InputStream и реализует единственный абстрактный метод: InputStream - read(). Этот анонимный класс не является абстрактным, поэтому вы можете его создать.

С другой стороны, new InputStream() пытается создать экземпляр абстрактного класса, что невозможно.