我试图理解Java中的抽象类,所以我在IntelliJ中编写了这段代码:
AutoCloseable ac = new BufferedInputStream(new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
});
IntelliJ自动创建@Override
和read()
存根。
由于InputStream
是一个抽象类,为什么我可以使用new
关键字对其进行实例化?
另一件事。当我删除这样的方法存根时:
AutoCloseable ac = new BufferedInputStream(new InputStream());
IDE说InputStream
是抽象的,因此无法实例化(如预期的那样)。
那么,为什么前者有效而后者不呢?
这个read()
方法来自何处?
答案 0 :(得分:4)
您没有在第一个示例中实例化InputStream
。您正在实例化一个扩展InputStream
的匿名类,并实现InputStream
- read()
的唯一抽象方法。那个匿名类不是抽象的,所以你可以实例化它。
另一方面,new InputStream()
尝试实例化一个抽象类,这是不可能的。