• 所有创建的枚举类都继承自抽象类 java.lang.Enum;
  1. 一个枚举类,所有实例都要在第一句写出以 ,隔开。 如果只有实例最后可以不加 ; 枚举类因为继承了Enum,所以再不能继承别的类,任何类也不能继承枚举类(构造器默认为private)。
    public enum Color {
        RED,
        BLUE,
        YELLOW,
        PURPLE
    }
    注意 :RED,BLUE 这些是由 enum Color类调用默认private构造器创建的实例对象,和普通class相比只不过enum的实例对象只能在内部创建。时刻记着他们是一个实例对象。
  2. 枚举类实例不能在外部 new 出来 ,因为枚举类构造器为private 一般也不用声明private,默认就是private,因为enum实例只能在编译期间enum类内部被创建,但可以外部得到一个实例的引用。
            Color red  = Color.RED;
            Color blue = Color.BLUE;
  3. 枚举类的一些方法
    1.  使用枚举元素  Color.RED 或者 red 
    2.  Color.values( ) 返回一个枚举类数组,数组元素就是枚举的实例。
    3.  red.ordinal() 方法返回该实例声明的次序从0开始。
    4.  2个实例可用 == 比较
    5.  Enum 实现了 Comparable<E>和 Serializable 可以使用comparableTo( )方法,可以序列化
    6.  a. getDeclaringClass() 返回 Color.class 对象 
    7.  a.name和a.toString( )方法一样。
    8.     valuesOf(string ) 返回一个实例对象 Color b = Color.valueOf("BLUE");
    9.  根据class对象返回实例  Color b = Color.valueOf( Color.class,  "BLUE" )
  4. 通过带参构造器为枚举实例添加描述信息。调用 getDes()就可以的到当前对象的描述信息。
    public enum Color {
        RED("这是红色"),
        BLUE("这是蓝色"),
        YELLOW("这是黄色"),
        PURPLE("这是紫色");
        String des;
        Color( String s) {
            this.des = s;
        }
        public String getDes(){
            return des;
        }
    }

     调用 getDes( )方法就可以的到当前对象的描述信息。

  5. 重写toString( )方法来为enum实例添加描述信息。

    public enum Color {
        RED,
        BLUE,
        YELLOW,
        PURPLE;
    
        @Override
        public String toString() {
            String id = name();
            return id + " is " + id.toLowerCase();
        }
    }

     

    通过name() 拿到当前对象名字。 

 

2.enum的特殊方法。

  • 除了不能继承enum类外,enum和其普通类没区别,可以添加字段,方法,甚至是main 方法
  1. enum 实例也可以用在 switch语句中
  2. values()方法不在Enum中 它是由编译器添加的static方法。
  3. 编译器还添加了一个valuesOf(String s)方法,这个只需要一个参数就可以的得到实例,而Enum的需要2个。
  4. 如果将enum向上转型为Enum那么values 和 valuesOf 无法再使用。
  5. 与values 方法有相同作用的就是Class对象的getEnumConstants(),如果class是枚举类那么返回元素数组,不是枚举类返回null

 3. 使用接口组织枚举

  • 为了实现扩展enum 或者将enum分类,因为无法继承所以靠扩展子类无法实现,可以利用接口来达到这些功能。
  1. 接口内部创建实现该接口的enum 达到分类目的,并且可以向上转型为接口
    public interface Food {
        enum Fruit implements Food{
            APPLE, BANANA, ORANGE;
        }
        enum Vegetables implements Food{
            TOMATO, POTATO, BEANS;
        }
        enum Drink implements Food{
            COFFEE, COCA, REDBULL;
        }
    }
    
    
       public static void main(String[] args) {
            Food food = Food.Fruit.APPLE;
            food = Food.Drink.REDBULL;
            food = Food.Vegetables.BEANS;
        }
  2. 接口基础上创建一个枚举的枚举,通过该enum控制其他enum,而不是不同的类型分别都要向上转型为Food ,类多时分别向上转型不如每个用一个enum控制方便。
    public enum Course {
        FRUIT(Food.Fruit.class),
        DRINK(Food.Drink.class),
        VEGETABLES(Food.Vegetables.class);
        private Food[] values;
        Course(Class<? extends Food> kind) {
            this.values = kind.getEnumConstants();
        }
        public Food[] getValues() {
            return values;
        }
    }

     通过实例调用getValues方法就可以的到该实例的所有元素。

  3. enum嵌套在另一个enum 重新组织1 2 代码合二为一
    public enum Course {
        FRUIT(Food.Fruit.class),
        DRINK(Food.Drink.class),
        VEGETABLES(Food.Vegetables.class);
        private Food[] values;
    
        Course(Class<? extends Food > kind) {
            this.values = kind.getEnumConstants();
        }
    
        interface Food {
            enum Fruit implements Food {
                APPLE, BANANA, ORANGE;
            }
    
            enum Vegetables implements Food {
                TOMATO, POTATO, BEANS;
            }
    
            enum Drink implements Food {
                COFFEE, COCA, REDBULL;
            }
        }
    
        public Food[] getValues() {
            return values;
        }
       
    }
    View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-04-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-06-07
  • 2022-12-23
  • 2021-12-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案