------- android培训、java培训、期待与您交流! ----------
枚举的概念:
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。。
枚举的特点:
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
枚举的常用方法:
static name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
static toString() 返回枚举常量的名称,它包含在声明中。
static Enum valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
枚举的创建:
带构造方法的枚举:
构造方法必须定义成私有的(因为枚举的对象是固定的,不允许外界对象调用枚举的方法创建新的对象);
如果有多个构造方法,那么可以在枚举对象后面加带参数列表的小括号来标示调用的是哪个构造方法;
如下例子中,SUN(1),调用的是带参数的构造方法。
public class EnumTest {
public static void main(String[] args) {
WeekDay.SUN.next();
}
public enum WeekDay {
SUN(1),MON,TUR,WED,THU,FRI,SAT;
private WeekDay() {System.out.println("first!");};
private WeekDay(int i) {System.out.println("second!");};
public String next() {
if(this == SUN) {
return "sun";
}
return null;
}
}
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
如果创建的枚举中有抽象方法,那么每个元素后面要分别用匿名内部类来实现该抽象方法。
写带有抽象方法的枚举步骤和技巧:
1. enumTrafficLamp{RED,GREEN,YELLOW}
2. enumTrafficLamp{RED,GREEN,YELLOW;public abstract next();}
3.enumTrafficLamp{RED{},GREEN{},YELLOW{};public abstract next();}
4.填充各个{}中的next方法。
模仿枚举:下面用普通类模仿枚举,以加深对枚举的理解。
class EnumTest {
public static void main(String[] args) {
WeekDay1 weekDay=WeekDay1.MON;
System.out.println(weekDay.nextDay());
WeekDay2 weekDay2=WeekDay.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(weekDay.valueOf("SUN").toString());
System.out.println(weekDay.values().length);
}
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second") ;}
}
枚举的基本应用:
当所需的对象就是确定而且不是很多时,用枚举就非常的方便了。如一周的七天,Color,交通灯等。
枚举只有一个成员时,就可以作为一种单例的实现方式。
如果想在一个类中编写完各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。
举例:
public class WeekDayTest{
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay.nextDay());
}
}
public class WeekDay{
private Weekday(){}
public final static WeekDay SUN=new WeekDay();
public final static WeekDay MON=new WeekDay();
public void nextDay()
{
if(this==SUN)
{
return MON;
}else {
return SUN;
}
}
public String toString()
{
return this==SUN?"sun":"MON";
}
}
public class EnumTest {
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay.nextDay());
WeekDay weekDay2=WeekDay.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(weekDay.valueOf("SUN").toString());
System.out.println(weekDay.values());
}
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT;
}
}