The reason is that the language has made an allowance for it. While it may represent the two objects differently, the sequence of iteration is the same - and the effect is transparent to you.
...Otherwise, the Expression necessarily has an array type, T[]
.
Let L1 ... Lm be the (possibly empty) sequence of labels immediately
preceding the enhanced for statement.
The enhanced for statement is equivalent to a basic for statement of
the form:
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
VariableModifiersopt TargetType Identifier = #a[#i];
Statement
}
#a
and #i
are automatically generated identifiers that are
distinct from any other identifiers (automatically generated or
otherwise) that are in scope at the point where the enhanced for
statement occurs.
TargetType is the type of the loop variable as denoted by the Type
that appears in the FormalParameter followed by any bracket pairs that
follow the Identifier in the FormalParameter (§10.2).