2012-05-14 3 views
4

클래스 java.io.Reader의와 java.io.InputStreamReader 모두 클래스 java.io.FileReader 상속 자바 설명서에 따라 동일한 서명 이제java.io 딜레마

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

과 방법을 읽고 모두 이러한 read() 메소드는 에서 모두 위에서 언급 한 클래스입니다. 을 FileReader가 InputStreamReader 연장으로

이제 더) 리더

(Reader <-- Inputstreamreader <-- FileReader) 

판독을 (연장 두 클래스의 동일한 특성을 갖고, 그 InputStreamReader 리더와의 FileReader로부터 판독()를 오버라이드하는 것이 없었을한다 상속 그 over-raidden 방법 ?? 또는 나는 무엇인가 여기에서 놓치고있다?

FileReader에서 상속받은 두 개의 read()도 기능이 약간 다릅니다 (입력 대기 중 한 블록은 다른 블록은 입력하지 않음).

+0

"두 가지 모두 상속 받았다"는 말을하지 않고 수퍼 클래스에 의해 수퍼 클래스에서 상속 된 메서드 만 나열합니다. 클래스는 상속 체인에서 "상향"클래스에서 상속 된 메소드를 제거하지 않습니다. –

+0

@dave : 방금 보았다 .. : – 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에서 상속합니다.