------- android培训、java培训、期待与您交流! ----------
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
问题:要定义星期几或性别的变量,该怎么定义?假设用1—7分别表示星期一到星期日,但有人可能会写成int weekday=0; 所以这时就要用到枚举,给变量设定固定的值,一旦不是这个值,就会报错。
每一个枚举都是一个对象
用普通类如何实现枚举功能,定义一个WeekDay的类来模拟枚举功能
(1)私有的构造方法
(2)每个元素分别用一个公有的静态成员变量来表示
(3)可以有若干公有方法或抽象方法,例如,要提供nextDay()方法必须是抽象的。
(4)采用抽象方法定义nextDay就是将大量的if else语句转移成了一个个独立的类.
第一种方式:普通的if else语句:
package itheima;
publicclass WeekDay {
private WeekDay(){}
public finalstatic WeekDayMON=new WeekDay();
public finalstatic WeekDaySUN=new WeekDay();
public WeekDay nextDay()
{
if(this==SUN)
return MON;
else {
returnSUN;
}
}
public String toString()
{
if(this==SUN)
return"SUN";
else
return"MON'";
}
}
主函数中:
publicclass EnumTest {
publicstaticvoid main(String[] args) {
WeekDay weekday=WeekDay.MON;
System.out.println(weekday.nextDay());
}
}
第二种方式:采用抽象方法
package itheima;
publicabstractclass WeekDay {
private WeekDay(){}
public finalstatic WeekDayMON=new WeekDay(){
public WeekDay nextDay()
{
returnTES;
}
};
public finalstatic WeekDaySAT=new WeekDay(){
public WeekDay nextDay()
{
returnSUN;
}
};
public finalstatic WeekDaySUN=new WeekDay(){
public WeekDay nextDay()
{
returnMON;
}
};
publicabstract WeekDay nextDay();
public String toString()
{
if(this==SUN)
return"SUN";
else
return"MON";
}
}
基本的枚举类:
定义一个枚举的关键字是enum
publicenum WeekDay
{
SUN ,MON,TUE,WED,THU,FRI,SAT;
}
实现带有构造方法的枚举:
定义带有构造方法的枚举的时候,应注意:
(1)构造方法必须定义在所有列表的后面
(2)枚举的构造方法只能是private私有的
(3)在枚举类得枚举元素的后面加上一个(),就表示创建这个元素,指向实例对象的时候,使用哪个构造方法
(4)枚举元素MON和MON()的效果是一样的,都是调用默认的构造方法
publicenum WeekDay
{
SUN(1) ,MON,TUE,WED,THU,FRI,SAT;
private WeekDay(){}
private WeekDay(int day){}
}
实现带有抽象方法的枚举:
RED{} 表示是有子类构造的,{}中写入子类的实现代码
相当于new子类的实例对象,并且调用父类的有参的构造方法
总结:
枚举相当于一个类,枚举的元素相当于类的实例对象
好处:枚举里面封装了toString方法,简化了代码
枚举中的方法:
name():获取元素的名字
ordinal():获取元素在枚举中的第几个位置
把一个字符串变成对应的枚举元素对象:
System.out.println(WeekDay.valueOf("FRI").toString());
其中的Weekday是枚举类,valueOf是枚举类的静态方法
什么时候用到values()方法?
假如说要迭代枚举中的所有的元素,就应该是得到所有枚举元素的数组,在对这个数组进行遍历
System.out.println(WeekDay.values().length); 打印数组的长度
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的全面,编译器会报错
枚举中只有一个成员时,就可以作为一种单例的实现方式
如果想要写单例,可以定义一个枚举,并且这个枚举中只有一个元素,因为枚举就是一个特殊的类
复杂的枚举示例:
package itheima;
publicclass EnumText2 {
publicstaticvoid main(String[] args) {
TrafficLamp tl=TrafficLamp.RED;
System.out.println(tl.nextLamp());
}
publicenum TrafficLamp
{
RED(30){
public TrafficLamp nextLamp()
{
returnGREEN;
}
},
GREEN(40){
public TrafficLamp nextLamp()
{
returnYELLOW;
}
},
YELLOW(10){
public TrafficLamp nextLamp()
{
returnRED;
}
};
inttime;
publicabstract TrafficLamp nextLamp();
private TrafficLamp(int time){this.time=time;};
}
}