目录
1.什么是枚举
- JDK1.5引入了新的类型——枚举。
- 在JDK1.5 之前,我们定义常量都是: public static fianl.... 。很难管理。
- 枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 用于定义有限数量的一组同类常量,
- 例如:
- 错误级别: 低、中、高、急
- 一年的四季: 春、夏、秋、冬
- 商品的类型: 美妆、手机、电脑、男装、女装...
- 在枚举类型中定义的常量是该枚举类型的实例。
- 比如线程的状态类Thread.State就是枚举类型,6个状态常量就是该类实例。
2.定义格式
权限修饰符 enum 枚举名称 {
实例1,实例2,实例3,实例4;
}
jdk1.5前是这样模拟枚举类型
package demo;
/**
* 1.描述级别的枚举类型
* 枚举:将相关(同一种类型)的常量分组到一个枚举类型Level中
* jdk1.5前没有枚举类型时是这样描述的:
* 下面定义枚举类型Level和3个级别常量(实例)
*/
public class Level {
//3.定义公开的级别类型(向外界暴露),级别类型是在本类中创建的(Level()被封装了)
public static final Level LOW=new Level(1);
public static final Level MEDIUM=new Level(50);
public static final Level HIGH=new Level(100);
private int levelValue;//1.级别值:描述级别种类
//2.程序员定好几种级别后,不允许其他人再添加级别种类
//可以将构造方法私有化(封装)只能在本类由程序员创建级别种类,不让别人创建对象
private Level(int levelValue){
this.levelValue=levelValue;
}
public int getLevelValue() {
return levelValue;
}
public void setLevelValue(int levelValue) {
this.levelValue = levelValue;
}
}
jdk1.5后出现枚举类型
下面是Level1枚举类型,有3个常量
package demo;
/**
* jdk1.5后出现枚举类型
*/
public enum Level1 {
//LOW(1)相当于调用构造器创建一个LOW级别,同理
LOW(1),MEDIUM(50),HIGH(100);
private int levelValue; //封装属性,私有化
private Level1(int LevelValue){ //封装构造器,私有化
this.levelValue=levelValue;
}
public int getLevelValue() {
return levelValue;
}
public void setLevelValue(int levelValue) {
this.levelValue = levelValue;
}
}
常用的定义枚举的方式:不给值,直接名称表示级别
package demo;
/**
* 这样就算是一个枚举类型Level3,里面有三个级别
*/
public enum Level3 {
LOW,MEDIUM,HIGH;
}
3.枚举类主要方法
1.只有toString可以重写。
package demo;
/**
* 枚举类常用方法
*
*/
public class Level3Main {
public static void main(String[] args) {
//1.比较此枚举与指定对象的顺序(右移为负位)
System.out.println(Level3.LOW.compareTo(Level3.HIGH));//LOW右移2个位置到HIGH,输出-2
System.out.println(Level3.LOW.compareTo(Level3.MEDIUM));//-1
System.out.println(Level3.HIGH.compareTo(Level3.LOW));//左移2,输出2
//2.String name():获取枚举常量名称,并在枚举声明中进行声明
System.out.println(Level3.LOW.name());//LOW
//3.String toString():获取枚举常量名称,它已经包含在声明中
System.out.println(Level3.LOW.toString());//LOW
//4.int ordinal():获取枚举常量在声明中的位置,初始序数0
System.out.println(Level3.HIGH.ordinal());//输出2
//5.static valueOf(类.class类型,枚举常量),获取指定名称指定枚举类型的枚举常量
Level3 high = Enum.valueOf(Level3.class, "HIGH");
System.out.println(high.name());//枚举常量名:HIGH
}
//通过switch判断级别
public static void chose(Level3 level){
switch (level){
case LOW:break;
case HIGH:break;
case MEDIUM:break;
}
}
}
4.实现接口的枚举类
- 所有枚举都继承自java.lang.Enum类。由于Java 不支持多继承,枚举对象不能再继承其他类,但可以去实现其他接口。
- 每个枚举对象,都可以实现自己的抽象方法
下面是枚举在接口中的使用
package demo;
/**
* 实现接口的枚举类: 枚举在接口中的使用
* 任意一个枚举类都继承自Enum,无法再继承其他类,
* 但可以实现接口,每一个枚举常量都可重写抽象方法定义自己的常量功能等
*/
public enum Level4 implements Lshow{ //定义枚举类型Level4实现Lshow接口
LOW{ //每一个枚举常量(实例)重写接口抽象方法
@Override
public void show(){
System.out.println("低级别");
}
},MEDIUM{
@Override
public void show(){
System.out.println("中级别");
}
},HIGH{
@Override
public void show(){
System.out.println("高级别");
}
};
}
//定义接口
interface Lshow{
void show();//抽象方法
}
5.枚举类注意事项
- 一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的。
- 枚举类默认继承的是java.lang.Enum类而不是Object类
- 枚举类不能有子类,因为其枚举类默认被final修饰
- 构造方法只能private,只能程序员自己定义枚举常量
- switch中使用枚举时,直接使用常量名,不用携带类名
- 不能定义name属性,因为自带name属性
- 不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。