枚举介绍
枚举在日常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。
定义枚举
权限修饰符 enum 枚举名称 {
枚举项1,枚举项2...;
}
枚举项之间使用逗号分隔,最后使用分号结束,如果只有枚举项分号可以省略
//使用枚举描述性别数据:
public enum Sex {
BOY, GIRL;
}
枚举使用
通过枚举名直接引用枚举项即可,例如Sex.BOY、Sex.GIRL
注意 : 每个枚举项都相当于枚举的对象
枚举结合switch使用
// 信号灯枚举
public enum Signal {
// 每个枚举项都是一个常量,我们使用常量的命名规则(全部大写,不同单词之间使用下划线分割)
GREEN, YELLOW, RED
}
public class TrafficLight {
public static void main(String[] args) {
change(Signal.GREEN); // 绿灯行
}
public static void change(Signal color) {
switch (color) {
case GREEN:
System.out.println("绿灯行");
break;
case YELLOW:
System.out.println("黄灯亮了等一等");
break;
case RED:
System.out.println("红灯停");
break;
}
}
}
探索枚举的本质
枚举其实本质上是一个类,每一个枚举项是本枚举类类型的一个对象。我们可以使用JDK提供的反编译命令,将枚举的字节码进行反编译查看,如下:
在CMD中找到字节码所在路径,然后执行:javap -p 字节码文件名
我们以之前所写的Sex枚举为例,反编译后结果如下:
final class Sex extends java.lang.Enum<_Sex> {
public static final Sex BOY;
public static final Sex GIRL;
private static final Sex[] $VALUES;
//将所有的枚举对象返回,通过这个方法我们可以遍历枚举类中的枚举项
public static Sex[] values();
//根据枚举的常量名字符串,转换为枚举对象
public static Sex valueOf(java.lang.String);
private Sex(); //私有构造方法,在枚举类加载的时候创建枚举项时调用
static {}; //静态代码块
}
由此可见,每一个枚举项都是被public static final所修饰,很明显是一个常量,所以之前我才使用常量的命名规则对枚举项进行命名
枚举本质上是什么?
枚举本质上是一个final类,继承了Enum类
枚举内部可以定义什么?
枚举是一个类,可以类中可以定义的成分,比如成员变量,构造方法,成员方法等
枚举中的构造方法有什么特点?
是私有的,外界无法调用,在将枚举加载到方法区后会创建所有的枚举项,这是会根据枚举项是否传参调用对应的构造函数(默认只有无参构造函数,我们可以扩展有参构造函数)
public enum Signal {
// 创建是否传入参数来决定调用哪一个构造函数
Green, Yellow("xiaobo"), Red;
private String name;
private Signal() {
System.out.println("无参构造");
}
private Signal(String name) {
System.out.println("有参构造");
this.name = name;
}
public void show(){
System.out.println(name);
}
}
public class EnumDemo02 {
public static void main(String[] args) {
System.out.println(Signal.Yellow); // 无参构造 有参构造 无参构造 Yellow
/*由此可见在枚举类加载的时候所有的枚举项就开始创建了*/
System.out.println("<========================>");
Signal.Yellow.show(); // xiaobo
Signal.Green.show(); // null
Signal.Red.show(); // null
}
}
枚举的实例方法怎么用?
直接用枚举项调用