抽象类InputStream
说子类需要实现read()
读取one byte
然后将其转换为unsigned int
.
System.in
是一个InputStream
,我可以这样做:
int i = System.in.read();
我的问题是..这个方法在哪里实现?它是如何工作的?也许是一个奇怪的问题,但我试图找出幕后发生的事情,因为我使用的是 InputStream 类的对象而不是它的子类之一,所以我想知道实际方法在哪里实现以及它为什么起作用。 ..
抽象类InputStream
说子类需要实现read()
读取one byte
然后将其转换为unsigned int
.
System.in
是一个InputStream
,我可以这样做:
int i = System.in.read();
我的问题是..这个方法在哪里实现?它是如何工作的?也许是一个奇怪的问题,但我试图找出幕后发生的事情,因为我使用的是 InputStream 类的对象而不是它的子类之一,所以我想知道实际方法在哪里实现以及它为什么起作用。 ..
System.in 是一个 InputStream的实现,它实现了 read 方法。
如果您查看源代码,System
您会发现它实际上是FileInputStream
打开文件句柄 0(这是标准输入流)。但这并不重要。你唯一需要知道的是你可以从中阅读。如果它是 a FileInputStream
, aStringInputStream
或其他一些 native ,则无关紧要InputStream
。这就是接口的全部意义所在。您几乎可以只针对接口进行编程,而不必担心具体的实现。
幕后发生的事情是这样的:in
类的属性System
在运行时被分配了对某个类的对象的引用X
。该类X
extends InputStream
,因此,它实现了该read
方法。
你不能确定(意思是,它没有在任何地方指定)什么是类X
;你所知道的是它扩展了InputStream
。不同的 JDK 可能使用不同的类。
InputStream
是 的类型System.in
,而不是它的类(因为InputStream
它是抽象的,所以不能直接实例化)。
考虑:
Object obj = "123";
变量的类型obj
是Object
,但引用的obj
实例是 的实例String
。何时toString()
调用obj
inString
中的实现,而不是 .in 中的实现Object
。
也是如此System.in
。存储在那里的实际实例将是 的某个子类InputStream
,它们将有自己的任何抽象方法的实现。如果您想知道存储在其中的实例的类,System.in
则可以调用System.in.getClass()
.
什么是 System.in.read() ?
1)System.in
退货static InputStream in
首先InputStream
Class 是一个abstract class
with its read method also abstract
,这意味着 read 方法可能有 n 个实现。
那么幕后发生了什么?
System.in
返回一个扩展 InputStream 的 ie 类的实例,InputStream class on runtime
因为我们知道所有字节流类都扩展 InputStream ,所以它可以是任何扩展 InputStream 类的类。现在read method is called from that class which it actually extending InputStream.
您始终可以通过调用System.in.getClass()检查为 InputStream 类提供的实例