Java中是使用enum关键词声明枚举类,具体定义放在一对大括号内,枚 举的语法格式如下:
[public] enum 枚举名 { 枚举常量列表 }
enum前面的修饰符是[public]表示public或省略。public是公有访问级别,可以在任何地方访问。省略是 默认访问级别,只能在当前包中访问。
最简单形式的枚举类
public enum WeekDays { // 枚举常量列表 MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY }
在枚举类WeekDays中定义了5个常量,使用枚举类WeekDays代码如下:
class HelloWorld{ public static void main(String[] args) { // day工作日变量 WeekDays day = WeekDays.FRIDAY; System.out.println(days); switch (day){ case MONDAY: System.out.println("周一"); break; case TUESDAY: System.out.println("星期二"); break; case WEDNESDAY: System.out.println("星期三"); break; case THURSDAY: System.out.println("星期四"); break; default: //case FRIDAY: System.out.println("星期五"); } } }
输出结果:
FRIDAY 星期五
枚举类中成员变量和成员方法
枚举类可以像类一样包含成员变量和成员方法,成员变量可以是实例变量也可以是静态变量,成员方 法可以是实例方法,也可以是静态方法,但不能是抽象方法。
public enum WeekDays { // 枚举常量列表 MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY; // 实例变量 private String name; private int index; // 静态变量 private static int staticVar = 80; // 覆盖父类中的toString()方法 @Override public String toString(){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(name); stringBuilder.append("-"); stringBuilder.append(index); return stringBuilder.toString(); } // 实例方法 public String getString(){ // 调用父类String中的toString方法 return super.toString(); } // 静态方法 public static int getStaticVar(){ return staticVar; } }
使用枚举类WeekDays代码如下:
public class HelloWorld { public static void main(String[] args) { // day工作日变量 WeekDays day = WeekDays.FRIDAY; //打印day默认调用枚举toString()方法 System.out.println(day); //调用枚举实例方法 System.out.println(day.getInfo()); //调用枚举静态方法 System.out.println(WeekDays.getStaticVar()); } }
枚举类构造方法
上面示例中实例变量name和index,都是没有初始化,在类中成员变量的初始化是通过构造方法 实现的,而在枚举类中也是通过构造方法初始化成员变量的。
添加构造方法,代码如下:
public enum WeekDays { // 枚举常量列表 MONDAY("周一",0), TUESDAY("周二",1), WEDNESDAY("周三",2), THURSDAY("周四",3), FRIDAY("周五",4); // 实例变量 private String name; private int index; // 静态变量 private static int staticVar = 80; // 构造方法 private WeekDays(String name,int index){ this.name = name; this.index = index; } // 覆盖父类中的toString()方法 @Override public String toString(){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(name); stringBuilder.append("-"); stringBuilder.append(index); return stringBuilder.toString(); } // 实例方法 public String getString(){ // 调用父类String中的toString方法 return super.toString(); } // 静态方法 public static int getStaticVar(){ return staticVar; } }
注意枚举类的中的构造方法只能是私有访问级别,构造方法可以 省略private关键字,但它仍然是私有的构造方法。这也说明了枚举类不允许在外部创建对象。
一旦添加了有参数的构造方法,那么“枚举常量列表”也需要修改,每一个枚举常量都 是一个实例,都会调用构造方法进行初始化成员变量,(“星期一”, 0)是调用构造方法。
枚举常用方法
所有枚举类都继承java.lang.Enum类,Enum中定义了一些枚举中常用的方法:
int ordinal():返回枚举常量的顺序。这个顺序根据枚举常量声明的顺序而定,顺序从零开始。
枚举类型[] values():静态方法,返回一个包含全部枚举常量的数组。
枚举类型 valueOf(String str):静态方法,str是枚举常量对应的字符串,返回一个包含枚举类型 实例。
见完整代码
//枚举类 public enum WeekDays { // 枚举常量列表 MONDAY("周一",0), TUESDAY("周二",1), WEDNESDAY("周三",2), THURSDAY("周四",3), FRIDAY("周五",4); // 实例变量 private String name; private int index; // 静态变量 private static int staticVar = 80; // 构造方法 private WeekDays(String name,int index){ this.name = name; this.index = index; } // 覆盖父类中的toString()方法 @Override public String toString(){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(name); stringBuilder.append("-"); stringBuilder.append(index); return stringBuilder.toString(); } // 实例方法 public String getString(){ // 调用父类String中的toString方法 return super.toString(); } // 静态方法 public static int getStaticVar(){ return staticVar; } } class HelloWorld{ public static void main(String[] args) { // day工作日变量 WeekDays days = WeekDays.FRIDAY; System.out.println(days); switch (days){ case MONDAY: System.out.println("周一"); break; case TUESDAY: System.out.println("星期二"); break; case WEDNESDAY: System.out.println("星期三"); break; case THURSDAY: System.out.println("星期四"); break; default: //case FRIDAY: System.out.println("星期五"); } System.out.println(days.getString()); System.out.println(WeekDays.getStaticVar()); // 返回一个包含全部枚举常量的数组 WeekDays[] allvalues = WeekDays.values(); // 遍历枚举常量数值 for (WeekDays value:allvalues){ System.out.printf("%d - %s\n",value.ordinal(),value); } // 创建Weekdays对象 WeekDays days1 = WeekDays.FRIDAY; WeekDays days2 = WeekDays.valueOf("FRIDAY"); System.out.println(days1 == WeekDays.FRIDAY); System.out.println(days1.equals(WeekDays.FRIDAY)); System.out.println(days1 == days2); } }
运行结果:
周五-4 星期五 FRIDAY 80 0 - 周一-0 1 - 周二-1 2 - 周三-2 3 - 周四-3 4 - 周五-4 true true true
这里又会涉及到两种比较方法==和equals。
- ==比较的是两个引用是否指 向同一个对象
- equals是比较对象内容是否相同