В первом фрагменте кода переменная j сбрасывается в 0 каждый раз, когда код выходит и перезапускает этот внутренний l oop. Во втором фрагменте кода этого не происходит. Шаг за шагом посмотрим, что хранят переменные, может быть полезно. Я добавил следующую строку во внутреннюю l oop и закомментировал пользовательский раздел ввода для целей отладки:
System.out.println("( " + i + " " + j + ")");
В первом примере это печатает:
( 0 0)
( 0 1)
( 0 2)
( 0 3)
( 0 4)
( 1 0)
( 1 1)
( 1 2)
( 1 3)
( 1 4)
( 2 0)
( 2 1)
( 2 2)
( 2 3)
( 2 4)
( 3 0)
( 3 1)
( 3 2)
( 3 3)
( 3 4)
( 4 0)
( 4 1)
( 4 2)
( 4 3)
( 4 4)
Однако для второго примера он печатает:
( 0 0)
( 0 1)
( 0 2)
( 0 3)
( 0 4)
По существу, во втором примере j не сбрасывается для каждой итерации внешнего l oop. Если вы добавите больше операторов печати в других местах, например, внутри внешнего l oop, но не во внутреннем, область видимости станет еще более ясной. Важно отметить, что внешний l oop все еще выполняется 5 раз, у нас просто нет никаких доказательств этого, поскольку оператор print становится недоступным после первого прохода через внутренний l oop.