package javase.gaoxin.jishu;
/*模拟JAVA中枚举类型的实现方式
* 从以下的实验可以总结出:
* 1)枚举类中的成员(除了枚举常量以外)都必须是private的;
* 2)当枚举类只有一个‘枚举常量’时可以作为‘单例’
*/
public class WeekDay1 {
public WeekDay1() {}
//★★从以下枚举类的‘枚举常量’的‘定义’可以看出,每一个‘枚举常量’都是所在枚举类的一个‘实例对象’
public final static WeekDay1 SUN = new WeekDay1();
public final static WeekDay1 MON = new WeekDay1();
public WeekDay1 nextDay(){
if(this==SUN){
return MON;
}
else
return SUN;
}
public String toString() {
return this==SUN?"SUN":"MON" ;
}
public static void main(String[] args) {
System.out.println("WeekDay1's "+WeekDay1.MON);
System.out.println("WeekDay1's "+WeekDay1.MON.nextDay());
System.out.println(WeekDay.MON);//查看控制台输出,有6个constructMethod1和1个constructMethod2,这是因为枚举类的所有枚举常量都是final static的
} //调用枚举类的枚举常量,也就实例化了枚举类的一个实例,此时枚举类中static类型的成员首先初始化,故先有了7个输出
public enum WeekDay {
/*当枚举类有多个构造方法时,可以在枚举常量的后边加上"(int i)",‘i’为枚举类的构造方法的顺序*/
SUN(),MON(1),TUE,WED,THI,FRI,SAT;
/*枚举类中的‘所有’【方法】或【代码段】都必须放在‘枚举常量’的‘后边’*/
//public WeekDay(){};
private WeekDay(){System.out.println("constructMethod1");}; //枚举类的构造方法必须为私有的
private WeekDay(int x){System.out.println("constructMethod2");};
}
public enum TrafficLamp {
/* 看的懂下面的写法吗?很简单:因为‘枚举常量=枚举类的实例’;而‘枚举常量()=枚举类的实例(枚举类不同的构造函数)’,
* 即用枚举类的不同的构造函数来定义枚举常量;而枚举常量后跟的‘{}’中内容其实是个‘匿名类’,匿名类的定义是:
* new 父类或接口名(){},所以下面的枚举常量的定义步骤可以分解为以下几步:
* 1) RED(int time) = new TrafficLamp(int time);
* 2) new TrafficLamp(int time){
* .........
* };
*
*/ RED(30){
public TrafficLamp nextLamp(){
return YEELOW;
}
},
YEELOW(5){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return RED;
}
};
private int time;
private TrafficLamp(int time){
this.time=time;
}
}
}