System.in - это статическое поле класса System. Это поле имеет тип InputStream. То есть это поле может содержать ссылку на объект любого класса-наследника InputStream.

Вопрос: Когда я пишу "System.in.read();", то метод какого объекта (какого класса-наследника InputStream) вызывается?

задан 23 Фев, 07:14

%D0%9C%D0%B0%D1%80%D0%B8%D1%8F00001's gravatar image

Мария00001
1
одобрено: 0%


Абстрактный класс InputStream содержит в себе абстрактный метод read():

public abstract int read() throws IOException;

В данном случае вызывается read() из in.

Где in в классе System инициализируется в приватном конструкторе:

public final static InputStream in = null

The "standard" input stream. This stream is already open and ready to supply input data. Typically this stream corresponds to keyboard input or another input source specified by the host environment or user.

и в дальнейшем в:

private static void initializeSystemClass(){
   FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
   setIn0(new BufferedInputStream(fdIn));`
}

Обратим внимание и на то, что:

private static native void setIn0(InputStream in);

он может изменять final поля и получается у нас in это BufferedInputStream.

А FileDescriptor:

public static final FileDescriptor in = standardStream(0);
}

A handle to the standard input stream. Usually, this file descriptor is not used directly, but rather via the input stream known as {@code System.in}.

Отвечая на вопрос: метод read() из класса BufferedInputStream.

Как-то так.. Вообще всегда можно посмотреть откуда ноги растут наведя мышку на интересующий метод и удерживая ctrl кликнуть по нему.. и покопаться в коде) Надеюсь помог)

ссылка

опубликован 29 Мар, 06:26

darkstone's gravatar image

darkstone
666
одобрено: 11%

изменено 29 Мар, 06:54

Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×10

Задан: 23 Фев, 07:14

Просмотров: 115 раз

Отредактирован: 29 Мар, 06:54