2016-06-12 6 views
1

그래서 내가 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()은 추상 클래스를 인스턴스화하려고 시도하지만 불가능합니다.

관련 문제