第 9 章:枚举与内部类
学习目标
- 掌握 enum 的基本用法和高级特性
- 了解内部类的使用场景
一、枚举(enum)
枚举 = 一组固定常量的集合(如季节、订单状态)。
java
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
Season s = Season.SUMMER;
System.out.println(s); // SUMMER
System.out.println(Season.values().length); // 4带字段和方法的枚举
java
public enum OrderStatus {
/**
* // 背后实际执行的过程(伪代码)
* PENDING = new OrderStatus(0, "待支付"); // this.code = 0, this.desc = "待支付"
* PAID = new OrderStatus(1, "已支付"); // this.code = 1, this.desc = "已支付"
* SHIPPED = new OrderStatus(2, "已发货"); // this.code = 2, this.desc = "已发货"
* DONE = new OrderStatus(3, "已完成"); // this.code = 3, this.desc = "已完成"
*/
PENDING(0, "待支付"),
PAID(1, "已支付"),
SHIPPED(2, "已发货"),
DONE(3, "已完成");
private final int code; // 每个状态对应一个 code
private final String desc;
OrderStatus(int code, String desc) { // 枚举的构造器默认 private
this.code = code;
this.desc = desc;
}
public int getCode() { return code; }
public String getDesc() { return desc; }
}
// 使用
OrderStatus status = OrderStatus.PAID;
System.out.println(status.getCode()); // 1
System.out.println(status.getDesc()); // 已支付
// switch 配合枚举(最常用)
switch (status) {
case PENDING -> System.out.println("去支付");
case PAID -> System.out.println("等发货");
case SHIPPED -> System.out.println("查物流");
case DONE -> System.out.println("已收货");
}⚠️ 坑 1:枚举值用大写+下划线,不要用小写。枚举不能 new,只能用
枚举名.值引用。
二、内部类(简版)
内部类 = 定义在类内部的类。企业代码很少用,这里只介绍最常见的两种:
静态内部类(最常用)
java
public class Outer {
private static int x = 10;
public static class Inner { // 静态内部类
public void hello() {
System.out.println("x = " + x);
}
}
}
// 使用:不需要外部实例
Outer.Inner inner = new Outer.Inner();
inner.hello();典型场景:把内部类和外部类强关联(如 Map.Entry)。
匿名内部类(简化写法,常用于回调)
java
interface Greeting {
void sayHello();
}
// 一次性实现接口,不需要建一个类
Greeting g = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello!");
}
};
g.sayHello(); // Hello!⚠️ 坑 2:Java 8+ 有了 Lambda 表达式,匿名内部类大多被 Lambda 替代:
java// 同样的功能,Lambda 更简洁 Greeting g = () -> System.out.println("Hello!");
三、本章小结
| 要点 | 关键 |
|---|---|
| 枚举 | 一组固定常量,可带字段、方法 |
| 枚举构造器 | 默认 private,不能 new |
| 静态内部类 | 不依赖外部实例,最常用 |
| 匿名内部类 | 一次性实现接口,Lambda 出现后少用 |
动手练习
- 订单状态枚举:写
OrderStatus枚举(PENDING/PAID/SHIPPED/DONE/CANCELLED),带中文描述 - 季节判断:用 switch 根据
Season枚举输出对应天气建议 - 静态内部类:写一个
User类,里面有个静态内部类Builder(链式构造)
下一章:第 10 章:Object 类与常用方法 →