2012-12-03 3 views
1

추상 클래스 InputStream은 이라는 메소드를 구현해야한다고 말하면 unsigned int으로 바뀝니다.자바 : System.in에서 읽을 때 InputStream의 read() 메소드가 구현되는 곳

System.inInputStream 내가 할 수있는 :

int i = System.in.read(); 

내 질문은 ...이 방법이 구현되는 경우는? 어떻게 된거야? 어쩌면 이상한 질문이지만 후드 아래에서 무슨 일이 일어나고 있는지, 그리고 InputStream 클래스의 객체를 사용하고 하위 클래스가 아닌 객체를 사용하고 있기 때문에 실제 메소드가 구현 된 곳과 작동하는 이유가 궁금합니다. ..

답변

1

InputStream은 유형이 System.in이고 클래스가 아닙니다 (InputStream은 추상적이므로 직접 인스턴스화 할 수 없습니다). 가변 obj

Object obj = "123"; 

타입은 Object이지만 obj 의해 참조 된 인스턴스 String의 인스턴스이다

고려. toString()obj에 호출되면 String의 구현이 사용되고 Object의 구현이 사용되지 않습니다.

System.in에 대해서도 마찬가지입니다. 거기에 저장된 실제 인스턴스는 InputStream의 일부 서브 클래스가 될 것이고, 이는 임의의 추상 메소드의 구현을 갖습니다. System.in에 저장된 인스턴스의 클래스를 알고 싶으면 System.in.getClass()으로 호출 할 수 있습니다.

+0

쿨! 내 경우에는 그것은 BufferedInputStream이었다. 개념을 얻었다! 감사 :) –

2

System.in은 의 구현이며 구현 된 읽기 메소드가있는 InputStream입니다.

당신이 System의 소스를 살펴 경우 당신이 정말 FileInputStream이 (표준 입력 스트림입니다) 파일 핸들 0을 여는 볼 수 있습니다. 그러나 이것은 정말로 관련이 없습니다. 당신이 알아야 할 유일한 것은 당신이 그것을 읽을 수 있다는 것입니다. 해당 주소가 FileInputStream, StringInputStream 또는 기타 InputStream 인 경우 관련이 없습니다. 이것이 바로 인터페이스의 요점입니다. 대부분 특정 구현에 대해 걱정하지 않고 인터페이스에 대해 프로그램 할 수 있습니다.

+0

그래서 하나는 InputStream 클래스의 모두 서브 클래스와 구현 방법을 가지고있다 말할 것이다 그때 구현? –

+2

'System.in'은 아무 것도 구현하지 않습니다. 그것은'InputStream'을 확장하는 클래스의 객체의 인스턴스입니다. – Isaac

+0

아하 .. 실제 클래스 자체는 InputStream이 아니며, InputStream을 확장 한 것일까 요? 알았다! 고마워 .. 죄송합니다 바보 같은 질문이 있다면 ... –

1

후드 아래의 상황은 System 클래스의 in 속성에 런타임에 클래스 X의 객체에 대한 참조가 할당되어 있습니다. 해당 클래스 XInputStream으로 확장되어 있으므로 read 메서드를 구현합니다.

X이 어떤 클래스인지는 확실하게 알 수 없습니다 (즉, 어디에도 지정되어 있지 않다는 의미). 아시다시피 확장이 InputStream입니다. 다른 JDK는 다른 클래스를 사용할 수 있습니다.

1

System.in.read() 란 무엇입니까?

1) System.in 반환 System.in.read(), 읽기 InputStream 클래스의 정적 방법이며 호출지고 있지만 우리의 마음에 오는 것을 먼저 static InputStream in

우리는 다음 InputStream 클래스를 여는 경우 우리는 it is an abstract class을 찾을 수 있습니다. 어떤 클래스에서 정적 메서드를 호출 할 수도 있습니다. 그러나 read method which is also abstract을 봅니다. 여기에서 우리의 첫 번째 가정 읽기 방법에 대한 n은 틀린 것으로 판명되었습니다.

그래서 장면 뒤에서 무슨 일이 벌어지고 있습니까? (JDK 종속 된)

System.in 우리 모두가 바이트 스트림 클래스를 알고의 InputStream가 확장되는 InputStream를 확장 InputStream class on runtime 즉 클래스의 인스턴스를 반환, 그래서 모든 클래스 확장의 InputStream 클래스가 될 수 있습니다. 지금 read method is called from the class which it actually extending InputStream.

당신은 항상 System.in.getClass()를 호출하여의 InputStream 클래스에 대해 제공되는 인스턴스를 확인하실 수 있습니다으로

관련 문제