枚举

                                                            枚举

      Enum常用的方法

1.   values() 方法

通过调用枚举类型的 values() 方法可以将枚举的所有成员以数组形式返回,也可以通过该方法获取枚举类型的成员

 

     for(Season season:Season.values()){
         System.out.println(season.getName());
}

2.  compareTo() ,valueOf()方法

调用 valueOf() 方法获取枚举的一个成员,再调用 compareTo() 方法进行比较,并 输出结果(Enum默认实现了java.lang.Comparable接口

答案:male与male的比较结果是:0
           male与female的比较结果是:-1

3.ordinal() 方法
  通过调用枚举类型实例的 ordinal() 方法可以获取一个成员在枚举中的索引位置

             Enum的构造方法(枚举是一个特殊的类)

不能有public的构造方法,这样做可以保证客户代码没有办法新建一个enum的 实例

    枚举实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对 象不能再继承其他类

方案一:枚举定义可以实现接口, 方案二:当一个枚举对象实现了一个接口之后,枚举中的每一个对象都要 分别实现接口中的所有抽象方法

public interface DemoInterface {
    public String getColorName();    //抽象接口的抽象方法getColorName
}

public enum Color implements demoInterface {
   //    RED(){
//        public String getColorName() {
//            return this.getName();
//        }
//    },
//    GREEN("lvse") {
//        public String getColorName() {
//            return this.getName();
//        }
//    },
//    YELLOW("huangse") {
//        public String getColorName() {
//            return this.getName();
//        }
//    },
//    BLUE("lanse") {
//        public String getColorName() {
//            return this.getName();
//        }
//    };
    RED(), GREEN("lvse"), YELLOW("huangse"), BLUE("lanse");

    //实现接口的方案一
    @Override
    public String getColorName() {
        return name;
    }
    
    //成员变量
    private String name;

    //获取 name值
    public String getName() {
        return name;
    }

    //设置name值
    public void setName(String name) {
        this.name = name;
    }

    //定义构造方法, 是private 构造方法 只能在类的内部被使用
    //构造方法 private 可以省略 不写 也是private
    Color() {
        System.out.println("无参构造方法被调用");
    }

    //从语法不可以定义public构造方法,不希望枚举由其他人创建对象,只自己内部来创建对象,可以很好的控制枚举列表
    private Color(String name) {
        this.name = name;
        System.out.println("有参的构造方法被调用,name=" + name);
    }

    
   public static void main(String[] args) {
      System.out.println(Color.RED.getColor());//hongse
       for(Color c:Color.values()){    //使用foreach循环,遍历枚举中的元素
            System.out.println(c+" "+c.getColor());    //输出枚举的元素 值,并调用getColor方法输出枚举的字段值
        }
   }
}

除了实现抽象接口,枚举自己内部也可以定义抽象方法。一旦枚举自己也定义了 抽象方法,那么只能枚举中的每个对象都要分别的实现这些方法,不然会报错。

public enum Color implements DemoInterface {
   RED {
      @Override
      public void ma() {
         System.out.println("ma():RED");
      }//枚举中的元素

      public String getColor() {//枚举对象,实现抽象接口的方法getColor
         return "hongse";
      }
   },
   GREEN {
      @Override
      public void ma() {
         System.out.println("ma():GREEN");
      }

      public String getColor() {//枚举对象分别实现抽象接口的方法
         return "lvse";
      }
   };
   //定义抽象方法
   public abstract  void ma();
   public static void main(String[] args) {
      for(Color c:Color.values()){    //使用foreach循环,遍历枚举中的元素
         System.out.println(c+" "+c.getColor());    //输出枚举的元素值, 并调用getColor方法输出枚举的字段值
         c.ma();
      }

   }
}

/* RED hongse
ma():RED
GREEN lvse
ma():GREEN
*/
      自定义枚举值

 

  • 自定义方法:Java 为枚举类型提供了一些内置的方法,同时枚举常量也可以有自 己的方法。此时要注意必须在枚举实例的最后一个成员后添加分号,而且必须先定义枚举实例。

  • 自定义变量:所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量, 这些变量可以用任何你想用的修饰符。

  • enum WeekDay{ 
         Mon("Monday"),
        Tue("Tuesday"),
        Wed("Wednesday"),
        Thu("Thursday"),
        Fri("Fr iday"),
        Sat("Saturday"),
        Sun("Sunday");//优先列举枚举值
        //以上是枚举的成员,必须先定义,而且使用分号结束
        private String day;//成员属性.定义其它任何类型的非枚举变量
        private WeekDay(String day){//构造方法,在列举枚举值时调用
            this.day=day;
        }
        //写成员变量的getter和setter方法
        public String getDay(){
            return day;
        }
        //普通方法
        public static void printDay(int i){//自定义方法
            switch(i) {
                case 1:
                    System.out.println(WeekDay.Mon);
                    break;
                case 2:
                    System.out.println(WeekDay.Tue);
                    break;
                case 3:
                    System.out.println(WeekDay.Wed);
                    break;
                case 4:
                    System.out.println(WeekDay.Thu);
                    break;
                        case 5:
                    System.out.println(WeekDay.Fri);
                    break;
                case 6:
                    System.out.println(WeekDay.Sat);
                    break;
                case 7:
                    System.out.println(WeekDay.Sun);
                    break;
                default:
                    System.out.println("wrong number!");
            }
        }
      
        public static void main(String[] args) {
            for(WeekDay day:WeekDay.values()){
                System.out.println(day+"====>"+day.getDay());
            }
  • //如果没有 static  需要 Weekday.FRI.printName(5);
            WeekDay.printDay(5);
        }
    }
    /*
    Mon====>Monday
    Tue====>Tuesday
    Wed====>Wednesday
    Thu====>Thursday
    Fri====>Friday
    Sat====>Saturday
    Sun====>Sunday
    Fri
    */

    enum 还可以跟 Class 类一样覆 盖基类的方法

 

 

 

posted @ 2022-03-16 20:55  任任不买鞋子  阅读(163)  评论(0)    收藏  举报