枚举
一. 枚举的作用原理。
问题:要定义星期几或性别,季节,月份的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成 int weekday = 0;
有的用0~6表示,当一个项目有很多人同时在开发时,为了统一,于是枚举就用上了
1. 枚举就是让某个类型变量的取值只能为若干个固定值中的一个。否则编译器就会报错。枚举可以让编译器在编译时就可以控制源程序填写的非法值。普通变量在开发阶段无法实现这一目标。
二. _用普通类模拟枚举的实现原理
1.枚举中构造方法必须是私有的。
2. 每个元素分别用公有的静态成员变量表示。
3.枚举可以有 public 和abstract 方法。
定义一个新的类型,让这个类型定义的变量指定的值是固定的值,怎么做:
三. java的枚举的基本应用
举例:定义一个Season的枚举
扩展:枚举类的values,valueOf.,name,toString.ordinal等方法。
枚举是一种特殊的类。其中的每一个元素都是该类的一个实例对象。
示例如下:
publicclass EnumTest {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Season season = Season.Spring;
System.out.println(season);
System.out.println(season.name());
System.out.println(season.ordinal());
System.out.println(season.valueOf("Summer".toString()));
System.out.println(season.values().length);
}
publicenum Season{
Spring,Summer,Autumn,Winter;
}
}
输出结果为:
Spring
Spring
0
Summer
四. 实现带有构造方法的枚举
1.枚举里的元素如:Spring,Summer,Autumn,Winter;;他们必须定义在枚举类的最开始部分,且枚举元素列表的后面要有分号结束。
2.枚举元素和Spring 和Spring ()的效果一样,都是调用默认的构造方法。
publicclass EnumTest {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Season season = Season.Spring;
System.out.println(season);
System.out.println(season.name());
System.out.println(season.ordinal());
System.out.println(season.valueOf("Summer".toString()));
System.out.println(season.values().length);
}
publicenum Season{
Spring(1),Summer(),Autumn,Winter;
private Season(){System.out.println("first");}
private Season(int season){System.out.println("second");
}
}
输出结果为:
second
first
first
first
Spring
Spring
0
Summer
4
五. _实现带有抽象方法的枚举
1、定义枚举TrafficLamp
2、实现普通的next方法
3、实现抽象的next方法:
每个元素分别是由枚举类的子类来生产的实例对象,
这些子类采用类似内部类的方式进行定义。
4、增加上表示时间的构造方法
如果枚举元素后面没有大括号对,那是不会生产内部类的。
先看有内部类的效果,再看没有内部类的效果,eclipse自动删除原来的内部类。
枚举只有一个成员时,就可以作为一种单例的实现方式。
实例
publicclass EnumTest11 {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
}
publicenum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
returnGREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
returnYELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
returnRED;
}
};
public abstract TrafficLamp nextLamp();
privateinttime;
private TrafficLamp (int time){this.time=time;}
}
}