您的位置:首页 > 职场人生

黑马程序员——Java中的枚举

2015-06-22 22:56 549 查看
------- 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;};

}
}

------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: