枚举
Java 枚举(enum)
- Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
- Java 枚举类使用 enum 关键字来定义,其地位和class和interface相同,枚举类中的枚举值都是public static final的,各个常量使用逗号 , 来分割。
- 一个Java源文件中最多只能有一个public 类型的枚举类,且该Java源文件的名字也必须和该枚举类的类名相同;
- 枚举类的所有实例(枚举值)必须在枚举类的第一行显示地写出,否则这个枚举类将永远不能产生实例,列出这些实例(枚举值),系统会自动添加public static final修饰,无需程序员自己手动添加
例如定义一个颜色的枚举类。
enum Color
{
RED, GREEN, BLUE;
//以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。
}
public class Test
{
// 执行输出结果
public static void main(String[] args)
{
Color c1 = Color.RED;//用”枚举类型名.枚举值“ 实现调用
System.out.println(c1);
}
}
- 枚举是属于引用数据类型,里面的每一个值是看作常量,
- 如果方法的返回结果只有两种结果,建议使用布尔类型,如果运算结果的情况是超过两种,可以一枚一枚的列举出来,建议使用枚举类型
values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了java.lang.Seriablizable 和 java.lang.Comparable 两个接口
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值,是数组形式
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。(不存在的会报错 IllegalArgumentException)
enum Color
{
RED, GREEN, BLUE;
}
public class Meiju {
public static void main(String[] args) {
// 调用 values(),并将每一个枚举值放到数组中,每一个元素就是枚举类型
Color[] arr = Color.values();
// 迭代枚举 for(x:y[x,x,x]) for in 循环,其中用的是冒号,不是in
for (Color col : arr)
{
// 查看索引 调用ordinal()
System.out.println(col + " at index " + col.ordinal());
}
// 使用 valueOf() 返回枚举常量,
System.out.println(Color.valueOf("RED"));
System.out.println(Color.valueOf("WHITE"));
//不存在的会报错 java.lang.IllegalArgumentException: No enum constant Color.WHITE
/*输出结果:
RED at index 0
GREEN at index 1
BLUE at index 2
RED
*/
}
}
枚举类成员
- 枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用调用构造器,只能在构造枚举值时被调用
- 枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。
Gender.java
public enum Gender {
//实现带有 有参构造器的枚举
MAN("女性"),WOMEN("男性");//通过括号赋值,各个枚举值用逗号隔开
//其后有私有化的属性(自动默认)和private的有参构造器,赋值要么全赋值,跟有参构造,要么都不赋值,跟无参构造
String v = "";//必须要初识化一个参数
private Gender(String v) {
this.v = v;
}
public String getV() {
return v;
}
public void setV(String v) {
this.v = v;
}
// MAN(),WOMEN();
// private Gender() {
// }
//重写String toSting()方法
public String toString() {
return v;
}
}
Meiju02.java
public class Meiju02 {
public static void main(String[] args) {
for(Gender m:Gender.values()) {
System.out.println(m);
/*没有重写String toSting()方法之前的输出结果:
* MAN
WOMEN*/
/*重写String toSting()方法之后的输出结果:
* 女性
男性
*/
}
}
}
enum Color
{
RED, GREEN, BLUE;
// 构造函数
private Color()
{
System.out.println("Constructor called for : " + this.toString());
}
public void colorInfo()
{
System.out.println("Universal Color");
}
}
public class Meiju {
public static void main(String[] args) {
Color c1 = Color.RED;//此处没有构造方法,会默认调用无参的构造方法?
System.out.println(c1);
c1.colorInfo();
}
}
/*运行结果:
Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal Color
*/