Java枚举

来源:互联网 发布:找出数组中重复的元素 编辑:程序博客网 时间:2024/06/10 06:45

(1)枚举类定义和API

public enum EnumTest{    SPRING,SUMMER,FALL,WINTER;}
  • 枚举类可实现一个或多个接口,使用enum定义的枚举类默认继承java.lang.Enum,枚举类不能继承其他父类,Enum类继承自Object类;
  • 使用enum定义非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类;
  • 枚举类的构造器只能使用private修饰;
  • 枚举类的实例必须在第一行显式列出,这些实例系统会自动使用public static final修饰;
values()  遍历整个枚举类int compareTo(E o)   比较此枚举与指定对象的顺序;String name()   返回此枚举常量的名称;int ordinal()   返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零);static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)    返回带指定名称的指定枚举类型的枚举常量。
for (EnumTest s : EnumTest.values()) {    System.out.println(s);}//SPRING//SUMMER//FALL//WINTERSystem.out.println(EnumTest.SPRING.compareTo(EnumTest.FALL));//-2System.out.println(EnumTest.SPRING.name());//SPRINGSystem.out.println(EnumTest.SUMMER.ordinal());//1EnumTest enumTest = Enum.valueOf(EnumTest.class, "FALL");System.out.println(enumTest);//FALL

(2)枚举成员变量,方法和构造器

public enum EnumTest{    SPRING("春"),SUMMER("夏"),FALL("秋"),WINTER("冬");    //构造器私有(和实例对应)    private EnumTest(String name) {        this.name = name;    }    //属性和方法    private String name;    public String getName(){        return name;    }    public void setName(){        this.name = name;    }}

测试代码:

System.out.println(EnumTest.SPRING.getName());EnumTest enumTest = Enum.valueOf(EnumTest.class, "FALL");System.out.println(enumTest.getName());//春//秋

(3)枚举抽象方法和实现接口

(1)实现接口

public interface EnumInterface {    public void test();}//(1)和普通类一样实现public enum EnumTest implements EnumInterface{    @Override    public void test() {    }}//(2)每个实例实现public enum EnumTest implements EnumInterface{    SPRING("春"){        @Override        public void test() {        }    }, SUMMER("夏"){        @Override        public void test() {        }    }, FALL("秋"){        @Override        public void test() {        }    }, WINTER("冬"){        @Override        public void test() {        }    };}

(2)抽象方法

public enum EnumTest implements EnumInterface{    //抽象方法实现方式    SPRING("春"){        @Override        public void test() {        }    }, SUMMER("夏"){        @Override        public void test() {        }    }, FALL("秋"){        @Override        public void test() {        }    }, WINTER("冬"){        @Override        public void test() {        }    };    public abstract void test();}

(4)EnumSet,EnumMap 的应用

        //(1)EnumSet的使用        EnumSet<EnumTest> enumSet = EnumSet.allOf(EnumTest.class);        for (EnumTest key : enumSet) {            System.out.println(key);        }        //(2)EnumMap的使用        EnumMap<EnumTest, String> enumMap = new EnumMap<EnumTest, String>(EnumTest.class);        enumMap.put(EnumTest.SPRING, "春");        enumMap.put(EnumTest.SUMMER, "夏");        enumMap.put(EnumTest.FALL, "秋");        enumMap.put(EnumTest.WINTER, "冬");        for (Iterator<Map.Entry<EnumTest, String>> item = enumMap.entrySet().iterator(); item.hasNext(); ) {            Map.Entry<EnumTest, String> entry = item.next();            System.out.println(entry.getKey().name() + ":" + entry.getValue());        }//EnumSet结果SPRINGSUMMERFALLWINTER//EnumMap结果SPRING:SUMMER:FALL:WINTER:

(5)原理分析

Enum经过编译和反编译之后:

public class com.example.enums.EnumTest extends java.lang.Enum{    public static final com.example.enums.EnumTest SPRING;    public static final com.example.enums.EnumTest SUMMER;    public static final com.example.enums.EnumTest FALL;    public static final com.example.enums.EnumTest WINTER;}...

所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

原创粉丝点击