枚举的介绍、枚举是JDK1.5之后引入的,那么之前如何实现的、以及枚举当中的一些方法

    技术2023-05-10  86

    枚举的介绍

    枚举:列举,罗列

    枚举是代表这样的一系列的类型,这些类型有一个非常明显的特征,他们的对象是有限个 **列如:**Week(星期),我们可以限定Week类型的对象只有7个 Season(季节),可以限定对象为四个 员工的状态(Status),可以限定为:空闲(Free),忙(Busy),休假(Vocation),离职(Left)

    枚举类是JDK1.5之后引入的。

    那么我们先看看JDK1.5之前没有枚举的类型是如何实现枚举的需求?

    Jdk1.5之前:如何实现这种枚举的需求

    要点:整个系统中,某个类型的对象是有限的几个,不多也不少。 (1)限制使用者随意的创建对象 — > 构造器私有化 (2)把有限的几个对象,预先创建好,放着,供使用者使用 --> 在枚举类中用静态的类变量把有限的对象存储起来 使用者用“类名.对象名”获取。

    public class TestOld { public static void main(String[] args) { //构造器一旦私有化,就一个对象都创建不了了 // Season s = new Season(); Season s = Season.SPRING; System.out.println(s); Season w = Season.WINTER; System.out.println(w); Season w2 = Season.WINTER; System.out.println(w == w2);//ture 这里拿到的是同一个“冬天”对象,所以地址值是相同的 } } class Season{ //(2)把有限的几个对象,预先创建好,那么因为构造器私有化,只能在本类中创建 //创建好还要用变量存储起来(静态类变量) public static final Season SPRING = new Season(); public static final Season SUMMER = new Season(); public static final Season AUTUMN = new Season(); public static final Season WINTER = new Season("冬天","真的好冷啊"); private String name; private String desc; //构造器私有化 private Season() { } private Season(String name, String desc) { super(); this.name = name; this.desc = desc; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "Season [name=" + name + ", desc=" + desc + "]"; } }

    运行结果:

    JDK1.5之后就引入了枚举了

    枚举类型也是类,原来用class声明类,现在用enum来声明枚举

    声明语法格式: 【权限修饰符】 enum 枚举类型{ 第一行必须写常量对象列表; 【其他成员】 }

    说明: (1)枚举类型的构造器一定是私有的 (2)枚举类名的常量对象列表必须在枚举类型的首行 如果常量列表后面没有其他的成员,那么可以省略分号。如果后面有其他的成员则分号不能省略。 (3)所有的枚举类型有一个直接父类java.lang.Enum类型,所以不能继承其他类 Enum中有自己的toSting方法,是返回常量的名字,例如monday. 你也可以自己写toString方法,不过就需要自己手动去写了 (4)switch…case 增加了对枚举的支持

    小知识: switch…case的表达式类型 (1)基本数据类型:byte,short,int,char (2)应用数据类型:枚举(JDK1.5之后),String(JDK1.7之后)

    switch…case的语法结构: switch(表达式){ case 常量名1: 语句; 【break;】 case 常量名2: 语句; 【break;】 case 常量名3: 语句; 【break;】 …

    public class TestEnumType { public static void main(String[] args) { Week monday = Week.MONDAY; System.out.println(monday); switch(monday) { case MONDAY: System.out.println("星期一"); break; case TUSEDAY: System.out.println("星期二"); break; } } } enum Week{ MONDAY("星期一","上班了"),TUSEDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY; private String name; private String desc; private Week() { } //不写无参构造,直接有参构造上面会报错,这个是应为直接写常量是无参构造,使用有参构造我们需要传值的 private Week(String name, String desc) { this.name = name; this.desc = desc; } //重写Enum类的toSting方法,不是Object类中的toString方法。 // public String toString() { // return name + ";" +desc; // } }

    运行结果:

    枚举当中的一些方法

    java.lang.Enum类,它是所有java语言枚举类型的公共基本类。 既所有枚举类型都继承他,不能再继承别的类型

    方法: (1)name();返回次枚举常量的名称 (2)ordinal();返回枚举常量的叙述(他在枚举声明中的位置,其中初始常量序数为零)。 (3)int compareTo(x); 默认按照枚举对象的顺序排序 (4)API中没有,编译器中自动生成的 枚举类型[] values() 枚举类型 valueOf(常量名)

    //与上面的代码在同一个包中,否则会报错

    public class TestEnum { public static void main(String[] args) { Week m = Week.MONDAY; System.out.println(m.name()); System.out.println(m.ordinal()); System.out.println(Week.SATURDAY.ordinal()); System.out.println("----------------"); Week[] values = Week.values(); for (int i = 0; i < values.length; i++) { System.out.println(values[i]); } System.out.println("----------------"); Week s = Week.valueOf("SATURDAY"); System.out.println(s); } }

    运行结果:

    Processed: 0.015, SQL: 9