抽象类InputStream
表示子类需要实现方法read()
,该方法读取one byte
然后将其转换为unsigned int
。
System.in
是InputStream
,我可以这样做:
int i = System.in.read();
我的问题是..这个方法在哪里实施?怎么运作?也许是一个奇怪的问题,但我正在试图找出引擎盖下发生的事情,因为我使用的是InputStream类的对象,而不是它的子类之一,我想知道实际方法的实现位置以及工作原理。 ..
答案 0 :(得分:2)
System.in是一个实现的InputStream,它实现了read方法。
如果您查看System
的来源,您可以看到它真的是FileInputStream
打开文件句柄0(这是标准输入流)。但这并不是真的相关。你唯一需要知道的是你可以从中读取。如果是FileInputStream
,StringInputStream
或其他原生InputStream
,则无关紧要。这就是界面的重点。您几乎可以只针对接口进行编程,而无需担心具体的实现。
答案 1 :(得分:1)
发生了什么事情:类in
的{{1}}属性在运行时被分配了对某个类System
的对象的引用。该类X
扩展了X
,因此,它实现了InputStream
方法。
你无法确定(意思是,它没有在任何地方指定)什么类read
;你所知道的是它延伸X
。不同的JDK可能会使用不同的类。
答案 2 :(得分:1)
InputStream
是System.in
的类型,而不是它的类(因为InputStream
无法直接实例化,因为它是抽象的)。
考虑:
Object obj = "123";
变量obj
的类型为Object
,但obj
引用的实例是String
的实例。在toString()
上调用obj
时,会使用String
中的实现,而不是Object
中的实现。
System.in
也是如此。存储在那里的实际实例将是InputStream
的一些子类,它将具有自己的任何抽象方法的实现。如果您想知道System.in
中存储的实例的类,则可以调用System.in.getClass()
。
答案 3 :(得分:1)
什么是System.in.read()?
1)System.in
返回static InputStream in
首先我们会想到 System.in.read()
,读取是 InputStream
类中的静态方法,它被调用,但是如果我们打开 InputStream
类,那么我们会发现 it is an abstract class
,这也很好,因为我们可以从任何类调用静态方法。但是当我们看看它的 read method which is also abstract
。在这里,我们关于读取方法的第一个假设被证明是错误的。
所以幕后发生了什么?
System.in
返回 InputStream class on runtime
的实例,即扩展InputStream的类,因为我们知道所有字节流类都扩展了InputStream,所以它可以是任何扩展InputStream类的类(依赖于JDK)。
现在是read method is called from the class which it actually extending InputStream.
您可以通过调用 System.in.getClass()
来检查为InputStream类提供的实例。