枚举


Java 枚举(enum)

  1. Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
  2. Java 枚举类使用 enum 关键字来定义,其地位和class和interface相同,枚举类中的枚举值都是public static final的,各个常量使用逗号 , 来分割。
  3. 一个Java源文件中最多只能有一个public 类型的枚举类,且该Java源文件的名字也必须和该枚举类的类名相同;
  4. 枚举类的所有实例(枚举值)必须在枚举类的第一行显示地写出,否则这个枚举类将永远不能产生实例,列出这些实例(枚举值),系统会自动添加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);
    }
}
  1. 枚举是属于引用数据类型,里面的每一个值是看作常量,
  2. 如果方法的返回结果只有两种结果,建议使用布尔类型,如果运算结果的情况是超过两种,可以一枚一枚的列举出来,建议使用枚举类型

values(), ordinal() 和 valueOf() 方法

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了java.lang.Seriablizable 和 java.lang.Comparable 两个接口
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  1. values() 返回枚举类中所有的值,是数组形式
  2. ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  3. 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
*/
	}
}

枚举类成员

  1. 枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用调用构造器,只能在构造枚举值时被调用
  2. 枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。
    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
*/

相关