枚举类
一、枚举类的使用
1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类
2.当需要定义一组常量时,强烈建议使用枚举类。
3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。
二、如何自定义枚举类:
方式一:JDK5.0之前,自定义枚举类
例子如下:
//自定义枚举类 public class Meiju { //声明Meiju对象的属性:private final修饰 private final String SOULER; private final String NAME; //私有化类的构造器,并给对象属性赋值 private Meiju(String souler, String name) { this.SOULER = souler; this.NAME = name; } //提供当前枚举类的多个对象 public static final Meiju FIRST = new Meiju("深渊监视者","法兰不死队"); public static final Meiju SECOND = new Meiju("罪业之都","巨人王尤姆"); public static final Meiju THIRD= new Meiju("幽邃圣者","吞噬神明的埃尔德里奇"); public static final Meiju FOURTH = new Meiju("血缘之末","洛斯里克圣王"); public String getSOULER() { return SOULER; } public String getNAME() { return NAME; } @Override public String toString() { return "Meiju{" + "SOULER='" + SOULER + '\'' + ", NAME='" + NAME + '\'' + '}'; } public static void main(String[] args) { Meiju first = Meiju.FIRST; System.out.println(first); } }//Meiju{SOULER='深渊监视者', NAME='法兰不死队'}
方式二:JDK5.0之后,可以使用enum关键字定义枚举类
代码示例如下:
enum Meijuenum { //提供当前枚举类的多个对象 FIRST("深渊监视者","法兰不死队"), SECOND("罪业之都","巨人王尤姆"), THIRD("幽邃圣者","吞噬神明的埃尔德里奇"), FOURTH("血缘之末","洛斯里克圣王"); //声明Meiju对象的属性:private final修饰 private final String SOULER; private final String NAME; //私有化类的构造器,并给对象属性赋值 private Meijuenum(String souler, String name) { this.SOULER = souler; this.NAME = name; } public String getSOULER() { return SOULER; } public String getNAME() { return NAME; } public static void main(String[] args) { Meijuenum fourth = Meijuenum.FOURTH; System.out.println(fourth); } //FOURTH // @Override // public String toString() { // return "Meiju{" + // "SOULER='" + SOULER + '\'' + // ", NAME='" + NAME + '\'' + // '}'; // } }
通过代码我们可以看出,使用enum关键字的枚举类,比之前有很大的不同:
1.跟接口有些相似,它把一样的东西都省略掉了,甚至它比接口更过分,连类型和=都省略掉了。
2.多个对象之间用“,”隔开,末尾用“;”。
3.在不重写toString的情况下,打印的结构不是地址值,而是对象名,通过实验,得出它虽然没有写继承,但是它不是继承的Object类,而是继承的enum类,所有打印的是enum中重写的toString。
三、Enum类的主要方法:
>values()方法:返回枚举类型的对象数组。该方法可以很方便的遍历所有的枚举值。
Meijuenum[] a = Meijuenum.values(); for (int i = 0; i < a.length; i++) { System.out.println(a[i]); }//FIRST SECOND THIRD FOURTH
由此处可以回想过去学多线程的时候,Thread类中的State就是枚举类声明的,查看源码得知,确实是枚举类,代码分析如下:
Thread.State[] values = Thread.State.values(); for (int i = 0; i < values.length; i++) { System.out.println(values[i]); }//NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED
>valueOf(String str):可以把一个字符串转化为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如果不是,会有运行时异常:IllegalArgumentException。
Meijuenum first = Meijuenum.valueOf("FIRST"); System.out.println(first);//FIRST
>toString():返回当前枚举类对象常量的名称。//代码上边有。
四、使用enum关键字定义的枚举类实现接口的情况。
方法一、跟自定义枚举类一样,直接implements 接口,然后实现抽象方法。
方法二、让枚举类的对象分别去实现接口中的抽象方法,这样每个对象所重写的抽象方法内容都不一样,在调用不同对象的时候,呈现的内容也不相同。代码示例如下:
interface Ifo{ void show(); } enum Meijuenum implements Ifo{ //声明Meiju对象的属性:private final修饰 //私有化类的构造器,并给对象属性赋值 //提供当前枚举类的多个对象 FIRST("深渊监视者","法兰不死队"){ @Override public void show() { System.out.println("法兰街舞队"); } }, SECOND("罪业之都","巨人王尤姆"){ @Override public void show() { System.out.println("只有风暴才能摧毁大树!"); } }, THIRD("幽邃圣者","吞噬神明的埃尔德里奇"){ @Override public void show() { System.out.println("放开我伪娘!"); } }, FOURTH("血缘之末","洛斯里克圣王"){ @Override public void show() { System.out.println("双王子永不服输!"); } };//FIRST //法兰街舞队 //SECOND //只有风暴才能摧毁大树! //THIRD //放开我伪娘! //FOURTH //双王子永不服输!