枚举
枚举的定义
枚举类的使用enum(它与class、interface关键字地位相同)关键字定义。一个java源文件中只能有一 个public修饰的枚举类,且java源文件也必须和枚举类的类名相同。 下面来定义一个枚举类:
public enum TestDemo{
SPRING,SUMMER,FALL,WINTER
}
枚举的好处
- 定义枚举的语法更为简洁。
- 枚举更为安全,一个枚举类型的变量,它的值要么为null,要么为枚举值之一,不可能为其他值,但使用整形变量,它的值就没有办法强制,值可能就是无效的。
- 枚举类型自带很多便利方法(如values, valueOf, toString等),易于使用。
基本实现原理
枚举类型实际上会被Java编译器转换为一个对应的类,这个类继承了Java API中的java.lang.Enum类。
Enum类有两个实例变量name和ordinal,在构造方法中需要传递,name(), toString(), ordinal(), compareTo(), equals()方法都是由Enum类根据其实例变量name和ordinal实现的。
枚举类和普通类的区别
枚举类可以实现一个或多个接口,使用eunm定义的类默认继承了java.lang.Enum类,而不是默认 继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了 java.lang.Serializable和java.lang.Comparable接口
非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
枚举类的构造器只能使用private修饰,如果省略,系统默认使用private修饰。
枚举类的每一个实例必须显示声明,每个实例使用逗号隔开。
枚举类默认有如下方法
values()方法 该方法可以很方便的遍历所有的枚举值
/**
* @Author Gw_gw
* @Date 2021/6/12 18:50
* @Version 1.0
*/
public class TestDemo{
public static void main(String[] args) {
//使用values()方法来遍历枚举类的值
for(Season i : Season.values()){
System.out.println(i);
}
}
}
/**
* 枚举类表示四季
*/
enum Season{
/**
* 春夏秋冬
*/
SPRING,SUMMER,FALL,WINTER;
}
ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
public class TestDemo{
public static void main(String[] args) {
//使用values()方法来赋值
Season[] season = Season.values();
for(Season i : season){
System.out.println(i+"的索引是"+i.ordinal());
}
}
}
valueOf()方法返回指定字符串值的枚举常量。不存在的会报错 IllegalArgumentException
public class TestDemo{
public static void main(String[] args) {
// 使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException
System.out.println(Season.valueOf("SPRING"));
//error IllegalArgumentException
System.out.println(Season.valueOf("asd"));
}
}
compareTo(E o)方法 指定枚举对象的比较顺序。如果枚举对象在指定枚举对象之后返回正整数,之
前返回正整数,否则返回0
public class TestDemo{
public static void main(String[] args) {
//返回-1
System.out.println(Season.SPRING.compareTo(Season.SUMMER));
}
}
String name() :返回此枚举实例的名称
String toString():返回枚举常量的名称
toString()方法更常用
public class TestDemo{
public static void main(String[] args) {
System.out.println(Season.SPRING.name());
System.out.println(Season.SPRING.toString());
//实质就是调用toString()方法
System.out.println(Season.SPRING);
}
}
枚举类的成员变量和构造器
枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所 以外部无法调用。
枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都 必须实现它。