2012-12-03 42 views
1

抽象类InputStream表示子类需要实现方法read(),该方法读取one byte,然后将其变成unsigned intJava:当从System.in读取时实现InputStream的read()方法

System.inInputStream,我可以这样做:

int i = System.in.read(); 

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

回答

1

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

考虑:

Object obj = "123"; 

变量类型obj的是Object,而是由obj引用的实例是String一个实例。在obj上调用toString()时,将使用String中的实现,而不是Object中的实现。

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

+0

酷!在我的情况下,这是一个BufferedInputStream ..有了这个概念!谢谢 :) –

2

System.in是的执行实现了读取方法的InputStream。

如果你看看System的来源,你可以看到它打开文件句柄0(这是标准输入流)真的是FileInputStream。但这不是真的有关。你需要知道的唯一事情是你可以从中读取。这与FileInputStreamStringInputStream或其他本地InputStream不相关。这就是接口的全部要点。大多数情况下只需针对接口编程即可,无需担心具体的实现。

+0

所以将一个说,类InputStream的子类都和实施必须有方法那么实施? –

+2

'System.in'不是任何东西的实现。它是一个扩展'InputStream'类的对象的实例。 – Isaac

+0

啊...和实际的类本身os不是InputStream,它只是扩展了InputStream的东西呢?得到它了!谢谢..对不起,如果这是一个愚蠢的问题... –

1

发生了什么问题:属性System在运行时被指定为某个类X的对象的引用。该类X扩展了InputStream,因此它实现了read方法。

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

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因为我们知道所有字节流类延伸的InputStream InputStream class on runtime即类的一个实例,因此它可以是任何延伸类InputStream类(这是JDK依赖性)。 现在read method is called from the class which it actually extending InputStream.

因为你总是可以通过调用System.in.getClass()查看提供的InputStream类的实例