为什么我可以实例化这个抽象类?

时间:2016-06-12 11:53:01

标签: java intellij-idea instance abstract-class

我试图理解Java中的抽象类,所以我在IntelliJ中编写了这段代码:

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

IntelliJ自动创建@Overrideread()存根。

由于InputStream是一个抽象类,为什么我可以使用new关键字对其进行实例化?

另一件事。当我删除这样的方法存根时:

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

IDE说InputStream是抽象的,因此无法实例化(如预期的那样)。

那么,为什么前者有效而后者不呢?

这个read()方法来自何处?

1 个答案:

答案 0 :(得分:4)

您没有在第一个示例中实例化InputStream。您正在实例化一个扩展InputStream的匿名类,并实现InputStream - read()的唯一抽象方法。那个匿名类不是抽象的,所以你可以实例化它。

另一方面,new InputStream()尝试实例化一个抽象类,这是不可能的。