枚举
知识点一:枚举概述
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举特点
1、用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
2、枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰
3、枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
陈潞的理解:枚举可理解为类,枚举元素可理解为类的对象。枚举元素相当于枚举的静态成员。
知识点二:简单的枚举及其常用方法
public class enumDemo1 { public static void main(String args[]) { ColorEnum color1 = ColorEnum.RED; print(color1);//输出结果为:RED,即返回内部String()方法的值 print(color1.name());//输出结果为:RED,即对象的名字 print(color1.ordinal());//输出结果为0,即对象的角标 print(color1.compareTo(ColorEnum.BLUE));//输出结果为:-2,即color1的角标-ColorEnum.BLUE的角标 print(color1.getClass());//输出结果为:class enumDemo1$ColorEnum,即ColorEnum的类字节码 print(ColorEnum.valueOf("RED"));//输出结果为:RED,根据传入的字符串参数得到枚举的对象实例,等同于print(ColorEnum.RED),等同于print(ColorEum.RED.toString()) print(ColorEnum.values());//输出结果为[LenumDemo1$ColorEnum;@affc70,返回的是枚举各个对象组成的字符串数组 print(ColorEnum.values().length);//输出结果为3 } public enum ColorEnum { RED,//可理解为ENUM的对象 GREEN, BLUE; } public static void print(Object o) { System.out.println(o); } }
知识点三:带构造方法的枚举。
1、枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
2、构造方法必须定义成私有的
3、枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
4、new静态类的对象,即枚举的元素,就会调用枚举的相应构造方法
public enum ColorEnum { RED(10),//可理解为ENUM的对象 GREEN(20), BLUE(5); ColorEnum(int sec){System.out.println(“调用了构造函数”)} }
知识点四:带抽象方法的枚举
枚举元素是由枚举的匿名子类实现抽象方法new出来的,即
RED {子类{子类代码块}}
例子:
public enum ColorEnum { RED { public ColorEnum getNext() { return null; } }, GREEN { public ColorEnum getNext() { return null; } }, YELLOW{ public ColorEnum getNext() { return null; } }; public abstract ColorEnum getNext(); }
知识点五:带属性的枚举
public enum ColorEnum { RED(10) {//10相当于RED的属性 public ColorEnum getNext() { return null; } }, GREEN(10) { public ColorEnum getNext() { return null; } }, YELLOW(2) { public ColorEnum getNext() { return null; } }; public abstract ColorEnum getNext(); private int time; ColorEnum(int time){this.time = time;} }