类java.io.Reader和java.io.InputStreamReader都具有完全相同签名的读取方法
public int read(char[] charbuf, int offset, int length) throws IOException
现在根据java文档,类java.io.FileReader继承这两个这些read()方法来自两者上述类。
现在FileReader扩展了InputStreamReader,进一步扩展了Reader
(Reader <-- Inputstreamreader <-- FileReader)
和read()在两个类中都有相同的签名,不应该是因为InputStreamReader从Reader读取了read()而且FileReader继承了那个over-ridden方法??或者我错过了什么?
FileReader继承的两个read()s的功能略有不同(在等待输入时大约有一个块,而另一个没有)。
答案 0 :(得分:4)
InputStreamReader
中的方法为Reader
中的 abstract 方法提供了实现。 FileReader
不会进一步覆盖该方法;它只是从InputStreamReader
继承了实现。
请注意,有四个签名可供阅读:
public int read()
public int read(char[] cbuf, int offset, int length)
public int read(char[] cbuf)
public int read(CharBuffer target)
InputStreamReader
仅覆盖前两个。也许那令你困惑的是什么?
答案 1 :(得分:1)
好吧,我们来看看源代码吗?
班级Reader:
abstract public int read(char[] cbuf,
int off,
int len) throws IOException
所以,abstract
,这里没什么可看的。
public int read(char[] cbuf,
int offset,
int length) throws IOException
{
return sd.read(cbuf, offset, length);
}
所以这里我们从Reader
覆盖了方法。
最后,FileReader没有定义此类方法,因此它只是从InputStreamReader
继承它。