Почему System.in объект ввода?

153
16 марта 2019, 05:30

Для чтения символа с клавиатуры достаточно вызвать метод System.in.read(), где System. in - объект ввода (с клавиатуры), дополняющий объект вывода System.out.

Давайте разберемся: System.in.read() - System это класс, in это переменная-константа, read() - это метод. Хотелось бы спросить почему в книге написано вот так:

Для чтения символа с клавиатуры достаточно вызвать метод System.in.read(), где System. in - объект ввода (с клавиатуры)

Почему System.in объект ввода? Почему не написано что за "входящий поток" отвечает константа in класса System, а написано что это объект ввода? Просто под объектом я представляю экземпляр класса, то есть аля:

System systemObj = new System();

Где systemObj является объектом. Можно по подробнее?

Answer 1

Любая переменная/поле в Java - это либо примитив, либо null, либо экземпляр какого-то класса. Третьего не дано. Очевидно, что System.in не является ни примитивом, ни null. Значит, это экземпляр какого-то класса.

Более точно, это экземпляр класса FileInputStream. Потому что в современных ОС потоки стандартного ввода-вывода ведут себя как предварительно открытые файлы. Создать аналогичный объект вы можете самостоятельно вот так:

InputStream myIn = new FileInputStream(FileDescriptor.in);
Answer 2

Потому что "входящий поток" - это тоже объект. Если открыть исходный код System, то можно увидеть, что in - это переменная типа InputStream. То есть в рантайме в ней хранится объект класса InputStream.

READ ALSO
Exception while invoking run java.lang.NullPointerException [дубликат]

Exception while invoking run java.lang.NullPointerException [дубликат]

На данный вопрос уже ответили:

168
Почему IntelliJ советует мне сделать методы package-private?

Почему IntelliJ советует мне сделать методы package-private?

В коде есть геттеры/сеттеры, IntelliJ все время выдает warning и пишет, что access can be private-packageНо если я сделаю доступ private, то у меня в коде будут ошибки

120
java - Использование массивов [закрыт]

java - Использование массивов [закрыт]

Нужно перемножить все числа с индексами в диапазоне от 20 до 30

149
Почему у меня не работают boundary timers (использую Activiti 6)?

Почему у меня не работают boundary timers (использую Activiti 6)?

Не срабатывают boundary timersИспользую Activiti 6

164