枚举
1、用普通类实现枚举功能。(定义变量,规定值的指定范围)
代码:
package com.wuyezhu.javaenhance;
//普通类实现枚举
class WeekDay{
private WeekDay(){}; //私有的构造方法
//每个元素分别用一个公有的静态成员变量表示,示例周日和周一
public static final WeekDay SUN = new WeekDay();
public static final WeekDay MON =new WeekDay();
/*可以有若干公有方法或抽象方法。采用抽象方法定义nextDay
* 就将大量的if.else语句转移成了一个个独立的类。
*/
public WeekDay nextDay(){ //明天周几方法
if(this == SUN)
return MON;
//...省略其他if...else
else
return SUN;
}
//重写的toString方法,用于返回对象信息
public String toString(){
return this == SUN ? "SUN" : "MON";
}
}
public class enum1 {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay wd = WeekDay.MON;
System.out.println(wd.nextDay()); //输出SUN
}
}
2、定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。
3、可以有若干公有方法或抽象方法。采用抽象方法定义nextDay, 就将大量的if.else语句转移成了一个个独立的类。
代码:
package com.wuyezhu.javaenhance;
//普通类实现枚举
abstract class WeekDay1{
private WeekDay1(){}; //私有的构造方法
abstract WeekDay1 nextDay(); //采用抽象方法定义nextDay,就将大量的if.else语句转
//移成了一个个独立的类。
public static final WeekDay1 SUN = new WeekDay1(){
public WeekDay1 nextDay(){
return MON;
}
};
public static final WeekDay1 MON =new WeekDay1(){
public WeekDay1 nextDay(){
return SUN;
}
};
//重写的toString方法,用于返回对象信息
public String toString(){
return this == SUN ? "SUN" : "MON";
}
}
public class enum2 {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay1 wd = WeekDay1.MON;
System.out.println(wd.nextDay());
}
}
4、简单的枚举。枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
代码:
package com.wuyezhu.javaenhance
public class enumTest {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay2 wd1 = WeekDay2.SAT;//创建对象
System.out.println(wd1.name());
System.out.println(wd1.values().length);//获取枚举数组的长度
System.out.println(wd1.getClass());//获取枚举所属的类
System.out.println(wd1.ordinal());//顺序int
System.out.println(wd1.valueOf("SUN").toString());//字符形式
}
}
enum WeekDay2{
SUN,MON,TUE,WED,THI,FRI,SAT;
}
5、带有构造方法的枚举
代码:
public enum WeekDay{
SUN(64),MON(),TUE,WED,THI,FRI,SAT;
//只要用到这个枚举类,这里面的静态变量都会初始化,
//只要用到了类,它里面的静态代码都会被执行.被执行的时候,
//它里面的构造方法都被调用了
private WeekDay(){System.out.println("first");}
//位于元素列表之后,列表后加分号。
private WeekDay(int day){System.out.println("second");}}
6、复杂的枚举
代码:
public enum TrafficLamp{
RED(30){//red是一个元素,他是由Traffic的子类实现的。
public TrafficLamp nextLamp() {
return GREEN;}
//子类的实现代码,带了抽象方法。
//类里面可以定义静态常量,常量指向的结果就是自己这个类型的实际对象。
} ,GREEN(45){//new子类的实际对象,调用父类的有参的构造方法,
//然后拿GREEN这个名称去引用这个对象。[最复杂的枚举]
public TrafficLamp nextLamp() {
return YELLOW;}
},YELLOW(3){
public TrafficLamp nextLamp() {
return RED;}
};//每一个元素都是这个类的实例对象
//RED这个实例不能拿着这个类去new了,只能去找它的子类new,并且名字是RED。
//在哪里去找这个子类:
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time=time;}
}
7、枚举总结
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
带构造方法的枚举:
构造方法必须定义成私有的
如果有多个构造方法,该如何选择构造方法?
枚举元素MON和MOM()的效果一样,都是调用默认的构造方法。
带有方法的枚举:
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
增加上表示时间的构造方法。
枚举只有一个成员时,就可以作为一种单例的实现方式。