参考:
https://www.cnblogs.com/zhanqing/p/11076646.html
枚举类
关键字enum
Java中,枚举类型使用关键字enum进行声明,它是一种特殊的类。
通过关键字enum创建的枚举类型,在编译后事实上也是一个类类型,而且该类继承自java.lang.Enum类,同时编译器会将枚举类标记为final类。由于Java并不是支持多继承,所以enum声明的枚举类不能再继承其他类。
enum NotPossible extends Pet{} // 不正确
实际上,在Java中,多继承的功能可以通过多实现来实现,即实现一个或多个接口。
相关细节
Java要求必须先定义枚举实例(枚举常量)。如果在定义枚举实例之前定义了任何方法或属性,那么编译会报错。
如果打算在枚举类中定义(或重写)方法,则需要在枚举实例序列的最后添加分号“;”。
只能在枚举类的内部使用其构造器创建枚举实例。事实上,构造器只在构造枚举实例时被调用,一旦枚举类的定义结束,编译器就不允许我们再使用其构造器来创建任何实例了,所以一般将枚举类的构造器定义为private,当然即使我们使用其他权限修饰符定义构造器,也无法在外部生成枚举实例,这是由编译器保证的。
除此之外,我们也可以自定义构造函数。在声明枚举实例的同时给构造函数传入实参,这样便可以使用实参,添加对每个枚举实例的描述。然后使用重写的toString(),返回这个描述信息。而默认的toString()方法只能返回枚举实例的名字。
在继承自Enum类的方法中,只有toString()不是final的。换句话说,枚举类只能重写(覆盖)toString()方法。但是可以向枚举类中添加方法。
枚举类的相关方法
比较2个枚举常量是否相等,可以使用==,也可以使用equals方法。
name() : 返回枚举实例声明时的名字,这与使用默认的toString()方法效果相同。
values() : 返回一个包含所有枚举实例的数组,其类型为枚举类。
ordinal(): 返回枚举实例对应的位置(位置从0开始)
int compareTo(E other): 用来比较如果枚举实例出现在Other之前,则返回一个负值;如果this=other,则返回0;否则返回正值。枚举常量的出现次序在enum声明中给出。
代码示例
获取枚举实例
// 获取枚举实例的方法1
ColorEnum s1 = ColorEnum.RED;
// 获取枚举实例的方法2
ColorEnum s2 = Enum.valueOf(ColorEnum .class, "WHITE");
获取枚举实例的位置
枚举实例的位置,同定义时的顺序一致,位置从0开始计数。
// 获取枚举实例的位置【从0开始】
int index = s2.ordinal();
比较2个枚举实例
int resBe = s1.compareTo(s2);
System.out.println("resBe = "+resBe);
比较2个枚举实例是否相等
if(s2==s1){System.out.println("相等");}
else{ System.out.println("不相等");}
// 使用equals方法
if(s2.equals(s1)){System.out.println("相等");}
else{ System.out.println("不相等");}
获取全部枚举实例
可以使用values方法获取全部的枚举实例。
ColorEnum [] arrs = ColorEnum.values();
// 打印所有枚举实例
for(ColorEnum s:arrs)
{
System.out.println(s.toString());
}
不重写toString方法
在原始情况下,即没有重写toString方法时,枚举类的name方法和toString方法返回的结果是一样的。
主函数
public class ColorEnumTest {
public static void main(String[] args) {
// 获得枚举实例
ColorEnum s1 = ColorEnum.RED;
// 得到枚举实例的描述
System.out.println(s1.toString());
System.out.println(s1.name());
}
}
ColorEnum 类
public enum ColorEnum {
// 枚举实例
RED,GREEN,WHITE,YELLOW;
}
重写toString方法添加对枚举实例的描述
主函数
可以看到,ColorEnum枚举类的构造函数被调用了4次,正好对应4个枚举实例。也就是说每生成1个枚举实例,编译器都会自动调用该枚举类的构造函数。
public class ColorEnumTest {
public static void main(String[] args) {
// 获得枚举实例
ColorEnum s1 = ColorEnum.RED;
// 使用重写的toString方法得到枚举实例的描述
System.out.println(s1.toString());
System.out.println(s1.name());
}
}
ColorEnum 类
public enum ColorEnum {
// 枚举实例,生成实例的时候调用了构造器,括号内都是传给构造器的实参
RED("红色",1),GREEN("绿色",2),WHITE("白色",3),YELLOW("黄色",4);
// 成员变量
private String name;
private int index;
// 私有的构造方法
private ColorEnum(String name,int index) {
System.out.println("Color的构造方法");
this.name = name;
this.index = index;
}
// 重写toString方法
@Override
public String toString() {
return this.index + "--" + this.name;
}
}