枚举
1 枚举类概述
枚举,是JDK1.5引入的新特性,可以通过关键字enum来定义枚举类。
枚举类意义
1)Java中的类,从语法上来说,可以创建无数个对象
例如,学生类 Student,我们可以创建出10个、20个或更多数量的学生对象,并且从实际业务上讲也没有问题,因为实际情况中确实会存在很多不同的学生。
2)Java中个别特殊类,其所能创建的对象个数是固定的
例如,性别类 Gender,表示人的性别,从语法上来说,可以创建出无数个性别对象,但是从实际意义上看,我们只需要创建2个对象就可以了:性别男、性别女。
3)如何实现上述Java特殊类
我们可以将Gender定义为一个枚举类型(enum),在枚举类型中,我们需要提前定义枚举元素(枚举类型对象固定的几个取值),以后开发过程中只能使用枚举元素给Gerder类对象赋值。
例如:
package com.briup.chap07.test;
//1.定义枚举类
enum Gender {
MALE,FEMALE
}
public class Test071_EnumBasic {
public static void main(String[] args) {
//2.枚举类实例化对象
// 固定格式:枚举类 引用名 = 枚举类.枚举元素值;
Gender g1 = Gender.MALE;
Gender g2 = Gender.MALE;
System.out.println(g1);
System.out.println(g2);
System.out.println("-------------");
Gender g3 = Gender.FEMALE;
Gender g4 = Gender.FEMALE;
System.out.println(g3);
System.out.println(g4);
//3.错误用法: 枚举对象的取值,只能是枚举元素
//Gender g5 = Gender.BOY; error
}
}
//输出枚举对象,默认输出枚举元素名称字符串
MALE
MALE
-------------
FEMALE
FEMALE
上述案例中,我们定义了枚举类Gender,有且只有俩个对象:MALE、FEMALE。
4)枚举类分析
找到Gender类编译生成的字节码文件,对其反编译,观察枚举类定义细节,具体如下:
Gender.class文件位置:

反编译命令:javap -p Gender.class

结合上图我们可知:
-
枚举类Gender本质上是一个final修饰的类,不可以被继承
-
枚举类会默认继承
java.lang.Enum这个抽象泛型类package java.lang; public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { //枚举元素名 private final String name; public final String name() { return name; } //枚举元素编号,从0开始 private final int ordinal; public final int ordinal() { return ordinal; } //省略... } -
枚举元素,本质上是枚举类对象,且由
static和final修饰 -
枚举类提供私有构造器,我们在类外不能主动创建枚举类对象
-
枚举类中可以包含
public static 静态方法 -
其他细节我们暂不考虑
7.2 基本方式定义
定义格式:
[修饰符] enum 枚举类名 {
枚举元素1,枚举元素2,...枚举元素n;
}
案例展示:
定义枚举类Week,要求包含多个枚举元素。
package com.briup.chap07.test;
//枚举类基本定义
enum Week {
//枚举元素必须写在第一行,如果有多个的话,用逗号','隔开,
//最后用分号';'结束
//如果';'后面没有其他内容的话,';'可以省略,但不建议省略
MON, TUE, WED;
//WED也可以写为WED(),作用为执行枚举类默认构造器去实例化枚举对象
//底层执行:public static final Week WED = new Week();
//注意:用户没有提供构造器,系统会提供默认的构造器 private Week() {}
}
public class Test072_Define01 {
public static void main(String[] args) {
//1.枚举元素引用格式:枚举类名.枚举元素名;
//注意枚举类名不能省略
Week w1 = Week.MON;
Week w2 = Week.TUE;
Week w3 = Week.WED;
//2.输出枚举对象,默认输出枚举元素名
System.out.println(w1);
System.out.println(w2.toString());
System.out.println("-----------");
//3.获取枚举元素名:跟元素名一样的同名字符串
System.out.println(w3.name());
//4.获取枚举元素编号:从0开始,逐个加1
System.out.println(w1.ordinal()); //0
System.out.println(w2.ordinal()); //1
System.out.println(w3.ordinal()); //2
}
}
2092

被折叠的 条评论
为什么被折叠?



