枚举类型
1:什么是枚举:
对比单例模式,枚举就是一种意义上的多例。有的时候,一个类的对象有限并且固定,就可以考虑使用枚举。枚举类在第一行就已经定义了他所有的实例。
关键字 enum,
注意:
1.java中的所有关键字都是小写的吧。
2.不能通过new来创建枚举对象。因为枚举对象昂的实例就是类中的枚举项,只能够在类的外边通过类名.枚举项来调用。
public enum Direction { SPRING, SUMMER, FALL, WINTER; } Seanson s = Season.SPRING;
3:枚举与switch
枚举类型可以在switch中使用:
Season s = Season.SPRING; switch(d) { case SPRING: System.out.println("春天");break; case SUMMER:System.out.println("夏天");break; case FALL: System.out.println("秋天");break; case WINTER: System.out.println("冬天");break; default:System.out.println("谁知道是什么季节呢?"); } Direction s1 = s; System.out.println(s1);
注意,在switch中,不能使用枚举类名称,例如:“case Season.SPING:”这是错误的,因为编译器会根据switch中d的类型来判定每个枚举类型,在case中必须直接给出与d相同类型的枚举选项,而不能再有类型。
4:
参考自:https://www.jianshu.com/p/7d3e3f6695a5 (写的非常好)
所有枚举类都是Enum的子类
所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。这说明Enum中的方法所有枚举类都拥有。
- int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如SPRING的下标为0,SUMMER下标为1,那么SPRING小于SUMMER;
- boolean equals(Object o):比较两个枚举常量是否相等;
- int hashCode():返回枚举常量的hashCode;
- String name():返回枚举常量的名字;
- int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;
- String toString():把枚举常量转换成字符串;
- static T valueOf(Class enumType, String name):把字符串转换成枚举常量。
5:枚举构造器:
枚举类的构造器只能是private修饰,因为枚举类的实例不能由外界来创建。
但是要注意的是不需要手动添加,默认就是private
同时注意枚举类都是唯一构造器;有了无参的构造器,就不能定义有参的构造器,反过来同理。
public enum Season { SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); private final String name; Seanson(String name) { this.name = name; } public String getName() { return name; } }
6:枚举可以有成员
其实枚举类和正常的类一样,可以有实例变量,实例方法,静态方法等等,只不过它的实例个数是有限的,不能再创建实例而已。
public enum Season { SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); private final String name; Seanson(String name) { this.name = name; } public String getName() { return name; }
Serason s = Season.SPRING;
System.out.println(s.getName());
}
因为Serson类只有唯一的构造器,并且是有参的构造器,所以在创建枚举项时,必须为构造器赋值:SPRING(“front”),其中”front”就是传递给构造器的参数。你不要鄙视这种语法,你应该做的是接受这种语法!
Season类中还有一个实例域:String name,我们在构造器中为其赋值,而且本类还提供了getName()这个实例方法,它会返回name的值。
Season类中还有一个实例域:String name,我们在构造器中为其赋值,而且本类还提供了getName()这个实例方法,它会返回name的值。
7:枚举类中可以有抽象方法:
在枚举类中定义抽象方法的时候,然后在创建每一个枚举项的时候,都要通过匿名内部类的方式来重写抽象方法,每一个枚举项都是一个匿名类的子类对象。(注意这个应该是要必须重写的,毕竟每一个枚举项都是相当于创建了枚举类的对象,创建对象的时候,就要去实现他其中的抽象方法)。
通常fun()方法应该定义为抽象方法,因为每个枚举常量都会去重写它,你无法把Season生命为抽象类,但是需要声明fun()方法为抽象方法。
注意一定要加@Override
public enum Season { SPRING("春天"){ @Override public void fun(){ } }, SUMMER("夏天"){ @Override public void fun(){ } }, FALL("秋天"){ @Override public void fun(){ } }, WINTER("冬天"){ @Override public void fun(){ } }; private final String season; Season(String season) { this.season = season; } public String getSeason() { return season; } public abstract void fun(); }
8:每个枚举类都有两个特殊的方法:
每个枚举类都有两个不用声明就可以调用的static方法,而且这两个方法不是父类中的方法。这又是枚举类特殊的地方,下面是Direction类的特殊方法。
- static Direction[] values():返回本类所有枚举常量;
- static Direction valueOf(String name):通过枚举常量的名字返回Direction常量,注意,这个方法与Enum类中的valueOf()方法的参数个数不同。

浙公网安备 33010602011771号