Пройдем код:
Scanner sc = new Scanner(System.in)
java.util.Scanner.Scanner(InputStream)
конструктор вызывается, и у вас есть объект sc
типа Scanner
, который считывает из System.in
.
int c = 0;
Теперь у вас есть примитивный c
примитивного типа int
.
while(sc.hasNext()) { ... }
Цикл while
оценивает sc.hasNext()
, который true
. Согласно документации, sc.hasNext()
возвращает true
тогда и только тогда, когда на входе имеется еще один токен. В вашем случае это означает, что InputStream
открыт.
{... System.out.println(++c + " " + sc.nextLine()); ...}
sc.nextLine()
проблема. Предполагая, что вы не изменили System.in
, консоль/терминал заблокирует цикл (т. Е. Удерживайте цикл приостановленным), пока вы не дадите ему вход (введите текст и нажмите [ENTER]
).
Так, в целом:
Scanner::hasNext()
возвращает истину, если и только если это возможно, чтобы получить больше вход (если вы используете System.in
, это всегда будет правдой, пока вы не закроете сканер).
Если вы печатаете вход напрямую, вы не будете хранить никаких ссылок на него, и для него не будет выделено никакой памяти (если только Scanner.nextLine()
не хранит его).
Не могли бы вы еще раз объяснить, как while() цикл работает в этом коде? Я имею в виду, что я не мог понять, как hasNext() заблокировал while() – shiwchiz
Я обновил ответ, надеюсь, он объяснит лучше. – Berger