黑马程序员——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培训、期待与您交流!
----------
----------
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
问题:要定义星期几或性别的变量,该怎么定义?假设用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培训、期待与您交流!
----------
相关文章推荐
- 黑马程序员--迷宫小游戏
- 黑马程序员---2015.6.22java基础笔记---Collections---Arrays---方法的可变参数---常用类介绍
- 黑马程序员--定义枚举
- 黑马程序员--数组、字符串
- 黑马程序员——Java语言基础语法(一)
- 黑马程序员--递归方法参数的自增自减
- 常见的sql面试题
- PHP 程序员如何设计一个爬虫程序
- 黑马程序员——变量、printf函数、scanf函数
- 黑马程序员--多线程--5th
- 黑马程序员——高新技术---反射
- 黑马程序员——初识JAVA
- 黑马程序员---iOS编程效率提高必备
- 实习面试题目总结一
- 微软经典的算法面试100题之32题
- SQL面试题
- 黑马程序员--java反射学习笔记
- ETL架构师面试题(这篇文章太棒了)
- 面试题总结1
- 黑马程序员---MAC OS X系统终端常用命令