枚举类
Enum类
从1.5时开始支持枚举类,class Enum不像interface那么特殊,但是呢确实是个特别的类
用语规定
枚举父类、枚举顶级父类:Enum类
枚举子类:自定义枚举类
枚举常量:通过枚举子类私有构造器new出的本类static final对象(因为是在类中可访问)
枚举静态变量:枚举子类的成员变量、static属性
枚举实例变量:枚举子类的成员变量、non-static属性
特性
Type特性
- 枚举子类编译时隐式继承 java.lang.Enum,所以枚举类不能显式继承其他类,但可以实现多个接口。
- 枚举类不允许被final与abstract修饰,但编译运行时有它们的存在,根据不同情况
- 枚举子类必须声明枚举常量对象(可显式写明构造参数,也可以匿名内部类继承复写),并且编译器隐式定义本类数组对象 $VALUES[],存储编辑器隐式定义生成的枚举常量对象
- 枚举子类声明的枚举常量对象,都是默认public static final修饰
- 枚举子类的枚举常量对象是有限个,在编写枚举子类时定死,且随类加载而一并创建
FIELD特性:
①静态属性
- 与普通类无区别
②实例属性
- 在枚举常量对象声明定义时以子类构造器的形式传递参数并赋值
CONSTRUCTOR特性
- 枚举子类的构造器只可定义/默认private,Enum父类只有有参构造器为protected
- 枚举子类有参无参构造函数会在编译时自动加入父类构造器参数并调用super(s,i)
- 父类参数值不需要手动传递,不允许在枚举子类的构造函数中显式调用super传递参数
- 由于枚举子类的构造器为private,故无法被外部类显式继承。但可在本类中以匿名内部类形式继承并创建枚举子类静态常量对象
METHOD特性
- 实例静态属性的get、set()方法,toString()方法,等等……与普通类无区别
- 复写接口的抽象函数
- 可声明抽象函数,让枚举常量对象使用枚举子类构造器并以匿名内部类的形式继承抽象函数并实现。
其他特性
- 可在switch表达式中使用enum定义的枚举类的对象作为表达式,case 可直接使用枚举常量name无需使用枚举类枚举常量对象
一般构成
访问修饰符PPPP enum 枚举子类名 implements 接口名 {
//枚举常量对象(本枚举子类对象)只可为 public final static 默认可省略。
//1.直接声明,省略构造函数,不使用匿名内部类。(由编译器隐式new静态常量对象)
枚举常量1,枚举常量2,枚举常量1; //枚举常量全部大写
//2.使用构造函数(本类及父类Enum的)(由编译器隐式加载父类构造参数至子类无参构造器)
枚举常量1(构造参数),枚举常量2(); //缺省为本类无参构造,在未显式声明构造函数下允许
//3.使用父类构造函数的匿名内部类
枚举常量1(构造参数){
(匿名内部子子类)类体},枚举常量2(){
(匿名内部子子类)类体};
//实例变量属性
访问修饰符 数据类型 实例属性名 = 初始化表达式;
//实例方法
访问修饰符 数据类型 实例函数名(){
return this.实例属性名;
}
//静态变量属性
访问修饰符 static 数据类型 静态变量属性名 = 2;
//静态常量属性
访问修饰符 final static 数据类型 静态常量属性名 = 2;
//静态方法
public static 数据类型 静态函数名(){
return 静态变量属性名;
}
//无参构造器【编译后是有参的,为Enum父类有参构造函数的参数】
/*枚举子类名(String name,int ordinal){
super(name,ordinal);
}*/
枚举子类名() {
}
//有参构造器【编译后构造函数】
/*枚举子类名(String name,int ordinal,int seconds){
super(name,ordinal);
this.seconds = seconds;
}*/
枚举子类名(int seconds) {
this.seconds = seconds;
}
顶级父类Enum
所有枚举子类都继承的父类Enum类
//重要继承,及实现
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//所有的field
private final String name;
private final int ordinal;
//method
...
}
Enum全部方法
隐式方法
implicit method :隐式定义的(即由编译器生成),无法在javadoc中看到此方法
因此,枚举类型E的声明