1、枚举类型
枚举类型定义了一个枚举值的列表。枚举类型的值类似一个常量,因此,按惯例拼写都是大写字母。枚举类型的命名类似一个类,每个单词首字母大写。
enum Day{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,STAURDAY};
Day day;
变量day可以具有定义在枚举类型Day中的一个值或者null,但是不能有其他的值。枚举类型是类型安全的,这意味着试图赋予一个除枚举类型所列出的值或者null之外的一个值,都将导致编译错误。可以在同一行语句中来声明和初始化一个变量:
Day day1=Day.SUNDAY;
枚举类型被作为一个特殊的类来对待,因此,枚举类型的变量是引用变量。一个枚举类型是Object类Comparable接口的子类型。所以,它继承了object类的所有方法以及comparable接口中的compareTo方法。另外,枚举类型的变量还可以使用这两个方法:
public String name();
这个方法返回名字值。
public int ordinal();
这个方法返回和枚举值关联的序号值。枚举类型中的第一个值具有序列数0,第二个值具有序列数1,,,。
package test;
public class project1 {
static enum Day{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,STAURDAY};
public static void main(String []args) {
Day day1=Day.FRIDAY;
Day day2=Day.THURSDAY;
Day day3=Day.STAURDAY;
System.out.println("day1's name is "+day1.name());
System.out.println("day2's name is "+day2.name());
System.out.println("day3's name is "+day3.name());
System.out.println("day1's ordinal is "+day1.ordinal());
System.out.println("day2's ordinal is "+day2.ordinal());
System.out.println("day3's ordinal is "+day3.ordinal());
System.out.println("day1 equals day2 ? "+day1.equals(day2));
System.out.println("day1.toString is "+day1.toString());
System.out.println("day2 compareTo day3 is "+day2.compareTo(day3));
}
}
运行结果:
day1's name is FRIDAY
day2's name is THURSDAY
day3's name is STAURDAY
day1's ordinal is 5
day2's ordinal is 4
day3's ordinal is 6
day1 equals day2 ? false
day1.toString is FRIDAY
day2 compareTo day3 is -2
枚举类型可以在一个类中定义,这时,枚举类型被作为内部类对待;
枚举类型也可以单独定义:
package test;
enum Day{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,STAURDAY};
public class project1 {
public static void main(String []args) {
.........
}
}
这种情况下,枚举类型被作为一个独立的类来对待,程序编译之后,将创建一个名为Day.class的类。
当一个枚举类型在一个类中声明时,必须声明为类的一个成员,而不能在方法中声明。而且,类型总是static的,所以,static 写不写都可以。
2、使用foreach循环处理枚举值
每个枚举类型都有一个静态方法values(),可以以一个数组返回这个类型中所有的枚举值。
Day[] days=Day.values();
for(Day day:days){
System.out.print(day);
}
3、具有数据域,构造方法和方法的枚举类型
package test;
public enum TrafficLight {
RED("红灯停"),GREEN("绿灯行"),YELLOW("黄灯请注意"); //定义枚举值
private String description; //数据域
private TrafficLight(String description) { //私有构造方法
this.description=description;
}
public String getDescription() {
return description;
}
public static void main(String []args) {
TrafficLight light=TrafficLight.RED;
System.out.print(light.getDescription());
}
}
运行结果:
红灯停
值的声明必须是类型声明的第一条语句。当访问枚举值时,构造方法将被调用。枚举值的参数将传递给构造方法,在构造方法中赋值给description。在主函数中,一个枚举值TrafficLight.RED赋值给变量light,访问TrafficLight.RED引起JVM使用参数“红灯停”调用构造方法。Java语法要求枚举类型的构造方法是私有的,避免被直接调用,私有修饰符可以被省略。