枚举
来源:互联网 发布:易语言聊天机器人源码 编辑:程序博客网 时间:2024/06/05 22:50
枚举是从Java5开始提供的一种新的数据类型,是一个特殊的类,就是固定的多个常量对象的集合。
枚举的定义
定义格式:
[修饰符] enum 枚举类名{ 常量A,常量B,常量C;}
Demo:
public enum Weekday{ MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;}
枚举类的特点
①枚举的直接父类java.lng.Enum,但是不能继承Enum。
②枚举就相当于,可以定义构造方法,成员变量、普通方法和抽象方法。
③默认私有的构造方法,即使不写访问权限也是private(假构造器,底层没有无参构造器)。
④每个实例分别用一个全局常量表示,枚举类的对象是固定的,实例个数有限,不能使用new关键字。
⑤枚兴实例必须位于枚举体中的最开始部分,枚举实例列表的后要有分号与其他成分相隔。
⑥枚举实例后有花括号中,该实例是枚举类的匿名内部类对象(查看编译后的class)。
枚举类的使用
1):枚举中都是全局公共的静态常量,可以直接使用枚举类名调用。 Weekday day= Weekday.SATURDAY;
2):因为java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法。 String name=枚举对象.name(); //返回枚举对象的常量名称 int ordinal=枚举对象.ordinal(); //返回枚举对象的序号,从0开始 String str=枚举对象.toString(); //返回枚举对象的常量名称
3):编译器生成的枚举类的静态方法 枚举类型[] values(); Weekday[] ws = Weekday.values(); 返回当前枚举类型所有的常量,使用一个数组封闭起来。 枚举类型 valueof(String name); 把一个指定名称字符串转换为当前枚举类中同名的常量。
4):从Java5开始出现枚举,switch也操作枚举类型。 switch只支持Int类型,云持枚举是因为底层使用的枚举对象ordinal.而ordinal的类型依然是int类型。
Demo:
题目1:设置每周的那一天休息,要求不使用枚举
要求:只能使用规定的几个参数。
无枚举实现
class Week{ //私有化构造器 private Week(){ } //定义常量静态对象 public static final Week MONDAY = new Week(); public static final Week TUESDAY = new Week(); public static final Week WEDNESDAY = new Week(); public static final Week THURSDAY = new Week(); public static final Week FRIDAY = new Week(); public static final Week SATURDAY = new Week(); public static final Week SUNDAY = new Week();}public class Employee { //定义一个字段来表示休息日 private Week restday; //geter、seter方法 public Week getRestday() { return restday; } public void setRestday(Week restday) { this.restday = restday; } //如果对象名相等就输出 public void happy(){ if(restday==Week.MONDAY){ System.out.println("周一休息"); }else if(restday==Week.TUESDAY){ System.out.println("周二休息"); }else if(restday==Week.WEDNESDAY){ System.out.println("周三休息"); }else if(restday==Week.THURSDAY){ System.out.println("周四休息"); }else if(restday==Week.FRIDAY){ System.out.println("周五休息"); }else if(restday==Week.SATURDAY){ System.out.println("周六休息"); }else if(restday==Week.SUNDAY){ System.out.println("周日休息"); }else{ System.out.println("你输出的不合法"); } } public static void main(String[] args) { //创建一个对象 Employee e = new Employee(); //调用方法赋值属性 e.setRestday(Week.MONDAY); //执行方法 e.happy(); } }
题目2:使用枚举实现题目1
//枚举类enum EveryWeek{ //常量对象 MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;}public class EmployeeEnum { //私有字段 private EveryWeek restday; //geter,seter方法 public EveryWeek getRestday() { return restday; } public void setRestday(EveryWeek restday) { this.restday = restday; } //定义一个方法,用来判断何时休息 public void list(){ switch (restday) { case MONDAY: System.out.println("周一休息"); break; case TUESDAY: System.out.println("周二休息"); break; case WEDNESDAY: System.out.println("周三休息"); break; case THURSDAY: System.out.println("周四休息"); break; case FRIDAY: System.out.println("周五休息"); break; case SATURDAY: System.out.println("周六休息"); break; case SUNDAY: System.out.println("周日休息"); break; default: break; } } //main方法 public static void main(String[] args) { EmployeeEnum ee = new EmployeeEnum(); //创建一个对象 ee.setRestday(EveryWeek.SUNDAY); //给变量赋值 ee.list(); //调用方法查看在何时休息 //返回指定枚举常量的名称 System.out.println(EveryWeek.SUNDAY.name()); //返回指定枚举常量的序列号,从0开始的。 System.out.println(EveryWeek.SUNDAY.ordinal()); //返回指定枚举常量的名称 System.out.println(EveryWeek.SUNDAY.toString()); //返回枚举中所有常量,并存在一个数组中 EveryWeek[] weeks=EveryWeek.values(); for(EveryWeek everyWeek:weeks){ System.out.print(everyWeek.toString()); } }}