1、什么是枚举类型?
枚举:就是指罗列/列举出某个类的所有对象。
2、什么情况下使用枚举?
当某个类的对象是“固定”、“有限”的几个,那么就可以声明为枚举类型。
例如:Week类,Month类,用户的订单状态,用户的角色类型等
用户的订单状态:未付款、已付款、已发货、已收货... 几个
用户的角色类型:超级管理员、普通管理员、普通用户、临时用户...几个
3、怎么声明枚举类型?
(1)JDK1.5之前
(2)JDK1.5之后
(1)JDK1.5之前:
思考问题的方向,如何限定某个类的对象,在整个程序运行期间,只有固定的几个对象?
A:不能让其他类随意创建这个类的对象
==>创建对象,就需要调用构造器
==>不想让他随意创建对象,就要限制构造器的使用
==>比如,构造器私有化
B:在这个类的内部把固定的几个对象创建好,供别人使用
==>这些对象,需要用静态的常量来表示,是否需要public,看你这些对象是否允许任意位置可见,一般都是public的。
结论:从JDK1.5之前的声明发现,枚举类型只是比普通的Java类稍微特殊一点而已,它也是Java类。
(2)JDK1.5之后:对枚举类的声明进行了简化
提供了一个新的关键字,专门用来声明枚举类型:enum,这个关键字代替原来的class。
语法格式:
【修饰符】 enum 枚举类名{
常量对象列表
}
【修饰符】 enum 枚举类名{
常量对象列表;
其他成员
}
说明,如果常量对象列表后面没有其他成员,那么常量对象列表后面不用加;,否则就必须加;
4、枚举类型与普通的类型的区别是
(1)创建对象的位置不同 ,枚举类的对象创建在自己类中
(2)对象的个数不同 ,枚举类的对象的个数是固定的几个
(3)获取对象的方式不同, 枚举类名.常量对象的方式获取
5、枚举类的特点
(1)如果枚举类型,没有声明任何构造器,也会有一个默认的无参构造
(2)枚举类型的所有构造器都是private,不管你写不写private
(3)枚举类型的直接父类是固定,我们程序员不能自己指定,它的直接父类是java.lang.Enum类
Enum类的几个常用的方法
A:String name() 它是返回常量对象的名字
B:int ordinal() 它是返回常量对象列表的索引。枚举类中的常量对象列表像是一个数组,它们就会有下标。
C:String toString():它是重写Object类的toString方法,返回常量对象的名字,
也就是我们自定定义的枚举类型,如果不再重写toString,就使用Enum中的toString方法,返回常量对象的名字,
(4)在API中看不到的两个方法
枚举类型[] values
public class TestEnumType {
public static void main(String[] args) {
//随意创建对象
/* Gender g1 = new Gender();
Gender g2 = new Gender();
Gender g3 = new Gender();
Gender g4 = new Gender();
Gender g5 = new Gender();
Gender g6 = new Gender();*/
//如何拿到Gender的对象呢?
Gender boy = Gender.BOY;
boy.eat();//之前拿到对象之后,该怎么调用方法等,现在还是怎么做。
System.out.println("-----------------------------");
//如何获取Week枚举类的对象
Week monday = Week.MONDAY;
System.out.println(monday);//MONDAY,自动调用Week从Enum父类继承的toString,返回常量对象名字
System.out.println("-----------------------------");
// Status s = new Status();//错误,构造器自动私有化
Status status1 = Status.LEAVE;
status1.method();
Status status2 = Status.HIRE;
status2.method();
System.out.println("-----------------------------");
Week saturday = Week.SATURDAY;
System.out.println(saturday.name());//name()从父类Enum继承类的,返回常量对象的名字
System.out.println(saturday.ordinal());//ordinal()从父类Enum继承类的,返回常量对象的索引,下标 下标从0开始往后编号
System.out.println("-----------------------------");
Week[] values = Week.values();//所有用enum声明的枚举类型,都有values方法,返回枚举中的所有常量对象
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
System.out.println("-----------------------------");
Week week = Week.valueOf("MONDAY");
System.out.println(week); //"MONDAY"是字符串类型的,week是Week类型,虽然它也代表星期一
System.out.println("-----------------------------");
//从键盘输入星期的常量名,根据获取的星期对象,显示对星期的描述
Scanner input = new Scanner(System.in);
System.out.print("请输入星期的常量对象名:");
String name = input.next();
Week w = Week.valueOf(name);//如果输入的常量对象名错误,直接报异常了
switch (w){
case MONDAY: System.out.println("星期一是充满希望的一天");break;
case TUESDAY: System.out.println("星期二是充满力量的一天");break;
case WEDNESDAY: System.out.println("星期三是充满快乐的一天");break;
case THURSDAY: System.out.println("星期四是充满期待的一天");break;
case FRIDAY: System.out.println("星期五是充满优惠的一天");break;
case SATURDAY: System.out.println("星期六是充满玩耍的一天");break;
case SUNDAY: System.out.println("星期日是充满沮丧的一天");break;
}
}
}
//例如:限定Gender的对象只有两个,一个是BOY对象,一个是GIRL对象
//按标准来说,Gender类应该是单独的.java文件,也public的类,这里只是为了让大家把相关代码放一起看,所以没有单独一个.java文件。
class Gender{
//public:表示任意位置可见
//static:表示可以通过“类名.”的形式访问
//final:表示这个对象是常量对象,即BOY和GIRL不能再赋值为别的Gender对象了。
//有同学有疑问?在Gender类中,怎么还能创建Gender类对象呢?
// 可以,因为类加载时,就是原样读取.class文件的过程,把.class中的 数据一行一行的读取到方法区的内存中,
//然后,再初始化这个类,初始化类时,类的模板代码已经加载到内存了,相当于/类似于你使用别的类一样去new对象等。
public static final Gender BOY = new Gender();
public static final Gender GIRL = new Gender();
//构造器私有化之后,外部就不会随意的创建对象了
private Gender(){
}
//剩下的代码,就是写Gender这个类型的具体功能
public void eat(){
System.out.println("吃饭");
}
}
enum Week {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY //Week枚举类的常量对象列表
}
/*
class Week{
public static final Week MONDAY = new Week();
public static final Week TUESDAY = new Week();
public static final Week WEDNESDAY = new Week();
public static final Week THURSDAY = new Week();
public static final Week FRIDAY = new Week();
public static final Week SATURDAY = new Week();
public static final Week SUNDAY = new Week();
private Week(){
}
}
*/
//枚举类型Status,表示员工的状态,它有三个状态
enum Status{
//probation表示试用期,把单词转大小写的快捷键Ctrl + Shift + U
//hire:表示已录用的
//leave:表示已经离职的
PROBATION,
HIRE("正式工"), //如果在常量对象名后面加(),并且在()中传入的实参,就表示调用对应的有参构造
LEAVE; //如果直接写常量对象名,或者常量对象名称(),都是表示调用无参构造创建的对象
//枚举类Status的成员变量
//枚举类型也可以声明自己的成员变量
private String description;
//枚举类型可以声明有参构造和无参构造
//构造器的权限修饰符是private,自动就是private
Status(){
}
Status(String description){
this.description = description;
}
//枚举类型也可以声明自己的成员方法
public void method(){
if(description == null){
System.out.println("该对象的描述信息为空");
}else{
System.out.println(description);
}
}
}
(5)从JDK1.5之后开始switch支持枚举类型