目录
从jdk5开始,java开始支持枚举。
枚举:
一组常量组织在一起,用花括号{}括起来,然后给它命名个类型,就是枚举。
枚举是类类型,只不过不能用new操作符,可以为枚举提供构造函数,添加数据/方法成员,甚至可以实现接口。
每个枚举常量都是所属枚举类型的对象,因此,如果为枚举提供了构造函数,那么每个枚举常量都会调用一次这个构造函数,并且每个枚举常量都有其自己的实例数据成员。
枚举的超类是 java.lang.Enum 类
enum关键字不过是个语法糖,枚举定义 enum MyEnum{} 可以理解为 public class MyEnum extends java.lang.Enum{}
枚举的定义:
enum Grade { // 枚举类型Grade 无构造函数的
Perfect,Good,Common,Bad // 拥有的四个常量,默认是 public static final
}
enum Grade2 { // 枚举类型Grade2 有构造函数的
Perfect(), Good(), Common(), Bad();
private int score; // 每种枚举常量值的分数
Grade2(){ } // 构造函数
Grade2(int score) { this.score = score; } // 构造函数
public int getScore(){
return score;
}
public void setScore(int score){
this.score = score;
}
}
枚举的用法:
-
枚举变量
Grade g = Grade.Perfect;//枚举g的值只能是枚举常量中的某一个
-
枚举的switch应用
switch(g){ // 枚举可以用在switch语句中
case Perfect:
case Good:
case Common:
System.out.println("考试及格!");
break;
case Bad:
System.out.println("考试不及格!");
break;
}
-
枚举的方法
for ( Grade e : Grade.values() ) // 枚举的values()的方法,返回枚举中的所有要素
System.out.println(e);
System.out.println( Grade.Bad.ordinal()); // 输出枚举值的下标索引,从0开始,这里输出3
System.out.println( Grade.Good.compareTo(Grade.Bad)); // 计算两个枚举值的下标索引的差值
System.out.println( Grade.Good.equals(Grade.Bad)); // 同枚举类型下,比较两个枚举值是否相同
-
枚举有数据成员的
Grade2.Perfect.setScore(90); //有构造函数的枚举:每个常量都是一个对象,都有自己的数据成员
System.out.println(Grade2.Perfect.getScore()); //输出90
Grade2.Good.setScore(80);
System.out.println(Grade2.Good.getScore()); //输出80
枚举的运用场景:
枚举是类类型,每一个枚举元素都是对象。我们想限定有限个该类类型的对象,并且每个对象的数据和行为都是各司其意的(有点同一个接口不同实现类的味道,实现多态),这时用枚举类型就很适合。
或者更简单的对枚举的一种认识:我们自己写了个类,这个类里面有数据成员,方法成员。不过我们不用new来实例化这个类,而是enum定义的时候,就定义好了几个枚举值常量,每个常量都是这个类的对象,而且是public static final修饰的对象。每个对象都有自己的数据成员私有副本,还可以实现出不同版本的方法成员。
- 单例模式
- 模板
枚举的小示例