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; } } }