Это потому, что метод println()
объявлен как void
. Когда вы оцениваете выражение в режиме отладки, оно генерирует буквальное значение из результата выражения. Таким образом, когда вы оцениваете выражение System.out.println(a[i])
, вы действительно указываете отладчику распечатать содержимое возвращаемого значения метода, которое оказывается void
. Случается так, что внутри метода выполняется дополнительный вызов метода println(int)
, что делает фактическое вычисленное выражение по существу эквивалентным этому puedocode System.out.println(System.out.println(a[i]))
(хотя, конечно, в действительности Java не воспринимает void
как истинный тип, поэтому вы не сможете выполнить код, как написано).
JavaDoc для метода PrintStream.println(int)
доступен здесь (для Java 9), и вы можете просмотреть исходный код метода здесь (из OpenJDK JDK версии 8u40-b25 он же Java 8).
Рассмотрим следующие методы:
void evaluatesToVoid(){
final int[] a = {1,1};
for(int i = 0; i < a.length; ++i) {
System.out.println(a[i]);
}
return;
}
int evaluatesToSeven(){
return 7;
}
Когда вы оцениваете вызов метода, который возвращает допустимый тип возврата, например, тип примитива int
, вы получите возвращаемое значение метода.
При использовании оценки и входа в систему evaluatesToVoid()
выведет это:
void
1
1
При использовании оценки и входа в систему evaluatesToSeven()
напечатает это:
7