Why can the InputStream class be instantiated? Isn't it an abstract class?
我听说InputStream类是一个抽象类,它是所有字节流输入类的超类,由其他特定的字节流输入类继承。但是,我也读到了java.lang.system中有一个对象引用了我们称之为java.lang.System.in的标准输入流,该对象实例化了类input stream。
在Sun API文档中,"in"定义为:
但我知道抽象类不能实例化。我误解了什么吗?
- 这是声明和任务的左右两侧的区别。您可以声明抽象和接口类型;这是引用的静态编译时类型。右侧表示堆上对象的动态运行时类型。
- 快速测试System.out.println(System.in.getClass());,你就会知道它是真正的类。
- 谢谢!我明白了。我应该多看看。但只是要求澄清:"默认情况下,java.lang.System.in是指java.io.BufferedInputStream还是可以改变?"
这里的变量"in"只保存对一个对象的引用,该对象可以满足"is a inputstream"的要求。这意味着变量"in"可以容纳扩展输入流的具体类的任何瞬间,例如audioinputstream,它满足条件"is a inputstream"。我认为这与多态性有关。