一、Java枚举类型

一)枚举类型简介

  • 枚举是什么?在这里插入代码片枚举也是类,Java中所有的枚举都隐式继承自java.lang.Enum类,Enum类是所有的枚举类的父类,因为Java是单继承,所以枚举类不能再继承别的类。但是可以实现别的接口。枚举一般用来限制输入等,可以使用枚举表示性别、颜色、类别、状态等能够明确区分、取值有限的量,防止错误输入。
  • 枚举类型的特点
  • 使用enum关键字,不能再继承别的类
  • 枚举类默认强制使用final关键字修饰,不能被别的类继承
  • 枚举类的构造方法默认强制为私有的,只能由编译器调用,不能使用构造方法创建枚举类对象(也就是不能new出来)
  • 枚举类对象在类内进行定义,由编译器调用构造方法进行初始化,对象默认强制为静态常量(常量指的是对象名指向的对象不能变但是对象的里面的内容可以变)
  • 枚举类也是类的一种,也可以有自己的main方法、成员方法、成员变量等,用法与一般类一致

二)枚举类对象

  • 枚举对象定义
  • 在类中方法外
  • 格式:对象名(成员变量类型 成员变量名……),如果没有成员变量,括号可以省略
  • 对象通过私有构造获得,默认会给出无参构造
  • 方法

返回值

方法名称

方法说明

Enum[] values

values()

得到该枚举类中定义的所有枚举对象

int i

ordinal()

得到指定枚举对象的序号(由定义的先后顺序决定)

Enum value

valueOf(String name)

根据指定的对象名,得到枚举类中的枚举对象

String name

name()

得到当前对象的名称

  • 创建一个枚举类,打印每个枚举对象的名称与索引
/**
 * 枚举类
 */
public enum EnumObject {
    //所有的枚举类都继承自java.lang.Enum类,由于Java是单继承,所以不再允许继承别的类,但是可以实现别的接口
    //枚举类的对象强制是静态的常量,被static和final修饰,所以可以使用枚举类名直接调用
    //枚举类型的对象只能在此处定义,不能通过构造方法获得,因为枚举类的构造方法是强制私有的

    ZHANG_SAN, //定义枚举类的对象,会根据创建先后顺序给枚举对象一个索引(编号),默认从0开始
    LI_SI,
    WANG_WU
}

/**
 * 枚举类对象的测试类
 */
class TestObject {
    public static void main(String[] args) {//主方法
        //方法values()得到该枚举类的所有对象
        //方法ordinal()得到枚举对象的索引,默认从0开始

        //使用循环遍历输出所有的枚举类对象与对象的索引
        System.out.println("使用循环遍历输出所有的枚举类对象与对象的索引:");
        for (EnumObject value : EnumObject.values()) {//得到所有的枚举类对象,并遍历
            System.out.println("对象名:" + value + "\t索引:" + value.ordinal());//打印对象名与对象索引
        }

        //使用枚举类名调用对象,打印对象名与对象的索引
        System.out.println("\n使用枚举类名调用对象,打印对象名与对象的索引:");
        System.out.println("对象名:" + EnumObject.ZHANG_SAN + "\t索引:" + EnumObject.ZHANG_SAN.ordinal());
        System.out.println("对象名:" + EnumObject.LI_SI + "\t索引:" + EnumObject.LI_SI.ordinal());
        System.out.println("对象名:" + EnumObject.WANG_WU + "\t索引:" + EnumObject.WANG_WU.ordinal());
    }
}

//运行结果:
/*使用循环遍历输出所有的枚举类对象与对象的索引:
  对象名:ZHANG_SAN	索引:0
  对象名:LI_SI	索引:1
  对象名:WANG_WU	索引:2

  使用枚举类名调用对象,打印对象名与对象的索引:
  对象名:ZHANG_SAN	索引:0
  对象名:LI_SI	索引:1
  对象名:WANG_WU	索引:2*/

三)枚举类的成员变量与构造方法

  • 成员变量
  • 与其他类的成员变量一致,没多大区别
  • 构造方法
  • 强制为私有的,不能通过构造方法创建(new)对象
  • 只能由编译器调用,在初始化枚举对象的时候,由编译器调用,对对象进行初始化
  • 创建带有成员变量的枚举类,并对对象进行初始化
/**
* 枚举类
*/
public enum EnumParameter {

    //定义枚举类的对象
    //在定义枚举类的对象时,隐式调用了枚举类的私有构造
    //例如:"ZHANG_SAN("张三", 23)"相当于"ZHANG_SAN = new EnumParameter("张三", 23)"(实际不能这么写)
    //可以理解为在调用枚举类私有构造获得枚举类的对象
    ZHANG_SAN("张三", 23),
    LI_SI("李四", 24),
    WANG_WU("王五", 25);

    //枚举类的成员变量
    private String name;
    private int age;

    //枚举类强制私有的构造方法
    //只是在本类内定义枚举类对象的时候使用,在类外不能被访问
    EnumParameter(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {//姓名的get方法
        return name;
    }

    public void setName(String name) {//姓名的set方法
        this.name = name;
    }

    public int getAge() {//年龄的get方法
        return age;
    }

    public void setAge(int age) {//年龄的set方法
        this.age = age;
    }
}

/**
 * 枚举类参数的测试类
 */
class TestParameter {
    public static void main(String[] args) {

        for (EnumParameter value : EnumParameter.values()) {//遍历打印枚举对象的对象名、索引、成员变量信息
            System.out.println("对象名:" + value + "\t对象索引:" + value.ordinal() +
                    "\t姓名:" + value.getName() + "\t年龄:" + value.getAge());
        }
    }
}

//运行结果
/*对象名:ZHANG_SAN	对象索引:0	姓名:张三	年龄:23
  对象名:LI_SI	对象索引:1	姓名:李四	年龄:24
  对象名:WANG_WU	对象索引:2	姓名:王五	年龄:25*/

四)枚举类与一般类的区别

  • 枚举类
  • 隐式继承自Enum类,所以不能再继承别的类
  • 隐式强制被final修饰,所以不能被继承
  • 对象隐式强制为静态常量,对象名只能指定某一固定的对象
  • 对象不能被new出来,只能在本类中定义,等待编译器调用构造方法进行初始化
  • 构造方法隐式强制为私有的,且不能通过构造方法new出对象,只能等待编译器调用
  • 枚举类内部也可以有自己的main方法、成员方法、成员变量,且使用与一般类一致。
  • 一般类
  • 可以继承别的类
  • 可以被继承
  • 对象名可以执行别的对象
  • 对象可以使用new关键字创建,可以在本类之外创建
  • 构造方法无要求