一:引出枚举

要求创建季节(Serson)对象

  1. public class Test00 {
  2. public static void main(String[] args) {
  3. Season spring = new Season("春天", "温暖");
  4. Season summer = new Season("夏天", "炎热");
  5. Season autumn = new Season("秋天", "凉爽");
  6. Season winter = new Season("冬天", "寒冷");
  7. //因为对于季节而已,他的对象(具体值),是固定的四个,不会有更多
  8. //这样设计,不能体现季节是固定的四个对象
  9. //因此,这样的设计不好===>
  10. //枚举类[枚: 一个一个 举: 例举 , 即把具体的对象一个一个例举出来的类
  11. }
  12. }
  13. class Season {
  14. private String name;
  15. private String desc;
  16. public Season(String name, String desc) {
  17. this.name = name;
  18. this.desc = desc;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public String getDesc() {
  27. return desc;
  28. }
  29. public void setDesc(String desc) {
  30. this.desc = desc;
  31. }
  32. }

二:基本介绍

1:创建Season对象有如下特点

  • 季节的值是有限的几个值
  • 只读,不需要修改

    2:解决方案——枚举

  1. 枚举对应英文(enumeration,简写enum)
  2. 枚举是一组常量的集合
  3. 可以这样理解:枚举属于一种特殊的类,里面包含一组有限的特定的对象

    3:枚举的两种实现方式

  • 自定义实现枚举
  • 使用enum关键字实现枚举

    二:自定义类枚举

  1. 不需要提供setXxx方法,因为枚举对象值通常为只读.
  2. 对枚举对象/属性使用final + static共同修饰,实现底层优化.
  3. 枚举对象名通常使用全部大写常量的命名规范.
  4. 枚举对象根据需要,也可以有多个属性 ```java public class Test00 { public static void main(String[] args) {
    1. System.out.println(Season.AUTUMU);
    2. System.out.println(Season.WINTER);
    } }

class Season { private String name; private String desc;

  1. public static final Season SPRING = new Season("春天", "温暖");
  2. public static final Season SUMMER = new Season("夏天", "炎热");
  3. public static final Season AUTUMU = new Season("秋天", "凉爽");
  4. public static final Season WINTER = new Season("冬天", "寒冷");
  5. //1:将构造器私有化,防止直接new
  6. //2: 去掉set方法,因为不需要修改
  7. //3: 在Season内部,直接创建固定对象
  8. //4: 优化可以加入final修饰符
  9. private Season(String name, String desc) {
  10. this.name = name;
  11. this.desc = desc;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public String getDesc() {
  17. return desc;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Season{" +
  22. "name='" + name + '\'' +
  23. ", desc='" + desc + '\'' +
  24. '}';
  25. }

}

  1. <a name="te5jv"></a>
  2. ### 三:使用enum关键字实现枚举
  3. ```java
  4. package Date0818.Test00;
  5. /**
  6. * 作者:sakura
  7. * 日期:2022年08月19日 11:18
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. System.out.println(Season.SPRING);
  12. System.out.println(Season.AUTUMN);
  13. }
  14. }
  15. enum Season {
  16. SPRING("春天", "温暖"),
  17. WINTER("冬天", "寒冷"),
  18. AUTUMN("秋天", "凉爽"),
  19. SUMMER("夏天", "炎热");
  20. private String name;
  21. private String desc;
  22. private Season(String name, String desc) {
  23. this.name = name;
  24. this.desc = desc;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public String getDesc() {
  30. return desc;
  31. }
  32. @Override
  33. public String toString() {
  34. return "Season{" +
  35. "name='" + name + '\'' +
  36. ", desc='" + desc + '\'' +
  37. '}';
  38. }
  39. }

四:enum关键字实现枚举注意事项

  • 当我们使用enum 关键字开发一个枚举类时,默认会继承Enum类, 而且是一个final 类[如何证明],老师使用javap 工 具来演示
  • 传统的 public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”), 这里必 须知道,它调用的是哪个构造器.
  • 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
  • 当有多个枚举对象时,使用,间隔,最后有一个分号结尾
  • 枚举对象必须放在枚举类的行首.

    五:enum关键字实现枚举-课堂练习

    六:enum关键字常用方法说明

    image.png ```java public class Test01 { public static void main(String[] args) {

    1. Season Spring = Season.SPRING;
    2. Season Autumu = Season.AUTUMN;
    3. //1: toString()方法:Enum已经重写过了, 返回的是当前对象名
    4. System.out.println(Spring);
    5. System.out.println(Spring.toString());
    6. //2:返回当前对象名(常量名),子类中不能重写
    7. System.out.println(Spring.name());
    8. //3:ordinal()返回当前对象的位置号,默认从 0 开始。按照在Enum中定义的顺序
    9. System.out.println(Spring.ordinal());
    10. //4: value 返回当前枚举类中所有的常量
    11. //从反编译可以看出 values 方法,返回 Season2[]
    12. //Season.values() / 枚举类.values就是个数组,里面包含所有枚举类成员
    13. Season[] seasons = Season.values();
    14. //增强for循环
    15. //执行流程依次从Season.values()中取出数据赋给season
    16. for (Season season:Season.values()){
    17. System.out.println(season);
    18. }
    19. //5:比较两个编号,相减,此处0-2 = -2
    20. System.out.println(Spring.compareTo(Autumu));
    21. //6:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常
    22. Season valueOf = Season.valueOf("SPRING");
    23. System.out.println(valueOf);

    } }

  1. :::info
  2. **_重点:增强for循环_**<br />int[] str = {1,2,4,4,5,7,8};<br />for (int i = 0; i < str.length; i++) {<br /> System.out.println(str[i]);<br />}
  3. System.out.println("------------------");<br />//从str中取出数据赋给i,如果取出完毕,则退出 for<br />for (int i : str ){<br /> System.out.println(i);<br />}
  4. :::
  5. <a name="a1rrw"></a>
  6. ### 七:enum实现接口
  7. 1. **使用 enum关键字后,就不能再继承其它类了,因为 enum会隐式继承 Enum,而 Java 是单继承机制。**
  8. 2. **枚举类和普通类一样,可以实现接口,**
  9. ```java
  10. public class Test {
  11. public static void main(String[] args) {
  12. System.out.println(Season.AUTUMN.toString());
  13. }
  14. }
  15. interface A{
  16. public void Play();
  17. }
  18. enum Season implements A {
  19. SPRING("春天", "温暖"),
  20. WINTER("冬天", "寒冷"),
  21. AUTUMN("秋天", "凉爽"),
  22. SUMMER("夏天", "炎热");
  23. private String name;
  24. private String desc;
  25. private Season(String name, String desc) {
  26. this.name = name;
  27. this.desc = desc;
  28. }
  29. @Override
  30. public void Play() {
  31. }
  32. }