枚举类型

1、什么是枚举类型?
枚举:就是指罗列/列举出某个类的所有对象。

2、什么情况下使用枚举?
当某个类的对象是“固定”、“有限”的几个,那么就可以声明为枚举类型。
例如:Week类,Month类,用户的订单状态,用户的角色类型等
用户的订单状态:未付款、已付款、已发货、已收货... 几个
用户的角色类型:超级管理员、普通管理员、普通用户、临时用户...几个

3、怎么声明枚举类型?
(1)JDK1.5之前
(2)JDK1.5之后

(1)JDK1.5之前:
    思考问题的方向,如何限定某个类的对象,在整个程序运行期间,只有固定的几个对象?
    A:不能让其他类随意创建这个类的对象
        ==>创建对象,就需要调用构造器
        ==>不想让他随意创建对象,就要限制构造器的使用
        ==>比如,构造器私有化
    B:在这个类的内部把固定的几个对象创建好,供别人使用
        ==>这些对象,需要用静态的常量来表示,是否需要public,看你这些对象是否允许任意位置可见,一般都是public的。

    结论:从JDK1.5之前的声明发现,枚举类型只是比普通的Java类稍微特殊一点而已,它也是Java类。

 (2)JDK1.5之后:对枚举类的声明进行了简化
   提供了一个新的关键字,专门用来声明枚举类型:enum,这个关键字代替原来的class。

  语法格式:
    【修饰符】 enum  枚举类名{
        常量对象列表
    }
    【修饰符】 enum  枚举类名{
        常量对象列表;
        其他成员
    }

    说明,如果常量对象列表后面没有其他成员,那么常量对象列表后面不用加;,否则就必须加;


4、枚举类型与普通的类型的区别是
(1)创建对象的位置不同  ,枚举类的对象创建在自己类中
(2)对象的个数不同    ,枚举类的对象的个数是固定的几个
(3)获取对象的方式不同, 枚举类名.常量对象的方式获取

5、枚举类的特点
(1)如果枚举类型,没有声明任何构造器,也会有一个默认的无参构造
(2)枚举类型的所有构造器都是private,不管你写不写private
(3)枚举类型的直接父类是固定,我们程序员不能自己指定,它的直接父类是java.lang.Enum类
Enum类的几个常用的方法
A:String name() 它是返回常量对象的名字
B:int ordinal() 它是返回常量对象列表的索引。枚举类中的常量对象列表像是一个数组,它们就会有下标。
C:String toString():它是重写Object类的toString方法,返回常量对象的名字,
                    也就是我们自定定义的枚举类型,如果不再重写toString,就使用Enum中的toString方法,返回常量对象的名字,
(4)在API中看不到的两个方法
枚举类型[] values

public class TestEnumType {
    public static void main(String[] args) {
        //随意创建对象
/*        Gender g1 = new Gender();
        Gender g2 = new Gender();
        Gender g3 = new Gender();
        Gender g4 = new Gender();
        Gender g5 = new Gender();
        Gender g6 = new Gender();*/

        //如何拿到Gender的对象呢?
        Gender boy = Gender.BOY;
        boy.eat();//之前拿到对象之后,该怎么调用方法等,现在还是怎么做。

        System.out.println("-----------------------------");
        //如何获取Week枚举类的对象
        Week monday = Week.MONDAY;
        System.out.println(monday);//MONDAY,自动调用Week从Enum父类继承的toString,返回常量对象名字

        System.out.println("-----------------------------");
//        Status s = new Status();//错误,构造器自动私有化

        Status status1 = Status.LEAVE;
        status1.method();

        Status status2 = Status.HIRE;
        status2.method();

        System.out.println("-----------------------------");
        Week saturday = Week.SATURDAY;
        System.out.println(saturday.name());//name()从父类Enum继承类的,返回常量对象的名字
        System.out.println(saturday.ordinal());//ordinal()从父类Enum继承类的,返回常量对象的索引,下标  下标从0开始往后编号

        System.out.println("-----------------------------");
        Week[] values = Week.values();//所有用enum声明的枚举类型,都有values方法,返回枚举中的所有常量对象
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }

        System.out.println("-----------------------------");
        Week week = Week.valueOf("MONDAY");
        System.out.println(week); //"MONDAY"是字符串类型的,week是Week类型,虽然它也代表星期一

        System.out.println("-----------------------------");
        //从键盘输入星期的常量名,根据获取的星期对象,显示对星期的描述
        Scanner input = new Scanner(System.in);
        System.out.print("请输入星期的常量对象名:");
        String name = input.next();

        Week w = Week.valueOf(name);//如果输入的常量对象名错误,直接报异常了
        switch (w){
            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;
        }
    }
}

//例如:限定Gender的对象只有两个,一个是BOY对象,一个是GIRL对象
//按标准来说,Gender类应该是单独的.java文件,也public的类,这里只是为了让大家把相关代码放一起看,所以没有单独一个.java文件。
class Gender{
    //public:表示任意位置可见
    //static:表示可以通过“类名.”的形式访问
    //final:表示这个对象是常量对象,即BOY和GIRL不能再赋值为别的Gender对象了。
    //有同学有疑问?在Gender类中,怎么还能创建Gender类对象呢?
    // 可以,因为类加载时,就是原样读取.class文件的过程,把.class中的 数据一行一行的读取到方法区的内存中,
    //然后,再初始化这个类,初始化类时,类的模板代码已经加载到内存了,相当于/类似于你使用别的类一样去new对象等。
    public static final Gender BOY = new Gender();
    public static final Gender GIRL = new Gender();

    //构造器私有化之后,外部就不会随意的创建对象了
    private Gender(){

    }

    //剩下的代码,就是写Gender这个类型的具体功能
    public void eat(){
        System.out.println("吃饭");
    }
}

enum Week {
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY //Week枚举类的常量对象列表
}

/*
class 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();

    private Week(){
    }
}
 */

//枚举类型Status,表示员工的状态,它有三个状态
enum Status{
    //probation表示试用期,把单词转大小写的快捷键Ctrl + Shift + U
    //hire:表示已录用的
    //leave:表示已经离职的
    PROBATION,
    HIRE("正式工"), //如果在常量对象名后面加(),并且在()中传入的实参,就表示调用对应的有参构造
    LEAVE; //如果直接写常量对象名,或者常量对象名称(),都是表示调用无参构造创建的对象

    //枚举类Status的成员变量
    //枚举类型也可以声明自己的成员变量
    private String description;

    //枚举类型可以声明有参构造和无参构造
    //构造器的权限修饰符是private,自动就是private
    Status(){

    }
    Status(String description){
        this.description = description;
    }

    //枚举类型也可以声明自己的成员方法
    public void method(){
        if(description == null){
            System.out.println("该对象的描述信息为空");
        }else{
            System.out.println(description);
        }

    }
}

(5)从JDK1.5之后开始switch支持枚举类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值