正在加载...

Java 中的 Records

用 record 声明紧凑数据类型并读取其组件。在 Card.java 中保留 package-private 的 record Tag(String name) {}、public 类 Card,构造 Tag t = new Tag("oak"); 并打印 t.name()。用 javac Card.java 编译,运行 java Card。屏幕应显示 oak。第二个演示增加 int 组件,屏幕依次显示 oak、3。把可选 JUnit 留给下一页。本课是带 accessor 的 record,不是 Streams 管道,也不是 Lambda forEach 遍历。

一个组件,一个 accessor

打开 Card.java。public 类名保持 Card。若遗留的 Pipe streams 演示、Cue lambda 打印、Bin 泛型列表或 Box Scanner 提示遮住 records 主线,请删掉它们。程序不能等待键盘输入,也不能启动 stream 管道。
在 public 类上方声明 record:
record Tag(String name) {}
在 Card.main 内构造一个实例并打印 accessor:
Tag t = new Tag("oak");
System.out.println(t.name());
record 头部在括号中列出组件。Java 为该组件生成构造器与 accessor name()。屏幕显示 oak。

Card record Tag prints oak

java
record Tag(String name) {}

public class Card {
    public static void main(String[] args) {
        Tag t = new Tag("oak");
        System.out.println(t.name());
    }
}

在含 Card.java 的文件夹中运行 javac Card.java。括号配对正确时,javac 本身不输出一行。再运行 java Card — 不是 java Card.java,也不是 java Tag。只保留一个 public 类,使运行名与 Card 一致。record Tag 与同文件内保持 package-private。
跟踪运行一次。Java 从 Card.main 开始。new Tag("oak") 保存组件。t.name() 返回 "oak"。println 写出 oak。没有任何地方调用 stream() 或 forEach,也不读 args[0]。
盯着屏幕时说出初学者规则:record 命名类型及其组件;accessor 与组件名一致;用 new 构造。不要在本页发明 JUnit 演示。JUnit 在下一可选课等待。不要用满手写 getter 的长类替换教学文件中的 record — 保留 record 头部。
若仍从遗留 Pipe streams 文件看到 OAK 再 PINE,请切换到 Card 并保留 t.name()。若 javac 抱怨两个 public 类型,只让 Card 为 public,record Tag 不要 public。

两个组件,两次打印

继续用 public 类 Card。把 record 扩成两个组件:
record Tag(String name, int n) {}
Tag t = new Tag("oak", 3);
System.out.println(t.name());
System.out.println(t.n());
再次 javac Card.java 编译并 java Card 运行。屏幕先 oak 再 3。每个组件有同名 accessor。头部顺序与构造器参数一致。

Card record Tag prints oak then 3

java
record Tag(String name, int n) {}

public class Card {
    public static void main(String[] args) {
        Tag t = new Tag("oak", 3);
        System.out.println(t.name());
        System.out.println(t.n());
    }
}

再跟踪运行一次。name() 返回 "oak"。n() 返回 3。把两个演示当作两种教学形状:先证明单组件,再证明双组件。两种形状都在 public Card 旁共享 package-private record。
若交换构造器参数,值会落入错误组件。教学文件中保持 "oak" 在前、3 在后。

Record 习惯

练习时把紧凑头部与 accessor 放在一起。

📊 Card 的 record 习惯

习惯 形状 初学者检查
声明 record Tag(String name) {} 组件写在头部
构造 new Tag("oak") 参数顺序与组件一致
读取 t.name() accessor 名与组件一致
双字段 record Tag(String name, int n) {} 每组件有 accessor
Public 类 public class Card 用 java Card 运行,不是 java Tag

Records 不是 Streams,也不是 JUnit

Streams 在管道里过滤、映射列表值。Records 在紧凑类型里保存固定组件集。JUnit 会在更后的可选页用测试检查行为。今天不要把这三种职责混进同一个入门文件。
此处的 oak 是 record 组件值,经 name() 返回;不是 stream filter 结果,也不是单独的 Lambda forEach 访问。若遗留 Pipe 文件仍打印大写映射词,把它当历史,保留 Card 的 t.name() 行。
没有 record 关键字,本页紧凑头部就不存在。构造参数不匹配时 javac 会拒绝调用。每次演示都让头部与 new 行对齐。即使你在可选路径里见过测试标题,也把 JUnit 注解留到那课再说。优先短 record 形状,使每次细读教学文件时屏幕仍与 name()、n() 对齐。

JUnit 前的文件夹检查

编译成功后列出文件夹。应同时看到 Card.java 与 Card.class,通常还有 record 的 Tag.class。改源码、保存,运行 javac Card.java,再 java Card。添加 n 后若跳过编译,陈旧 .class 可能仍显示旧的一行屏幕。
若 javac 抱怨重复 public 类,只保留 Card 为 public。若屏幕是 Tag[oak] 而非 oak,说明打印了整个 record — 教学打印保持 t.name()。若无输出,确认 main 仍调用 println。
不要把 Pipe 的 stream().map 贴进 Card。不要用 Cue 的 forEach 替换 record 故事。可选 records 作业是带 accessor 的紧凑类型。

可选 JUnit 之前

你可以保留 record Tag(String name) {},构造 new Tag("oak"),用 t.name() 打出 oak;再用 record Tag(String name, int n) {} 打出 oak 与 3。编译 javac Card.java,运行 java Card。表格区分声明、构造与读取。下一可选页是 JUnit。
为清晰的 records 一对,保留 Card 演示。练 records 时把 Pipe streams 文件留在此页外。练 records 时把 Cue lambda 文件留在此页外。JUnit 工作留到那课再做。这些习惯是继续前的检查点。单字段屏幕是 oak,或双字段屏幕是 oak 再 3,则 Records 完成了本课任务;若你走可选路径,已可接 JUnit。
最后在文件夹再过一遍:一个 public Card、package-private record Tag、匹配的构造参数、accessor 打印、无 Scanner 等待、无需 stream 管道。在你打开的那份演示上再运行一次 javac Card.java 与 java Card。若屏幕仍是 oak 或 oak 再 3,Records 形状稳固,课程可进入下一页可选 JUnit。每次阅读只强调一条清晰 record 习惯,让每遍读到同一张地图。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部