这个解释起来比较复杂,先从一个简单的入手,要认真看
使用枚举是为了在项目中别人用到我自己写的一个类的对象时,只能使用我规定的那些值,避免发生错误.
一先用一个普通类模拟枚举(以星期类WeekDay为例)
1先创建一个普通类WeekDay
public class WeekDay{
private WeekDay(){} //构造函数一定要是私有的
pvirate final static WeekDay SUN = new WeekDay();
pvirate final static WeekDay MON= new WeekDay();
//因为时间问题,就写了两个
//因为WeekDay是自己定义的一个类,所以要打印时,就要覆盖toString()
public String toString(){
}
}
2在包含主函数的类中使用WeekDay
public class TestEnum{
public static void main(String args[]){
WeekDay weekday = WeekDay.MON;
//这样在main函数中使用weekday时,只能使用我定义好的那几个静态的值
}
}
以上是用普通的类来实现枚举,从这就可以看出枚举中的元素其实都是一个此类型的对象.
二用关键字enum来创建枚举
public class TestEnum{
public static void main(String args[]){
WeekDay weekday = WeekDay.SUN;
}
//使用enum关键字创建枚举
public enum WeekDay{
SUN,MON,TUE,WED,THI,FIR,SAT;//分号可以写可以不写
}
}
使用jdk写好枚举比我们自己写的要省事,并且还有一些方法供我们使用.
三枚举类型的深入解析
1在枚举中定义构造函数//从这要认真看,那个交通灯的例子用到了这种思想
public class TestEnum {
public static void main(String[] args) {
Weekday weekday = Weekday.FIR;
System.out.println(weekday);
}
public enum Weekday
{
SUN,MON,TUE,WED,THI,FIR,SAT;//在枚举中有其他方法时,分号必须写
private Weekday()//枚举的构造方法必须是私有的,并且写在元素的后面
{
System.out.println("first");
}
private Weekday(int day)
{
System.out.println("second");
}
}
}
当程序执行时可以看到,枚举在实例化时用到的是没有参数的构造函数;如果想要使用带参数的构造函数就要修改枚举类型:
public enum Weekday
{
SUN(1),MON(),TUE,WED,THI,FIR,SAT;
}
这样在SUN实例化时就会使用带参数的构造函数,虽然MON带了括号,但是实例化时还是用的是不带参数的构造函数.
对于交通灯的那个例子,
RED(30){
03. public TrafficLamp nextLamp(){
04. return GREEN;
05. }
RED(30)中RED是枚举TrafficLamp的一个子类对象,并用RED来表示此子类对象,它调用的是带参数的构造函数,因为RED,GREEN,YELLOW都是枚举TrafficLamp创建的子类对象,所以子类必须重写父类中的抽象方法 |