JAVA的枚举定义和使用

 1.什么是枚举用enum修饰是一种特殊的类,但枚举是类,使用枚举可以很方便的定义常量 


枚举的概念:枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的

为什么需要枚举:
因为一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值

自定义枚举类

package cn.tedu.exec;
/*
 JDK1.8之前 枚举类定义和使用
 */

//自定义枚举
 class Season {
     /*
     1.枚举类中声明的每一个枚举值代表枚举类的一个实例对象
     2.与Java中的普通类一样在声明枚举类时也可以声明属性方法和构造函数
     3.但是枚举类的构造函数必须为私有的
     4.枚举都必须要大写
      */
    //1.私有化常量类型
    private final String SEASON_NAME;
    private final String SEASON_DEAE;

    //2.私有化形参构造器
    private Season(String SEASON_NAME, String SEASON_DEAE) {
        this.SEASON_NAME = SEASON_NAME;
        this.SEASON_DEAE = SEASON_DEAE;
    }

    //3.公共静态常量创建对象
    public static  final Season SPRING=new Season("春天","春暖花开");
    public static  final Season SUMMER=new Season("夏天","夏日炎炎");
    public static  final Season AUTUMM=new Season("秋天","秋高气爽");
    public static  final Season WINTER=new Season("冬天天","寒风凛凛");

    //4.提供get方法
    public String getSEASON_NAME() {
        return SEASON_NAME;
    }

    public String getSEASON_DEAE() {
        return SEASON_DEAE;
    }

    //5.重写toString方法
    @Override
    public String toString() {
        return "Season{" +
                "SEASON_NAME='" + SEASON_NAME + '\'' +
                ", SEASON_DEAE='" + SEASON_DEAE + '\'' +
                '}';
    }
}
class  SeasonTest {
    public static void main(String[] args) {
       //1.打印通过类名调用对象获取get方法
        System.out.println(Season.SPRING.getSEASON_NAME());
        System.out.println(Season.SUMMER.getSEASON_NAME());
       //2.使用类名调用对象获取toString
        System.out.println(Season.AUTUMM);
    }
}

使用枚举enum实现枚举类

package cn.tedu.exec;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;

/*
    JDK1.8之后使用定义枚举和使用
 */
//使用enum关键字定义枚举类
enum Food{
    /*
    1.public static final可以省略不写
    2.枚举对象不能像自定义枚举类对象时new
    3.枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);
    4.不需要生成toString,因为使用enum关键字定义的枚举类继承了java.lang.Enum
    5.在Enum中重写了继承自Object的toString()直接打印的就是枚举名
     */
        //1.通过枚举名传形参
        HAMBURG("汉堡","又大又扁"),
        BEEF("牛肉","肉质柔软"),
        MUTTON("羊肉 ","烹调的香味");
        //2.私有化常量类型
        private  final String FOOD_NAME;
        private  final String FOOD_DESE;
        //3.提供枚举形参构造器
    Food(String FOOD_NAME, String FOOD_DESE) {
        this.FOOD_NAME = FOOD_NAME;
        this.FOOD_DESE = FOOD_DESE;
    }
    //4.提供get方法
    public String getFOOD_NAME() {
        return FOOD_NAME;
    }
    public String getFOOD_DESE() {
        return FOOD_DESE;
    }
}
/*
食物测试类
 */
class  TestFood{
    public static void main(String[] args) {
        //1.通过枚举类调用枚举名获取类型名
        System.out.println(Food.HAMBURG.getFOOD_NAME());
        System.out.println(Food.BEEF.getFOOD_NAME());
        System.out.println(Food.MUTTON.getFOOD_NAME());
        //2.通过枚举类调用枚举名获取类型描述
        System.out.println(Food.HAMBURG.getFOOD_DESE());
        System.out.println(Food.BEEF.getFOOD_DESE());
        System.out.println(Food.MUTTON.getFOOD_DESE());
    }
}

总结新的知识点:

枚举的作用分为 
1.限定用户输入的值,保证安全,有效性2.快速找到所需要的值
枚举的本质:整型的字面值,效率高 3.枚举类型更规范,在函数形参定义为枚举类型的时候,
4.只接受枚举类型的常量,比起普通的更安全,5.枚举类型成员默认被public static final修饰

使用枚举类的好处
 1.提高代码的维护性,确保变量合法 2.提高代码可读性 3.提高代码键入

枚举类的底层实现
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,
原先的枚举类型变成对应的实体类型,
并且会生成一个新的构造函数,若原来有构造函数,
则在此基础上添加两个参数,生成新的构造函数

枚举类是线程安全的 为什么是线程安全的 
1.我们定义的一个枚举,在第一次被真正用到的时候,
会被虚拟机加载并初始化,而这个初始化过程是线程安全的。而我们知道,解决单例的并发问题,
主要解决的就是初始化过程中的线程安全问题 2.由于枚举的以上特性,枚举实现的单例是天生线程安全的

枚举类的特点:
1.所有的枚举类都是Enum的子类 2.我们可以通过枚举类名 枚举项名称 去访问指定的枚举项
3.每个枚举类项其实就是该枚举的一个对象 4.枚举也是一个类,也可以去定义一个成员变量
5.枚举类的第一行上必须是枚举项 最后一个枚举项后的分后是可以省略的 但是如果枚举类有其他的东西
这个分号就不能省略 建议不要省略
6.枚举类可以有构造器和构造函数 但必须是private的 它默认的也是private的 枚举项的用法比较特殊 
枚举("");
7.枚举类也可以有抽象方法 但是枚举项必须重写该方法 


版权声明:本文为m0_64792413原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。