2012-05-14 4 views
4

Классов java.io.Reader и java.io.InputStreamReader оба методов чтения с той же самой подписьюjava.io дилемма

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

Теперь в соответствии с документацией Java в классе java.io.FileReader наследуется оба эти методы чтения() от оба вышеупомянутые классы.

Теперь, как FileReader расширяет InputStreamReader, который дополнительно расширяет судно, стоящее на рейде

(Reader <-- Inputstreamreader <-- FileReader) 

и прочтении() имеет ту же сигнатуру в обоих классах, она не должна быть, что InputStreamReader отменяют чтения() от чтения и FileReader наследуется что чрезмерный метод? Или я что-то упустил?

Также два read() s, унаследованные FileReader, имеют немного отличающуюся функциональность (что-то около одного блока, ожидая ввода, в то время как другое не работает).

+0

Документы не говорят, что «он наследует оба», он просто перечисляет методы, унаследованные от суперклассов, суперклассами. Он не входит и не удаляет унаследованные методы из классов «выше» в цепочке наследования. –

+0

@dave: я только что видел ..: p – WickeD

ответ

4

Метод в InputStreamReader предусматривает реализацию метода в Reader. 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 перекрывает только первые два из них. Возможно, это вас смущает?

+0

Мне нравится пинать себя !! thnx jon !! – WickeD

1

Хорошо, давайте проверим исходный код, не так ли?

Класс Reader:

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.