—————————————————————————————————————————————————————————————————————————————
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报错误。
带构造方法的枚举
1、构造方法必须定义成私有的
2、如果有多个构造方法,该如何选择哪个构造方法?
3、枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
带抽象方法的枚举
1、定义枚举TrafficLamp
2、实现普通的next方法。
3、实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类对象采用类似内部类的方式进行定义。
4、增加上表示时间的构造方法
枚举只有一个成员时,就可以作为一种单例的实现方式。
—————————————————————————————————————————————————————————————————————————————
带构造方法的枚举代码:
public class EnumTest {
public static void main(String[] args) {
WeekDay w = WeekDay.FRI;
System.out.println("w="+w);//FRI
System.out.println(w.name());//FRI
System.out.println(w.ordinal());//5,排行老几
System.out.println(WeekDay.valueOf("SUN").toString());//SUN
System.out.println(WeekDay.values().length);//7,返回一个数组,数组的长度
}
public enum WeekDay{
//在枚举元素的后面跟上一对括号,就表示创建这个元素指向实例对象的时候,是使用哪个构造方法。
SUN(1),MON(),TUE,WED,THI,FRI,SAT;//元素列表必须放在最前面
/*
*定义构造方法时
* 1、必须位于元素列表之后。
* 2、构造方法必须是私有的。
* 3、构造方法必须有代码体,即,加上大括号
*/
private WeekDay(){System.out.println("first");};
private WeekDay(int day){System.out.println("second");};
}
}
执行结果:
second
first
first
first
first
first
first
w=FRI
FRI
5
SUN
7
带抽象方法的枚举代码:
package cn.itcast.day1;
public class EnumTest {
public static void main(String[] args) {
WeekDay w = WeekDay.FRI;
System.out.println("w="+w);//FRI
System.out.println(w.name());//FRI
System.out.println(w.ordinal());//5,排行老几
System.out.println(WeekDay.valueOf("SUN").toString());//SUN
System.out.println(WeekDay.values().length);//7,返回一个数组,数组的长度
}
/*
* 定义一个交通灯的枚举
*/
public enum TrafficLamp{
RED{//RED是一个元素,这个元素是由TrafficLamp的子类来实现的
@Override
public TrafficLamp nextLamp() {
return GREEN;//红灯后,返回绿灯
}
},
GREEN{//GREEN是一个元素,这个元素是由TrafficLamp的子类来实现的
@Override
public TrafficLamp nextLamp() {
return YELLOW;//绿灯后,返回黄灯
}
},
YELLOW{//YELLOW是一个元素,这个元素是由TrafficLamp的子类来实现的
@Override
public TrafficLamp nextLamp() {
return RED;//黄灯后,返回红灯
}
};
//抽象方法
public abstract TrafficLamp nextLamp();
}
}
下面定义成员变量—交通灯的时间time,然后再定义一个构造方法来指定每个灯的时间,构造方法必须是私有的。
这个时候,每个元素(RED,GREEN,YELLOW)调用的时候,元素后面都跟上一对括号,表示指定哪个构造方法。
package cn.itcast.day1;
public class EnumTest {
public static void main(String[] args) {
WeekDay w = WeekDay.FRI;
System.out.println("w="+w);//FRI
System.out.println(w.name());//FRI
System.out.println(w.ordinal());//5,排行老几
System.out.println(WeekDay.valueOf("SUN").toString());//SUN
System.out.println(WeekDay.values().length);//7,返回一个数组,数组的长度
}
/*
* 定义一个交通灯的枚举
*/
public enum TrafficLamp{
<strong>//这个时候,每个元素调用的时候,元素后面都跟上一对括号,表示指定哪个构造方法
RED(30){//RED是一个元素,这个元素是由TrafficLamp的子类来实现的
@Override
public TrafficLamp nextLamp() {
return GREEN;//红灯后,返回绿灯
}
},
GREEN(45){//GREEN是一个元素,这个元素是由TrafficLamp的子类来实现的
@Override
public TrafficLamp nextLamp() {
return YELLOW;//绿灯后,返回黄灯
}
},
YELLOW(5){//YELLOW是一个元素,这个元素是由TrafficLamp的子类来实现的
@Override
public TrafficLamp nextLamp() {
return RED;//黄灯后,返回红灯
}
};
//抽象方法
public abstract TrafficLamp nextLamp();
//成员变量,时间
private int time;
//构造方法
private TrafficLamp(int time){this.time = time;}
}
}