枚举指的是将一个事物的所有情况列举出来,这个概念在数学中的概率那一块经常有所体现。用一个简单的例子加以说明,我们对投掷两个骰子时出现的点数进行记录,当把所有可能出现的情况都列举出来时,所体现的就是枚举的概念。这里可能引起误会的是,有人认为枚举要做实际试验才能完成,比如对抛硬币的情况进行枚举,那么就要实际投掷硬币来进行记录。其实枚举是说穷尽一切可能,而我们都知道投掷一枚硬币只有正面朝上和反面朝上两种可能,当然你要是实在要加上硬币可能立起来的情况也不无不可,你只要知道,当用某种手段将抛硬币可能出现的所有情况都列举出来时,用的就是枚举法,并不一定要亲自试验。
在java中,有时会需要我们编写一系列的常量,比如定义一个周的时间,一个班级的所有学生的名字,一年的季节,一年的的所有节气等,这时可以直接定义一个类,然后在这个类中定义相关的常量并进行赋值即可,当要使用这个常量时只需要调用这个类来了进行访问即可,就像在下面的这个程序中对一年四季进行了定义,使用时通过类名来访问相关常量即可。但是这样有两个弊端,一是如果不进行说明在打印的结果中我们很难理解每一个数字代表的实际意义,二是如果涉及大批量的数据比如编写一年的所有节气时代码的冗杂程度会明显提高。为了提高代码的可读性变更且减少许多不必要的工作,java中的枚举类便应运而生了。
package cn.jiangchen.enmu;
public class MySeason {
public static final int SPRING = 0;
public static final int SUMMER = 1;
public static final int AUTUMN = 2;
public static final int WINTER = 3;
public static void main(String[] args) {
System.out.println(MySeason.SPRING);
System.out.println(MySeason.SUMMER);
System.out.println(MySeason.AUTUMN);
System.out.println(MySeason.WINTER);
}
}
java中的枚举隐性继承自java.lang.Enum,因此枚举的本质依然是类,只不过在这个类中只定义了常量,并且这些常量不需要进行赋值操作,当你在枚举类中输入常量名称时,系统会默认为这些常量是由public static final修饰的,因此你也不需要书写修饰符以及相关关键字,并且当你写入常量时,系统会自动给这些常量进行赋值操作,你也不需要再对其进行赋值操作。更加令人意外的是,当你对这些常量的本身进行打印操作的时候,它的打印结果就是它的常量名,因此你也不需要在意系统给你的这个常量赋了一个什么样的值。
java中的枚举的定义格式为:
enum 枚举名 {
枚举体(常量列表)
}
通过这个格式就可以定义一个枚举类型。
枚举中枚举体的访问依旧遵循类中常量的访问规则。但是要注意的是在枚举中有一个遍历操作,这里涉及到了枚举中的方法values()。这个方法返回的是一个数组,这个数组中储存了枚举体中的所有元素,对这个数组进行遍历操作就是对枚举进行遍历操作。并且这里进行打印操作的时候,它的返回值依旧是常量名称,并不是系统赋给常量的各种类型的值。
此外,枚举还可以和switch语句联合使用,当往switch语句中传入一个属于枚举的数组时,switch语句中case后面的情况就可以是枚举体中的内容。以下为演示代码:
package cn.jiangchen.enmu;
import java.io.RandomAccessFile;
import java.util.Random;
/**
* 测试枚举
*/
public class TestEnum {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
//枚举遍历
for(Week k :Week.values()){ //Week.values()返回的Week[]中包含了所有的枚举元素
System.out.print(k+"\t");
}
System.out.println();
//int a = new Random().nextInt(4);
int b = new Random().nextInt(4);
int a = (int)(Math.random()*4);
switch(Season.values()[a]){
case SPRING :
System.out.println("春天");
break;
case SUMMER :
System.out.println("夏天");
break;
case AUTUMN :
System.out.println("秋天");
break;
case WINTER :
System.out.println("冬天");
break;
}
}
}
enum Season {
SPRING,SUMMER,AUTUMN,WINTER
}
enum Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期天
}