Java 枚举


枚举介绍

什么是枚举?

某些方法所接收的数据必须在固定范围之内的,如方向、性别、季节、日期等。

枚举的定义格式:

// // 注意: 定义枚举类需要用关键字enum
public enum s {
    枚举项1, 枚举项2, 枚举项3;
}

示例:限制性别输入

/*
JDK1.5 之前的解决方案:自定义一个类,然后私有化构造函数,在自定义类中创建本类的对象。
class Gender{

     String value;

     public static final Gender man = new Gender("男");
     public static final Gender woman = new Gender("女");

     private Gender(String value) {
          this.value = value;
     }
}
*/

// 枚举类解决方案
enum Gender{
     man("男"), woman("女");

     String value;

     private Gender(String value){
          this.value = value;
     }
}

class User{

     private Gender sex;
     String name;

     public Gender getSex() {
          return sex;
     }

     public void setSex(Gender sex) {
          this.sex = sex;
     }
}

public class Test {

     public static void main(String[] args) {
          User user = new User();
          user.name = "狗娃";
          user.setSex(Gender.man);
          System.out.println("名字:"+user.name+" 性别:"+user.getSex().value);
     }
}

枚举的特点:

  1. 枚举类也是一个特殊的类。
  2. 枚举值默认的修饰符是 public static final。
  3. 枚举值是枚举值所属的类的类型,枚举值是指向了本类的对象。
  4. 枚举值的构造方法默认的修饰符是 private。
  5. 枚举类可以定义自己的成员变量与成员函数。
  6. 枚举类可以自定义构造函数,但构造函数的修饰符必须是 private,同时枚举值也需传入相应的参数。
  7. 枚举类可以存在抽象的方法,但枚举值必须实现抽象方法。
  8. 枚举值必须位于类的第一个语句。

示例:

public enum Season {

    SPRING("春"){
        // 如果枚举类中有抽象方法
        // 那么在枚举项中必须要全部重写
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },

    SUMMER("夏"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },

    AUTUMN("秋"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },

    WINTER("冬"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    };

    public String name;

    // 空参构造
    // private Season(){}
  
    // 有参构造
    private Season(String name){
        this.name = name;
    }
  
    // 抽象方法
    public abstract void show();
}

public class EnumDemo {
    public static void main(String[] args) {

        // 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
  
        // 每一个枚举项其实就是该枚举的一个对象
        Season spring = Season.SPRING;
    }
}

枚举常用方法

方法名 说明
String name() 获取枚举项的名称
int ordinal() 返回枚举项在枚举类中的索引值
int compareTo(E o) 比较两个枚举项,返回的是索引值的差值
String toString() 返回枚举常量的名称
static <T> T valueOf(Class<T> type,String name) 获取指定枚举类中的指定名称的枚举值
T[] values() 获得所有的枚举项

示例:

package com.example.demo;

enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

public class Test {
    public static void main(String[] args) {
//        String name():获取枚举项的名称
        String name = Season.SPRING.name();
        System.out.println(name);  // SPRING
        System.out.println("-----------------------------");

//        int ordinal():返回枚举项在枚举类中的索引值
        int index1 = Season.SPRING.ordinal();  
        int index2 = Season.SUMMER.ordinal();
        int index3 = Season.AUTUMN.ordinal();
        int index4 = Season.WINTER.ordinal();
        System.out.println(index1);  // 0
        System.out.println(index2);  // 1
        System.out.println(index3);  // 2
        System.out.println(index4);  // 3
        System.out.println("-----------------------------");

//        int compareTo(E o):比较两个枚举项,返回的是索引值的差值
        int result = Season.SPRING.compareTo(Season.WINTER);
        System.out.println(result);  // -3
        System.out.println("-----------------------------");

//        String toString():返回枚举常量的名称
        String s = Season.SPRING.toString();
        System.out.println(s);  // SPRING
        System.out.println("-----------------------------");

//        static <T> T valueOf(Class<T> type,String name):获取指定枚举类中的指定名称的枚举值
        Season spring = Enum.valueOf(Season.class, "SPRING");
        System.out.println(spring);  // SPRING
        System.out.println(Season.SPRING == spring);  // true
        System.out.println("-----------------------------");

//        values():获得所有的枚举项
        Season[] values = Season.values();
        for (Season value : values) {
            System.out.println(value);
        }
        /*
        SPRING
        SUMMER
        AUTUMN
        WINTER
         */
    }
}

switch

switch 语句适用的数据类型:byte、char、short、int、String、枚举类型

注意:case 语句后跟的枚举值只需单写枚举值即可,不需要再声明该枚举值所属的枚举类。

示例:

enum Season{
     spring,summer,autumn,winter;
}

public class Demo {

     public static void main(String[] args) {
          Season season = Season.spring;
          System.out.println(season);  // spring
          switch(season){
              case spring:
                   System.out.println("春天");
                   break;
              case summer:
                   System.out.println("夏天");
                   break;
              case autumn:
                   System.out.println("秋天");
                   break;
              case winter:
                   System.out.println("冬天");
                   break;
          }
     }
}
posted @ 2021-10-04 15:49  Juno3550  阅读(81)  评论(0编辑  收藏  举报