Java 进阶概览
与 java-fundamentals 分工;java 路线图定位。
Java 进阶概览
这一课你将能做到
- 说清 java-fundamentals 与本 track 的分工,并把自己的薄弱点对应到后面 11 课中的某一课
- 确认本机 JDK 21+ 环境,用一条命令跑通一个综合了 enum、record、switch 表达式、Stream 的示例程序
- 用「语言特性 → 工程能力 → 框架视野」三层结构给任意 Java 知识点定位,规划学完后的去向
为什么要学
学完 Java 语言基础,你已经会写类、用 List/Map、能跑 Maven 测试。但打开真实企业的 Spring Boot 项目,会立刻遇到一批基础课没讲透的东西:订单状态为什么用 enum 而不是字符串、接口返回为什么全是 record、线程池参数怎么定、为什么没有人手动 new Service()。
人话:基础课教会你「把话说完整」,本 track 教你「把话说得像企业代码」。同时,集合、并发、OOP 是 Java 面试的三大高频区,答案要练到能脱口而出。
本站实战栈是 Spring Boot + MySQL + Redis + Nginx,本 track 的例子尽量贴这个栈:枚举做订单状态、record 做 DTO、线程池模拟下游调用、DI 对应 Spring 的 @Autowired。学完直接衔接 Spring Boot 实战。
先建立图像
本 track 12 课分三层,自下而上:
┌─────────────── 框架视野 ───────────────┐
│ jva-web jva-quarkus │ ← 知道生态怎么选
├─────────────── 工程能力 ───────────────┤
│ jva-concurrency jva-di │ ← Web 服务的运行底座
├─────────────── 语言特性 ───────────────┤
│ jva-enums jva-collections jva-oop │
│ jva-methods jva-records jva-modules │ ← 企业代码的日常用语
└────────────────────────────────────────┘
jva-intro(本课)→ jva-practice(综合练习)
| 主题 | java-fundamentals | java-advanced-essentials(本课) |
|---|---|---|
| 语法、基本 OOP | ✅ 14 课 | 复习 + 深化 |
| List / Map 入门 | ✅ | Set、Queue、Deque 选型 |
| 枚举、Record、模块 | 不展开 | ✅ |
| 并发、DI、Quarkus | 不展开 | ✅ |
| Maven、IO、异常 | ✅ | 不重复 |
跟着做
步骤 1:确认环境
终端执行两条命令,确认 JDK 版本 ≥ 21:
java -version
mvn -version
java -version 输出形如 openjdk version "21.0.x"。Maven 暂时没装也不影响,本 track 示例都支持单文件运行,到 jva-practice 再补装 Maven 即可。
步骤 2:写一个「特性巡礼」程序
新建 FeatureTour.java,一次用到后面几课的主角——enum、record、switch 表达式、Stream:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class FeatureTour {
enum OrderStatus { WAIT_PAY, PAID, SHIPPED }
record Order(long id, String sku, int amount, OrderStatus status) {
Order {
if (amount <= 0) throw new IllegalArgumentException("amount 必须为正数");
}
boolean paid() {
return status == OrderStatus.PAID || status == OrderStatus.SHIPPED;
}
}
static String label(OrderStatus status) {
return switch (status) {
case WAIT_PAY -> "待支付";
case PAID -> "已支付";
case SHIPPED -> "已发货";
};
}
public static void main(String[] args) {
List<Order> orders = List.of(
new Order(1, "SKU-1001", 2, OrderStatus.PAID),
new Order(2, "SKU-1002", 1, OrderStatus.WAIT_PAY),
new Order(3, "SKU-1001", 3, OrderStatus.SHIPPED));
Map<String, Integer> sold = orders.stream()
.filter(Order::paid)
.collect(Collectors.groupingBy(Order::sku,
Collectors.summingInt(Order::amount)));
System.out.println("各 SKU 已售数量:" + sold);
orders.forEach(o -> System.out.println(o.id() + " -> " + label(o.status())));
}
}