Skip to content
第 9 章 后端 ⏱ 8 分钟阅读

第 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 出现后少用

动手练习 ​

  1. 订单状态枚举:写 OrderStatus 枚举(PENDING/PAID/SHIPPED/DONE/CANCELLED),带中文描述
  2. 季节判断:用 switch 根据 Season 枚举输出对应天气建议
  3. 静态内部类:写一个 User 类,里面有个静态内部类 Builder(链式构造)

下一章:第 10 章:Object 类与常用方法 →

本站基于 VitePress 构建 · 由 StackHub 团队维护