一、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关键字创建,可以在本类之外创建
- 构造方法无要求