1

抽象类InputStream说子类需要实现read()读取one byte然后将其转换为unsigned int.

System.in是一个InputStream,我可以这样做:

 int i = System.in.read();

我的问题是..这个方法在哪里实现?它是如何工作的?也许是一个奇怪的问题,但我试图找出幕后发生的事情,因为我使用的是 InputStream 类的对象而不是它的子类之一,所以我想知道实际方法在哪里实现以及它为什么起作用。 ..

4

4 回答 4

2

System.in 是一个 InputStream的实现,它实现了 read 方法。

如果您查看源代码,System您会发现它实际上是FileInputStream打开文件句柄 0(这是标准输入流)。但这并不重要。你唯一需要知道的是你可以从中阅读。如果它是 a FileInputStream, aStringInputStream或其他一些 native ,则无关紧要InputStream。这就是接口的全部意义所在。您几乎可以只针对接口进行编程,而不必担心具体的实现。

于 2012-12-03T09:37:46.393 回答
1

幕后发生的事情是这样的:in类的属性System在运行时被分配了对某个类的对象的引用X。该类Xextends InputStream,因此,它实现了该read方法。

你不能确定(意思是,它没有在任何地方指定)什么是类X;你所知道的是它扩展了InputStream。不同的 JDK 可能使用不同的类。

于 2012-12-03T09:42:45.640 回答
1

InputStream是 的类型System.in,而不是它的类(因为InputStream它是抽象的,所以不能直接实例化)。

考虑:

Object obj = "123";

变量的类型objObject,但引用的obj实例是 的实例String。何时toString()调用objinString中的实现,而不是 .in 中的实现Object

也是如此System.in。存储在那里的实际实例将是 的某个子类InputStream,它们将有自己的任何抽象方法的实现。如果您想知道存储在其中的实例的类,System.in则可以调用System.in.getClass().

于 2012-12-03T09:46:24.640 回答
1

什么是 System.in.read() ?

1)System.in退货static InputStream in

首先InputStreamClass 是一个abstract classwith 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 类提供的实例

于 2013-06-14T15:09:21.453 回答