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