本课作品
制作九格快捷栏管理器
会创建和初始化数组;能用0到 length-1 的索引读取与替换元素;会选择普通 for 或增强 for 遍历;最终实现九格快捷栏的显示、替换、查找与空位统计。 前置背包:变量、循环、方法和作用域。数组像一排同类型箱子,每个格子都有从0开始的门牌号。
开始前:建议先完成第 12–14 课
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 字符 | 剑 | 包 | 火 | . | . | . | . | . | . |
长度9,合法索引0到8。一个点表示一个暂时没有物品的格子。
01 / 14
开始前:把示例放对地方
本章使用 JDK 21,不需要预览功能。每个普通示例都给出完整程序,按标注的文件名保存。多个示例各放在自己的文件夹,避免辅助类同名。
终端命令:把中文占位符替换成实际名称
javac -encoding UTF-8 示例文件名.java
java 示例类名类名区分大小写。完整挑战代码若分成多段,请按顺序接在同一个文件中,不要为续段另建类。运行核对只列程序输出;需要输入的地方另给输入序列。
02 / 14
九格快捷栏从零开始
管理员喊:“把火把放第一格!”程序员把它放进 slots[0]。管理员沉默三秒,决定先学习数组。
数组把一组相同类型的元素放在按索引排列的格子中。数组长度固定,每个元素通过索引访问。
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 字符 | 剑 | 包 | 火 | . | . | . | . | . | . |
这里用单个符号表示物品;共9格,索引0到8,长度为9。
带着四个问题出发
- 长度为9的数组,合法索引为什么是0到8?
- 新建 String 数组后,未放物品的格子是什么?
- 普通 for 和增强 for 分别适合什么任务?
- 怎样避免越界和 null 带来的错误?
03 / 14
数组是一排同类型箱子
String[] slots 表示一组字符串格子,new String[9] 创建九个位置。数组变量保存的是整排格子的引用。
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 字符 | 剑 | 包 | 火 | . | . | . | . | . | . |
这里用单个符号表示物品;共9格,索引0到8,长度为9。
L15Example02.java · 完整独立示例
public class L15Example02 {
public static void main(String[] args) {
String[] slots = {"剑", "面包", "火把"};
System.out.println(slots.length);
System.out.println(slots[0]);
System.out.println(slots[2]);
}
}运行结果
3
剑
火把04 / 14
创建数组和默认值
Java 会给新数组填默认值。String[] 的空格子是 null,它不是空字符串,也不是写着“空气”的字符串。
- int元素默认0
- double元素默认0.0
- boolean元素默认false
- 引用元素默认null
L15Example03.java · 完整独立示例
public class L15Example03 {
public static void main(String[] args) {
int[] counts = new int[2];
boolean[] locks = new boolean[2];
String[] slots = new String[9];
System.out.println(counts[0]);
System.out.println(locks[0]);
System.out.println(slots[0]);
}
}运行结果
0
false
null05 / 14
用索引读取和替换
索引放在方括号中。读取不会删除物品,赋值会替换该位置原来的元素。
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 字符 | 剑 | 包 | 火 | . | . | . | . | . | . |
这里用单个符号表示物品;共9格,索引0到8,长度为9。
L15Example04.java · 完整独立示例
public class L15Example04 {
public static void main(String[] args) {
String[] slots = new String[9];
slots[1] = "面包";
String before = slots[1];
slots[1] = "胡萝卜";
System.out.println(before + " -> " + slots[1]);
}
}运行结果
面包 -> 胡萝卜06 / 14
普通 for 逐格巡检
需要索引时使用普通 for。循环条件写 < length,因为最后一个合法位置是 length - 1。
- 开始i等于0
- 条件i小于length
- 读取访问slots[i]
- 更新i加1,继续巡检
L15Example05.java · 完整独立示例
public class L15Example05 {
public static void main(String[] args) {
String[] slots = {"剑", null, "火把"};
for (int i = 0; i < slots.length; i++) {
String text = slots[i] == null ? "空位" : slots[i];
System.out.println(i + ": " + text);
}
}
}运行结果
0: 剑
1: 空位
2: 火把07 / 14
增强 for 只看物品
只关心元素、不需要位置时,增强 for 更简洁。循环变量得到元素值,但不能用它直接替换数组格子。
- item本轮元素值的副本
- 读取适合逐件统计
- 重新赋值不会替换数组格子
- 替换元素需要slots[i]赋值
L15Example06.java · 完整独立示例
public class L15Example06 {
public static void main(String[] args) {
String[] slots = {"面包", "火把"};
for (String item : slots) { item = "钻石"; }
for (String item : slots) { System.out.println(item); }
}
}运行结果
面包
火把如何选择
- 需要索引或要替换格子:普通 for。
- 只读取每个元素:增强 for。
- 需要同时访问前后元素:普通 for 更合适。
08 / 14
统计总数平均值最大值
数组与循环组合后,可以一次处理整组数据。最大值算法先用第一个元素初始化,避免随便猜一个起点。
- total各格数量相加
- average转为小数再除长度
- maximum从第一个元素开始
- 空数组先检查再访问与除法
L15Example07.java · 完整独立示例
public class L15Example07 {
public static void main(String[] args) {
int[] counts = {3, 12, 7, 18, 5};
int total = 0, maximum = counts[0];
for (int count : counts) {
total += count;
maximum = Math.max(maximum, count);
}
double average = (double) total / counts.length;
System.out.println(total + "," + average + "," + maximum);
}
}运行结果
45,9.0,1809 / 14
搜索物品和计算空位
搜索数组时,先处理 null,再调用字符串方法。找到后是否继续,取决于你要找第一处还是统计全部。
- find返回首个索引或-1
- 空位本课程统一使用null
- 比较非null目标调用equals
- 空位数逐格计数
L15Example08.java · 完整独立示例
public class L15Example08 {
static int find(String[] slots, String target) {
if (target == null) return -1;
for (int i = 0; i < slots.length; i++)
if (target.equals(slots[i])) return i;
return -1;
}
static int emptyCount(String[] slots) {
int result = 0;
for (String item : slots) if (item == null) result++;
return result;
}
public static void main(String[] args) {
String[] slots = {"剑", null, "火把", null};
System.out.println(find(slots, "火把"));
System.out.println(find(slots, "钻石"));
System.out.println(emptyCount(slots));
}
}运行结果
2
-1
210 / 14
数组故障诊所
ArrayIndexOutOfBoundsException 通常表示索引越界;NullPointerException 常表示对 null 调用了方法。两者修法不同。
- 越界索引length不合法
- 错误边界小于等于会多走一格
- null数组不能读取length
- 空数组长度0,但不是null
BadIndex.java · 故意错误示例
public class BadIndex {
public static void main(String[] args) {
int[] counts = new int[3];
System.out.println(counts[counts.length]);
}
}BadArrayNull.java · 故意错误示例
public class BadArrayNull {
public static void main(String[] args) {
String[] slots = null;
System.out.println(slots.length);
}
}急诊顺序
- 读异常名称和第一条属于自己代码的行。
- 打印 index、length 和当前元素。
- 索引用 < length,引用使用前检查 null。
11 / 14
挑战 蓝图 九格快捷栏
挑战 类叫 HotbarManager。快捷栏固定九格,初始物品放在0、1、2和8号位置。
- show逐格显示
- replace先检查索引和物品
- find查找首个匹配
- emptyCount统计null格子
验收顺序
- 先显示初始快捷栏。
- 把1号位从面包替换成金胡萝卜。
- 查找火把,应返回8。
- 统计空位,应返回5。
- 尝试索引9,程序不得崩溃。
| 功能 | 输入 | 输出或效果 |
|---|---|---|
| show | 数组 | 逐格显示0到8 |
| replace | 数组 索引 新物品 | 合法时替换并返回true |
| find | 数组 物品名 | 返回首个索引或-1 |
| emptyCount | 数组 | 返回 null 格子数 |
12 / 14
挑战 实现 显示替换统计
新建 HotbarManager.java。完整程序使用普通 for 显示索引,使用增强 for 统计空位。
- 初始状态显示全部九格
- 替换将1号格换为胡萝卜
- 查找火把在索引2
- 空位共有5个
HotbarManager.java · 完整独立示例
public class HotbarManager {
static void show(String[] slots) {
for (int i = 0; i < slots.length; i++) {
String text = slots[i] == null ? "空位" : slots[i];
System.out.println(i + ": " + text);
}
}
static boolean replace(String[] slots, int index, String item) {
if (index < 0 || index >= slots.length
|| item == null || item.isBlank()) return false;
slots[index] = item;
return true;
}
static int find(String[] slots, String target) {
if (target == null) return -1;
for (int i = 0; i < slots.length; i++)
if (target.equals(slots[i])) return i;
return -1;
}
static int emptyCount(String[] slots) {
int result = 0;
for (String item : slots) if (item == null) result++;
return result;
}
public static void main(String[] args) {
String[] slots = new String[9];
slots[0] = "铁剑"; slots[1] = "面包";
slots[2] = "火把"; slots[8] = "地图";
show(slots);
System.out.println(replace(slots, 1, "胡萝卜"));
System.out.println("修改后的1号格:" + slots[1]);
System.out.println("火把索引:" + find(slots, "火把"));
System.out.println("空位:" + emptyCount(slots));
}
}运行结果
0: 铁剑
1: 面包
2: 火把
3: 空位
4: 空位
5: 空位
6: 空位
7: 空位
8: 地图
true
修改后的1号格:胡萝卜
火把索引:2
空位:513 / 14
拓展任务与阶段复盘
这是基础语法阶段最后一课。第16课会把变量、条件、循环、方法和数组合成“背包管理员”项目。
- 木镐矿石数组逐格显示
- 铁镐统计一周采集量
- 钻石镐实现循环移位
- 复盘测试长度0与1
三档作业
- 木镐:把六种矿石放进 String 数组并逐项打印索引和名称。
- 铁镐:用 int 数组记录一周七天的挖矿数量,输出总数、平均值和最大值。
- 钻石镐:实现快捷栏向右轮换一格,最后一格回到0号位。
| 自评 | 能 | 还要练 |
|---|---|---|
| 我能说出合法索引范围 | □ | □ |
| 我会选择两种 for | □ | □ |
| 我能处理越界和 null | □ | □ |
14 / 14
自己的验收记录
运行之前写预期,运行之后记录实际结果。正常案例说明程序会做事;边界案例说明它知道何时停;错误案例说明它能拒绝不合理的请求。
| 类别 | 你选择的输入 | 预期与实际 |
|---|---|---|
| 正常 | 一个常用值或一次成功操作 | 是否逐行一致? |
| 边界 | 最小值、最大值及相邻值 | 有没有少一格、多一步? |
| 错误 | 非法数量、缺失对象或错误语法 | 是否明确拒绝?状态是否保持? |
- 把一个 Bug 写成:触发条件、现象、原因、最小修复。
- 整理一个值得记住的规则,用自己的话解释,不能只复制定义。
- 改变一个示例,保留测试记录,让结果证明你的理解。
TAKE IT WITH YOU
下载本课 PDF
完整课文、代码、图解与练习,选择你需要的语言。