day14-枚举
一、 枚举
1.枚举类是一个新的类型跟class定义的普通类有很多的相同之处,它也可以定义属性和方法,但是不能继承其他的类了,因为它已近继承了java.lang.Enum。
2.什么时候使用枚举呢?
当我们定义的一些有限的常量的时候,不再像之前那样定义public static final了 ,而是直接在枚举类中列举出来即可了。使用上方便很多。
3.枚举的定义
(1)普通的列举: 仅仅只要列出有限常量即可。其实底层是将这些常量定义到一个数组中的。
public enum Score { A,B,C,D,E }
(2)带参数的列举,此时就需要自己定义构造函数了
public enum Score {
A("90-100","优秀"),
B("80-90","良好"),
C("70-80","中等"),
D("60-70","及格"),
E("60以下","挂科");
private String score;
private String type;
private Score() {}
//两个参数的构造函数 普通的类定义构造函数一样
private Score(String score,String type) {
this.score=score;
this.type=type;
}
}
(3)带有自己的方法的定义,且可以直接覆写的方式
public enum Score { A("90-100","优秀"){ @Override public boolean hasWork() { return false; } },B("80-90","良好"),C("70-80","中等"),D("60-70","及格"),E("60以下","挂科"); private String score; private String type; private Score() {} private Score(String score,String type) { this.score=score; this.type=type; } //是否有作业 public boolean hasWork() { return true; }
上面的代码我在枚举类中定义了一个haswork()方法,表示要写作业的,但是成绩为A等的人就不用写作业,那么我此时就可以直接在枚举中的A后面直接复写那个hasWork()方法,这样调用A的时候就是返回A的复写后的结果,很方便灵活。
4.枚举的使用
(1)经常与switch case结合使用,可以在初始化的时候就给赋一个值。比如Score s = Score.A;这就初始化好了一个枚举类对象。
(2)枚举中的value()方法,返回一个对应类型的数组对象。
(3)枚举中的valueOf()方法,两种,第一个根据字符串,返回一个枚举常量,第二个是根据枚举的类型和常量(可用变量来接收这个常量,那样就是动态的),返回一个具体的枚举中的常量(第二种valueOf()更加动态,可以实现跟switch case 灵活应用)
String type = getType(score); //type就是可以动态变化,传入给valueOf时候也就可以实现动态了 if("不及格".equals(type)) { System.out.println(type); return; } System.out.println(type); switch (Score.valueOf(Score.class, type)) { //可以有动态的结果了 case A: System.out.println("优秀"); break; case B: System.out.println("良好"); break; case C: System.out.println("中等"); break; case D: System.out.println("及格"); break; default: break; }