Почему Java System.in.read() может вызывать не статический метод

В java класс java.lang.System, который имеет статическую переменную in.
Объявлено как: public static final InputStream in
Это означает, что in является переменной InputStream.
Однако я вижу пример использования System.in.read() для чтения ввода.



Как это сделать, метод read() в InputStream не является статическим методом, как его можно вызвать напрямую? Насколько я понимаю, только статический метод может вызываться непосредственно классом без создания экземпляра.


объявление read(): public abstract int read() throws IOException


Спасибо Jon Skeet за ответ, я все еще кое-что не понимаю.

Если я вызываю System.in.read(), что означает, что я вызываю метод класса InputStream read()?

java.lang.System.in -----> java.io.InputStream ----> read()
  1. вызов java.lang.System.in (который является статической переменной), это переменная java.io.InputStream
  2. Вызов действует как вызов класса PrintStream.
  3. Процесс работает как вызов: PrintStream.read()
  4. однако мне трудно понять метод read(), который не является статическим методом, так как его не следует вызывать напрямую.
  5. Это должно быть вызвано как:

    PrintStream rd = новый PrintStream(); int c = rd.read();

поскольку read() должен вызываться экземпляром. Объявление read(): public abstract int read() выдает исключение IOException

PS: пробую этот код не работает:

InputStream rd = new InputStream();
        int c = rd.read();
        System.out.println(c);

Но не знаю почему.

ссылка: http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html


person loadload    schedule 18.08.2013    source источник


Ответы (1)


Как это сделать, метод read() в InputStream не является статическим методом, как его можно вызвать напрямую?

Вы вызываете его для экземпляра InputStream через статическую переменную in. Итак, это:

int c = System.in.read();

эквивалентно:

InputStream stream = System.in;
int c = stream.read();

Это поможет прояснить ситуацию?

person Jon Skeet    schedule 18.08.2013
comment
Спасибо Jon Skeet за ответ, я все еще кое-что не понимаю. - person loadload; 18.08.2013
comment
@loadload: Ну, не уточняя, что это за пункт, я не думаю, что (или кто-либо другой) могу вам помочь. - person Jon Skeet; 18.08.2013
comment
Если я вызываю System.in.read(), это означает, что я вызываю метод класса InputStream read()? java.lang.System.in -----> java.io.InputStream ----> read() .InputStream переменная 2. Вызов действует как вызов класса PrintStream. 3. Процесс работает как вызов: PrintStream.read() 4. однако мне трудно понять метод read(), который не является статическим методом, так как его не следует вызывать напрямую. - person loadload; 18.08.2013
comment
5. Это должно вызываться так: PrintStream rd = new PrintStream(); int c = rd.read(); поскольку read() должен вызываться экземпляром. объявление read(): public abstract int read() выдает IOException PS: я пробовал, этот код не работает: InputStream rd = new InputStream(); int c = rd.read(); Система.out.println(c); Но не знаю почему. - person loadload; 18.08.2013
comment
Я отредактировал свой вопрос, так как в комментарии я не знаю, как форматировать код. - person loadload; 18.08.2013
comment
@loadload: Ваш отредактированный вопрос предполагает, что вы вообще не читали мой ответ. Он не действует как InputStream.read() — он действует как вызов read() для значения, которое было считано из переменной. (Вы не вызываете переменную — вы читаете ее или записываете.) И вы не можете так вызывать new InputStream(), потому что это абстрактный класс. Это все довольно основные моменты — я подозреваю, что вам следует перечитать любую книгу, из которой вы изучаете Java, поскольку Stack Overflow не очень хорош для введения концепций с нуля. - person Jon Skeet; 18.08.2013
comment
@loadload: Непонятно, откуда вы взяли, что PrintStream замешан. System.in имеет тип InputStream, а не PrintStream. - person Jon Skeet; 18.08.2013
comment
Джон Скит, Большое спасибо за ваше объяснение, мне нужно время, чтобы переварить его, и я перечитаю учебник. Еще раз большое спасибо. - person loadload; 18.08.2013