
for-each 循环(增强型 for 循环)在 java 中仅用于遍历集合或数组,它通过值传递获取每个元素的副本,因此对循环变量的赋值不会影响原数组;若需初始化或修改数组元素,必须使用传统 for 循环或 while 循环配合索引访问。
for-each 循环(增强型 for 循环)在 java 中仅用于遍历集合或数组,它通过值传递获取每个元素的副本,因此对循环变量的赋值不会影响原数组;若需初始化或修改数组元素,必须使用传统 for 循环或 while 循环配合索引访问。
在 Java 中,for-each 循环(也称增强型 for 循环)的设计初衷是简化遍历操作,而非支持就地修改。其底层机制决定了它无法直接更新数组或集合中的原始元素。
以你的代码为例:
int marks[] = new int[3];
for(int ele : marks) {
ele = sc.nextInt(); // ❌ 无效:ele 是 marks[i] 的临时副本
}这里 ele 并非数组元素的引用,而是每次迭代时从 marks[i] 复制出的一个独立 int 变量(基本类型按值传递)。你对 ele 的赋值仅修改了这个局部变量,而 marks[0]、marks[1]、marks[2] 始终保持默认初始值 0,因此最终输出为 0 0 0。
✅ 正确做法是使用基于索引的传统 for 循环,直接通过下标访问并修改数组元素:
立即学习“Java免费学习笔记(深入)”;
import java.util.Scanner;
public class JavaArrays {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] marks = new int[3];
// ✅ 正确:通过索引写入数组
for (int i = 0; i < marks.length; i++) {
marks[i] = sc.nextInt();
}
// ✅ 正确:for-each 仅用于安全读取
for (int ele : marks) {
System.out.print(ele + " ");
}
// 输出示例:23 45 100
}
}⚠️ 注意事项:
- for-each 对基本类型(如 int, double)和不可变对象(如 String)均无法实现“写入”,因其本质是值拷贝;
- 即使对引用类型数组(如 String[] arr),for-each 中修改 ele = new String("...") 也只会改变局部引用,不会替换 arr[i];
- 若要修改引用类型数组中对象的内部状态(如 list.add(...)),则需确保该对象本身可变且 ele 持有其有效引用——但这不适用于数组元素重赋值场景。
? 总结:
for-each = 只读遍历(safe & concise);
索引式 for / while = 读写皆可(flexible & necessary for initialization)。
牢记这一分工,能避免大量因误解语法语义导致的逻辑错误。


















