枚举类概述
枚举:列举,罗列
枚举是代表这样的一系列的类型,这些类型有一个非常明显的特征:他们的对象是有限的几个。
例如:
Week(星期):可以限定week类型的对象只有7个:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
Season(季节):可以限定为4个对象:Spring,Summer,Autumn,Winter
Status(员工状态):可以限定为4个:Free,Busy,Vacation,Left
枚举类是JDK1.5之后引入的。
那么JDK1.5之前是如何实现枚举类这样的功能呢?
要点:整个系统中,某个类型的对象是有限的几个,不多也不少。
(1)限制使用者随意的创建对象---》构造器私有化
(2)把有限的几个对象,预先创建好,放着,供使用者使用---》在枚举类中,用静态的类变量把有限的几个对象存储起来,使用者通过“类名.对象名”来获取。
public class TestOld{
public static void main(String[] args){
Season s = Season.SPRING;
}
}
class Season{
//(2)把有限的几个对象,预先创建好,那么因为构造器私有化,只能在本类中创建
//创建好还要用变量存储起来。(局部变量、实例变量、静态类变量)
public static final Season SPRING = new Season();
public static final Season SUMMER = new Season();
public static final Season AUTUMN = new Season();
public static final Season WINTER = new Season();
private String name;
private String desc;
//(1)构造器私有化
private Season(){
}
private Season(String name,String desc){
super();
this.name = name;
this.desc = desc;
}
}
JDK1.5以后的枚举类
枚举类型也是类,原来用class声明类,现在用enum来声明枚举。
声明的语法格式:
【权限修饰符】 enum 枚举类名称{
常量对象列表;
【其他成员】
}
常量对象列表表示为:
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY[;](此分号根据情况存在与否)
说明:
(1)枚举类型的构造器一定是私有的,不管自己手动添加与否,都是默认的私有的,而且手动无法进行添加公有的构造器。
(2)枚举类型的常量对象列表必须在枚举类的首行。
说明:
如果常量对象列表后面没有其他成员,那么分号“;”可以省略,如果后面还有其他的成员,“;”不能省略。
(3)所有枚举类型有一个直接父类java.lang.Enum类型,所以你不能继承其他类
(4)switch...case
(5)如果在枚举类里面没有写构造器,那么系统会默认有一个不显示的无参构造器,当然也可以自己写一个有参数的构造器,如果手动添加这个有参构造器的话,首行的常量对象列表就会报错,此时就可以在每个常量对象后面加上“(实参列表)”,或者再把无参构造器显式写出来,那么常量对象列表可以不做修改。
首行:
(1)package
(2)super(),this()
(3)枚举类常量对象
switch...case的表达式的类型:
(1)基本数据类型:byte、short、int、char
(2)引用数据类型:枚举(JDK1.5之后),String(JDK1.7之后)
语法结构:
switch(表达式){
case 常量名1:
语句;
【break;】
}
java.lang包有一个特点,就是此包中的类不需要导包。
java.lang.Enum类,他是所有Java语言枚举类型的公共基本类。
即所有枚举类型都继承它,不能再继承别的类了。
(1)name():返回此枚举常量的名称
(2)ordinal():返回枚举常量的序号(它在枚举声明中的位置,其中初始常量序数为0)
(3)int compareTo(x):默认按照枚举对象的顺序排序
(4)API中没有,编译器自动生成的
枚举类型[] values()
枚举类型 valueOf(常量名)