一 场景
当需要表示几个固定值的时候,可以使用枚举来限制。如:星期、季节、成绩等级等等;所以一般枚举类对应的是项目里的字典表;
枚举类本质就是一个特殊的类,继承enum类,所以自定义的枚举类不可以再继承其他类了,但是可以实现其他接口;
枚举元素
枚举类里列出的类型叫做枚举元素,如季节的枚举元是春夏秋冬,成绩等级的枚举元素是ABCD四个等级.....
二 案例
这里以成绩等级作为案例,假设总共分为ABCD四个等级
2.1 验证枚举类的父类
自定义枚举类如下
public enum ScoreLevelEnum {
}
测试类
public class ScoreInput {
public static void main(String[] args) {
//枚举类父类
System.out.println(ScoreLevelEnum.class.getSuperclass());
}
}
结果
由于自定义的枚举类已经继承enum类,所以自定义的枚举类不可以再继承其他类了,但是可以实现其他接口;
2.2 枚举类只有一个枚举元素的情况
此时的枚举类是单例的设计模式(单例:懒汉式、饿汉式、枚举)
2.3 默认构造器都是私有的
测试类
直接报错
由于枚举类构造器是私有的,所以不能被继承,即不可以有子类,因为子类实例化的时候需要先调父类的构造器;
2.4 可以定义普通方法
静态、非静态方法都可以
非静态方法
枚举类
public enum ScoreLevel {
A,B,C,D;
public void printLevel(){
//this:当前对像(谁调用这个方法,this就是谁)
System.out.println(this);
}
}
测试
public class ScoreInput {
public static void main(String[] args) {
ScoreLevel.A.printLevel();
}
}
结果
静态方法
枚举类
在这里插入代码片
2.5 可以定义抽象方法
枚举类
package com.maltose.demo.test;
public enum ScoreLevel {
A{
@Override
public void say() {
System.out.println("A等级");
}
}
,B {
@Override
public void say() {
System.out.println("B等级");
}
},
C {
@Override
public void say() {
System.out.println("C等级");
}
},
D {
@Override
public void say() {
System.out.println("D等级");
}
};
public abstract void say();
}
2.6 常用方法
枚举类
package com.maltose.demo.test;
public enum ScoreLevel {
A{
@Override
public void say() {
System.out.println("A等级");
}
}
,B {
@Override
public void say() {
System.out.println("B等级");
}
},
C {
@Override
public void say() {
System.out.println("C等级");
}
},
D {
@Override
public void say() {
System.out.println("D等级");
}
};
public abstract void say();
}
测试类1
public class ScoreInput {
public static void main(String[] args) {
ScoreLevel[] values = ScoreLevel.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i].name()+": "+values[i].ordinal());
}
}
}
结果
测试类2
public class ScoreInput {
public static void main(String[] args) {
//把字符串"A"变为枚举元素
ScoreLevel scoreLevel = ScoreLevel.valueOf("A");
System.out.println(scoreLevel.name());
scoreLevel.say();
}
}
结果
三 枚举的另一种用法
在第二章里,每个枚举元素都是一个固定值,而在字典表里,一般都是两个值互相对应的,比如YES对应数字1,NO对应数字0
枚举类
package com.maltose.demo.test;
public enum ScoreLevel {
YES("1"),
NO("0");
private String code;
ScoreLevel(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
测试
package com.maltose.demo.test;
public class ScoreInput {
public static void main(String[] args) {
System.out.println(ScoreLevel.YES.getCode());
System.out.println(ScoreLevel.NO.getCode());
}
}
结果