Java 中的 for-each
把三个整数放进名为 slots 的数组:2,然后 4,然后 6。写下 for (int n : slots),并在花括号里打印 n。屏幕应显示三行:2,然后 4,然后 6。本页你不写索引计数器。每一轮把数组里的下一个值交给名字 n。本页要教的,就是这种遍历。
数组里每个值各有一个名字
创建一个名为 Pack.java 的小程序文件。第一行的 public class 必须与文件名一致:public class Pack。不要在这个文件里留下旧的 Skip 或 Pulse 类名;编译器要求类名与文件名一致。
在 main 里先存好数组:
int[] slots = {2, 4, 6};
这一行什么都不打印。它只是把三个整数保存在名字 slots 下面。然后是 for-each 循环:
for (int n : slots) {
System.out.println(n);
}
for 这个词仍然小写。圆括号里有三部分,中间是冒号:类型 int、一个元素的名字 n、然后冒号、然后数组名 slots。这个冒号不是 case 标签,也不是路径分隔符。它表示「slots 里的每个值都进到 n。」花括号包住循环体。System.out.println(n); 写出当前值,n 周围不加引号。编译前先保存文件。
打印 2 然后 4 然后 6 的程序
这是你先编译的版本。
public class Pack {
public static void main(String[] args) {
int[] slots = {2, 4, 6};
for (int n : slots) {
System.out.println(n);
}
}
}
在存放 Pack.java 的文件夹里运行 javac Pack.java。当圆括号、花括号和冒号都匹配时,javac 自己不写任何一行。然后运行 java Pack——不要写成 java Pack.java。第二条命令去掉 .java 结尾。这两条命令在 Windows 和 macOS 上同样可用;本页不为任一系统另写外壳拼法。程序应打印三行后停下:2,然后 4,然后 6。它不会等你输入。若终端在等键盘输入,文件里还留着旧练习的 nextLine 调用。删掉那个调用,只保留上面的数组和 for-each。屏幕上一行不对,并不等于你需要重装 JDK。
按顺序走完一次完整运行。slots 存着 2,然后 4,然后 6。第一轮把 n 设为 2,println 写出 2。第二轮把 n 设为 4 并写出 4。第三轮把 n 设为 6 并写出 6。之后没有更多值,循环结束。本页你没有写 int i = 0,也没有写 i < slots.length。for-each 头部让 Java 把每个已存的值访问一次。名字 n 在每一轮「新」只是因为它持有下一个元素;你仍在头部只声明一次 int n。
用同样方式遍历 String 数组
改掉存放的数组和元素类型,让每个值都是一个短词:
String[] tags = {"red", "blue"};
for (String t : tags) {
System.out.println(t);
}
现在屏幕应显示两行:red,然后 blue。冒号仍在元素类型与数组名之间。循环体仍打印那个持有一个元素的名字。
public class Pack {
public static void main(String[] args) {
String[] tags = {"red", "blue"};
for (String t : tags) {
System.out.println(t);
}
}
}
再次编译并运行:javac Pack.java,然后 java Pack。你应看到两行。你把 int 数组换成了 String 数组,并把元素名字的类型与 String 对齐。看到 red 和 blue 之后,可以把 int 演示放回去。两个版本都是合法的 Java。它们用不同的元素种类教同一种 for-each 形状。
再读一遍 String 这次运行。tags 存着 red,然后 blue。第一轮把 t 设为 red 并打印。第二轮把 t 设为 blue 并打印。然后循环结束。数组字面量里的引号标出存在数组里的文字。println(t) 在 t 周围不加额外引号,就把那些已存字母写到屏幕上。
让 for-each 保持清楚的规则
圆括号里必须按顺序放类型、名字、冒号和数组名。写成没有冒号的 for (int n slots) 会让 javac 报错。元素类型必须与数组匹配:int 配 int 数组,String 配 String 数组。把 int n 放在 String[] 旁边,不是本课能编译的形状。循环体有一行或多行时,花括号仍包住循环体。
for-each 不是 Beat 页上的计数 for,也不是 Skip 页上的 break。计数 for 用计数器写起点、条件和步进。for-each 遍历已经存在数组里的值。break 会提前结束循环;本页第一个演示打印每一个值。不要在同一个 main 里留下 Skip 页的 break 演示或 Pulse 页的 while,然后奇怪为什么屏幕显示 1 和 2 而不是 2、4、6。本会话的 main 应只放数组和 for-each。
常见混淆是打印语法本身:System.out.println("for (int n : slots)");。那会写出头部的字符。它并不遍历数组。另一种混淆是带引号的 System.out.println("n");,每一轮打印字母 n,而不是 2、4 和 6。当你要在屏幕上看到元素值时,保持 println(n) 不加引号。
如果数组没有元素——例如 int[] slots = {};——循环体一次都不会运行,屏幕保持空白。这仍然是合法的 for-each;本课的演示至少保留两个值,好让你看到打印行。以后若需要在屏幕上看到索引号,计数 for 会回来;for-each 用来访问值,而不必自己管理那个索引。在循环里用 n = 9; 改值,在这种入门形状下不会重写数组槽位——把 n 当作你读来打印的值,而不是编辑 slots 的工具。
你现在能做什么
你可以存放一个数组,写出 for (Type name : arrayName),并打印每个值一次。元素类型与数组匹配,循环才能继续编译。下一页是 methods:你把若干行归在一个可从 main 调用的名字下面。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部