← Java 基础教程

第 2 / 40 课 · 免费教程

背包里的变量盒子

给数据一个名字,追踪一次小小的冒险

90 分钟Java 11+入门

本课作品

制作会变化的控制台玩家状态栏

欢迎屏里的玩家名一直写死成 Alex。如果来了另一位玩家,每处名字都要重新找一遍。变量给了我们更好的办法:把数据放在有名字的位置,读取它,也更新它。这一课要弄明白的,不只是“怎么写变量”,还有“它在这一刻究竟保存了什么”。

开始前:建议先完成第 1 课

01 / 10

标签帮我们找到当前的值

储藏室靠标签找物品;程序靠变量名读取数据。
储藏室靠标签找物品;程序靠变量名读取数据。

史蒂夫把面包放进没有标签的箱子,晚饭时间却打开了圆石箱。变量名解决的是类似问题:让程序找到需要的数据。它不是数据本身,而是访问数据的名字。

先从两种类型开始:int 保存整数,String 保存文字。生命值、物品数量适合整数;玩家名适合文字。更多类型下一课再展开。

02 / 10

声明、初始化、读取

读懂 int health = 20;
  1. int类型 · 保存整数
  2. health变量名 · 找到当前的值
  3. =赋值号 · 把右侧值写入
  4. 20初始值 · 第一次存入的值
  5. ;分号 · 结束本条语句

完整程序 · PlayerStatus.java

public class PlayerStatus {
    public static void main(String[] args) {
        String playerName = "Alex";
        int health = 20;
        int bread = 3;
        System.out.println(playerName + " 生命=" + health);
        System.out.println("面包=" + bread);
    }
}

运行结果

Alex 生命=20
面包=3

health 不加引号时,读取变量的值;"health" 加上引号后,只是一段固定文字。把玩家名改成 Steve、面包改成5,先猜两行输出,再运行。

03 / 10

赋值:先算右边,再写左边

赋值像一次搬运:先准备好结果,再放回指定位置。
赋值像一次搬运:先准备好结果,再放回指定位置。
bread = bread - 1 的三个动作
  1. 读取旧值bread 是 3
  2. 计算右侧3 - 1 得到 2
  3. 写回左侧bread 变成 2

片段:放在 main 中,单独运行

int bread = 3;
System.out.println("吃之前=" + bread);
bread = bread - 1;
System.out.println("吃之后=" + bread);
int diamonds = 0;
diamonds = diamonds + 3;
System.out.println("钻石=" + diamonds);

运行结果

吃之前=3
吃之后=2
钻石=3

04 / 10

一次输出,就是一张快照

名字不等于内容:四项当前数据
变量名类型当前值
playerNameString"Alex"
healthint20
breadint3
diamondCountint0

先前输出的那一行文字不会跟着变量变动。想展示新状态,要再次输出。重新运行程序时,初始化语句也会重新执行。

片段:放在 main 中,单独运行

int chestA = 5;
int chestB = chestA;
chestA = 9;
System.out.println("A=" + chestA);
System.out.println("B=" + chestB);

运行结果

A=9
B=5

05 / 10

沿着时间线更新生命值

同一变量,四个时刻
  1. 出生health = 20
  2. 受伤health - 4
    得到 16
  3. 进食health + 3
    得到 19
  4. 恢复初值health = 20

片段:放在 main 中,单独运行

int health = 20;
System.out.println("出生=" + health);
health = health - 4;
System.out.println("受伤=" + health);
health = health + 3;
System.out.println("进食=" + health);
health = 20;
System.out.println("恢复初值=" + health);
int arrows = 10;
arrows += 5;
arrows -= 2;
System.out.println("箭=" + arrows);

运行结果

出生=20
受伤=16
进食=19
恢复初值=20
箭=13

06 / 10

好名字让代码自己解释自己

给命名路牌做一次检查
例子判断
playerName清楚,使用 camelCase
diamondCount说明这是钻石数量
2player错误:不能以数字开头
player health错误:名字不能有空格
class错误:这是 Java 关键字
x可以运行,但用途不清楚

初学时,建议小写英文字母开头,多个单词使用 camelCase:第一个单词小写,后续单词首字母大写。Java 区分大小写,health 和 Health 不是同一个名字。

片段:放在 main 中,单独运行

int playerLevel = 8;
int torchCount = 24;
String petName = "Snow";
System.out.println(playerLevel + " / " + torchCount);
System.out.println(petName);

运行结果

8 / 24
Snow

07 / 10

变量排错:先分清是哪一种问题

检查一个原因,再观察结果,比把整座建筑拆掉更有效。
检查一个原因,再观察结果,比把整座建筑拆掉更有效。

故意写错:三个不同的问题

int 2player = 10;
int bread = 3;
int bread = 2;
int diamonds;
System.out.println(diamonds);
  • 2player 以数字开头,改成 playerLevel。
  • 同一作用域重复声明 bread:更新时去掉第二个 int。
  • 局部变量 diamonds 还没有值:读取前明确赋值。

片段:放在 main 中,单独运行

int playerLevel = 10;
int bread = 3;
bread = 2;
int diamonds = 0;
System.out.println(playerLevel + " / " + bread + " / " + diamonds);

运行结果

10 / 2 / 0

08 / 10

设计会变化的玩家状态栏

同一次冒险里,事件改变数据;新的输出记录改变后的状态。
同一次冒险里,事件改变数据;新的输出记录改变后的状态。
先画出状态栏的工作路线
  1. 创建变量名字、生命
    面包、钻石
  2. 出生快照先输出初始值
  3. 事件更新受伤、补给
    与挖矿
  4. 再次输出核对新数值

这次作品不需要输入、循环或条件判断。只用已经学过的声明、赋值和输出,就能观察数据随事件变化。每一次更新前,先把预期值写在纸上。

  • 出生:生命20、面包3、钻石0。
  • 受伤:生命减4,其余不变。
  • 补给与挖矿:生命加3、面包减1、钻石加3。

09 / 10

完整作品与输出核对

完整程序 · AdventureStatus.java

public class AdventureStatus {
    public static void main(String[] args) {
        String playerName = "Alex";
        int health = 20;
        int bread = 3;
        int diamondCount = 0;
        System.out.println("出生 | " + playerName
            + " | 生命=" + health + " | 面包=" + bread
            + " | 钻石=" + diamondCount);
        health = health - 4;
        System.out.println("受伤 | " + playerName
            + " | 生命=" + health + " | 面包=" + bread
            + " | 钻石=" + diamondCount);
        health = health + 3;
        bread = bread - 1;
        diamondCount = diamondCount + 3;
        System.out.println("补给与挖矿 | " + playerName
            + " | 生命=" + health + " | 面包=" + bread
            + " | 钻石=" + diamondCount);
    }
}

运行结果

出生 | Alex | 生命=20 | 面包=3 | 钻石=0
受伤 | Alex | 生命=16 | 面包=3 | 钻石=0
补给与挖矿 | Alex | 生命=19 | 面包=2 | 钻石=3

10 / 10

带着预测继续练习

宠物狼也可以拥有自己的状态记录:名字、生命和物品数量。
宠物狼也可以拥有自己的状态记录:名字、生命和物品数量。
第二课的能力地图
  1. 声明类型与名字
  2. 初始化第一次赋值
  3. 读取当前的值
  4. 更新计算再写回
  5. 解释比较前后快照

任选一个任务

  • 基础:声明五种物品数量,输出一张背包清单。
  • 进阶:铁锭从0开始,获得8个、用掉3个、再得到2个;三次输出应为8、5、7。
  • 创造:设计宠物狼状态栏,模拟喂食和消耗骨头。

选学:两个箱子交换内容

片段:放在 main 中,单独运行

int leftChest = 12, rightChest = 30;
int temporary = leftChest;
leftChest = rightChest;
rightChest = temporary;
System.out.println(leftChest + " / " + rightChest);

运行结果

30 / 12

temporary 先保住原来的12。下一课会让我们认识更多类型,并解释为什么整数、小数、真假和文字不能随意混装。

TAKE IT WITH YOU

下载本课 PDF

完整课文、代码、图解与练习,选择你需要的语言。