枚举的使用与详解

枚举介绍

        枚举在日常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
        在 JDK 1.5
之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。

定义枚举

        权限修饰符 enum 枚举名称 {
            枚举项1,枚举项2...;
        }

         枚举项之间使用逗号分隔,最后使用分号结束,如果只有枚举项分号可以省略

//使用枚举描述性别数据:
public enum Sex {
    BOY, GIRL;
}

枚举使用 

        通过枚举名直接引用枚举项即可,例如Sex.BOYSex.GIRL

        注意 : 每个枚举项都相当于枚举的对象

枚举结合switch使用

        

// 信号灯枚举
public enum Signal {
    // 每个枚举项都是一个常量,我们使用常量的命名规则(全部大写,不同单词之间使用下划线分割)
    GREEN, YELLOW, RED
}
public class TrafficLight {
    public static void main(String[] args) {
        change(Signal.GREEN); // 绿灯行
    }
    public static void change(Signal color) {
        switch (color) {
            case GREEN:               
                System.out.println("绿灯行");             
                break;           
            case YELLOW:             
                System.out.println("黄灯亮了等一等");               
                break;         
            case RED:             
                System.out.println("红灯停");               
                break;       
        }    
    }
}

探索枚举的本质

        枚举其实本质上是一个类,每一个枚举项是本枚举类类型的一个对象。我们可以使用JDK提供的反编译命令,将枚举的字节码进行反编译查看,如下:

        在CMD中找到字节码所在路径,然后执行:javap  -p  字节码文件名

        我们以之前所写的Sex枚举为例,反编译后结果如下:

final class Sex extends java.lang.Enum<_Sex> {
    public static final Sex BOY;
    public static final Sex GIRL;
    private static final Sex[] $VALUES;

    //将所有的枚举对象返回,通过这个方法我们可以遍历枚举类中的枚举项
    public static Sex[] values(); 

    //根据枚举的常量名字符串,转换为枚举对象
    public static Sex valueOf(java.lang.String); 

    private Sex(); //私有构造方法,在枚举类加载的时候创建枚举项时调用

    static {};     //静态代码块
}

        由此可见,每一个枚举项都是被public static final所修饰,很明显是一个常量,所以之前我才使用常量的命名规则对枚举项进行命名

枚举本质上是什么?

        枚举本质上是一个final类,继承了Enum

枚举内部可以定义什么?

        枚举是一个类,可以类中可以定义的成分,比如成员变量,构造方法,成员方法等

枚举中的构造方法有什么特点?

        是私有的,外界无法调用,在将枚举加载到方法区后会创建所有的枚举项,这是会根据枚举项是否传参调用对应的构造函数(默认只有无参构造函数,我们可以扩展有参构造函数)

public enum Signal {
    // 创建是否传入参数来决定调用哪一个构造函数
    Green, Yellow("xiaobo"), Red;

    private String name;

    private Signal() {
        System.out.println("无参构造");
    }

    private Signal(String name) {
        System.out.println("有参构造");
        this.name = name;
    }

    public void show(){
        System.out.println(name);
    }
}
public class EnumDemo02 {
    public static void main(String[] args) {
        System.out.println(Signal.Yellow); // 无参构造 有参构造 无参构造 Yellow
        /*由此可见在枚举类加载的时候所有的枚举项就开始创建了*/

        System.out.println("<========================>");
        Signal.Yellow.show(); // xiaobo
        Signal.Green.show(); // null
        Signal.Red.show(); // null
    }
}

枚举的实例方法怎么用?

        直接用枚举项调用

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值