枚举:
为什么要有枚举:
问题:要定义星期几或性别的变量。该怎么定义?
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制程序中填写的非法值,普通变量的方式在开发阶段是无法实现这一目标的。
用普通类如何实现枚举功能?定义一个weekday的类来模拟枚举功能:
1.私有的构造方法
2.每个元素分别用一个共有的静态成员变量表示
3.可以有若干个共有的方法或抽象方法
package day1;
//用普通类如何实现枚举功能?
public abstract class WeekDay {
//1.私有构造方法
private WeekDay(){}
//2.每个元素用分别用一个公有的静态成员变量表示
public static final WeekDay MON = new WeekDay() {
@Override
public WeekDay nextDay() {
// TODO 自动生成的方法存根
return SUN;
}
};
public static final WeekDay SUN = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO 自动生成的方法存根
return MON;
}
};
//4.用抽象方法,所以WeekDay也要用abstract修饰
public abstract WeekDay nextDay();//抽象方法不能方法实体,即后面不能加大括号
//3.可以有若干个公有的方法或抽象方法
/* public WeekDay nextDay(){
if(this == MON){
return SUN;
}
else{
return MON;
}
}*/
public String toString(){
return this==SUN?"SUN":"MON";
}
}
1.成员列表必须在第一行,如果后面还有代码,最后要加分号
package day1;
//简单的枚举
public class EnumTest1 {
public static void main(String[] args) {
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay);
System.out.println(weekDay.name());
System.out.println(weekDay.ordinal());
System.out.println(WeekDay.valueOf("SUN").toString());
System.out.println(WeekDay.values().length);
}
//枚举是特殊的类.1.可以卸载一个类里面2.因为是个类,所以没有()3.如果枚举中有抽象方法,也不需要在枚举上用abstract修饰
public enum WeekDay{
//1.简单的枚举
// SUN,MON,TUE,WEN,THU,FRI,SAT
//2.带构造方法的枚举
SUN(1),MON(),TUE,WEN,THU,FRI,SAT;
private WeekDay(){System.out.println("first");};
private WeekDay(int day){System.out.println("second");};
}
//最复杂的枚举,掌握这个就足够了
public enum TrafficLamp{
//3.带抽象方法的枚举
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},YELLOW(3){
public TrafficLamp nextLamp(){
return RED;
}
},GREEN(20){
public TrafficLamp nextLamp(){
return YELLOW;
}
};
private TrafficLamp(){};
private TrafficLamp(int seconds){};
public abstract TrafficLamp nextLamp();
}
}
总结:
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
带构造方法的枚举:
构造方法必须定义成私有的
如果有多个构造方法,该如何选择构造方法?
枚举元素MON和MOM()的效果一样,都是调用默认的构造方法。
带有方法的枚举:
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
增加上表示时间的构造方法。
枚举只有一个成员时,就可以作为一种单例的实现方式。