4

クラス java.io.Reader と java.io.InputStreamReader の両方に、まったく同じ署名を持つ read メソッドがあります。

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 がそのオーバーライドされたメソッドを継承したのではないでしょうか?? それとも、ここに何かが欠けていますか??

また、FileReader によって継承された 2 つの read() の機能はわずかに異なります (1 つは入力を待っている間にブロックされ、もう 1 つはブロックされません)。

4

2 に答える 2

4

のメソッドは、 の抽象メソッドInputStreamReaderの実装を提供します。そのメソッドをそれ以上オーバーライドしません。から実装を継承するだけです。ReaderFileReaderInputStreamReader

read には4 つの署名があることに注意してください。

public int read()
public int read(char[] cbuf, int offset, int length)
public int read(char[] cbuf)
public int read(CharBuffer target)

InputStreamReaderこれらのうち最初の 2 つだけをオーバーライドします。おそらくそれがあなたを混乱させたのですか?

于 2012-05-14T10:08:11.047 に答える
1

では、ソース コードを確認してみましょうか。

クラスリーダー

abstract public int read(char[] cbuf,
    int off,
    int len) throws IOException

ですから、abstractここには何もありません。

クラスInputStreamReader :

public int read(char[] cbuf,
    int offset,
    int length) throws IOException 

{
        return sd.read(cbuf, offset, length);
}

したがって、ここでは からのメソッドのオーバーライドがありますReader

最後に、FileReaderにはそのようなメソッドが定義されていないため、単純に から継承しInputStreamReaderます。

于 2012-05-14T10:09:31.740 に答える