package fighting;
/**
* 枚举就是一个类
* 注意:枚举只有一个成员时,就可以作为一种单例的实现方式
*/
public class EnumDemo {
public static void main(String[] args) {
//枚举就相当于一个类,枚举的成员(元素)就相当于类的一个实例对象
WeekDay weekDay11 = WeekDay.FRI;
//枚举自动实现了toString方法,所以直接打印weekDay11会输出FRI
System.out.println(weekDay11);
//
System.out.println(weekDay11.name());
//排行
System.out.println(weekDay11.ordinal());
//枚举这个类的静态方法valueOf,通过传来的String对象,转换成WeekDay对象(即枚举元素),
//这个方法掉用了WeekDay.valueOf("SUN").toString方法
System.out.println(WeekDay.valueOf("SUN"));
//枚举的values方法把所有元素转换成了数组
System.out.println(WeekDay.values().length);
TranfficLamp tranfficLamp =TranfficLamp.RED;
}
//带有构造方法的枚举
public enum WeekDay{
/**
* 注意:只要用到了枚举类,它里面的的静态变量就会被初始化
* 只要用到了类,它里面的静态代码就会执行
* 元素列表等效于静态成员变量,
* 所以一调用枚举,元素列表就会初始化,构造方法就会执行
*
*/
//枚举的元素列表,必须位于所有成员之前。
//如果元素列表之后有其他成员,列表的最后要加分号
SUN(1),MON(),TUE,WED,THU,FRI,SAT;
//枚举的构造方法必须是私有的,用private修饰
//SUN(1)以外的元素都是调用第一个无参数的构造方法
private WeekDay(){
System.out.println("first");
}
//SUN(1)调用的第二个有参数的构造方法
private WeekDay(int day){
System.out.println("second");
}
}
/**
* 内部类可以用4个访问修饰符,
* 外部类可以有2个访问修饰符:默认的和public
* 因为内部类与成员变量和成员方法是平级的,
* 所以成员变量和成员方法有什么,内部类就有什么
* 所以这里可以用public修饰
*/
//带有抽象方法的枚举
public enum TranfficLamp{
/**
* 每个元素是枚举类TranfficLamp的一个实例对象
* 现在因为是枚举类,肯定不能直接用TranfficLamp去new一个实例对象
*
*/
/**
* RED是由TranfficLamp的子类来实例化的,不知道子类的名字,所以用匿名类
*
* 编译这个枚举,会生成以下四个字节码文件
* EnumDemo$TranfficLamp.class
* EnumDemo$TranfficLamp$1.class
* EnumDemo$TranfficLamp$2.class
* EnumDemo$TranfficLamp$3.class
*/
/**
* 补一个知识点:
* new Date(){};这表示创建Date类的一个子类,
* 大括号里直接就可以写子类的代码,
* 这时,子类调用父类的无参构造方法;
* 如果希望子类调用父类的有参构造方法,可以使用new Date(300){};
*
* 所以下面的RED(30){}代码,就相当于new子类的实例对象,
* 并且调用父类的有参构造方法,
* 使用的时候,用RED这个引用对象
*/
RED(30) {
@Override
public TranfficLamp nextLamp() {
return GREEN;
}
},GREEN(45) {
@Override
public TranfficLamp nextLamp() {
return YELLOW;
}
},YELLOW(5) {
@Override
public TranfficLamp nextLamp() {
return RED;
}
};
//这个方法的返回值还是自己的类型,并且这个方法 是抽象的,需要子类去实现这个方法
public abstract TranfficLamp nextLamp();
private int time;
private TranfficLamp(int time){
this.time = time;
}
}
}