枚举Enumeration
枚举
它的对象(具体值)是固定的时(如:性别、季节等)不会更多,普通类不能体现它们是固定的若干个对象。
枚举(enumeration,简写enum)是一组常量的集合;可以理解为特殊的类,里面仅包含一组有限的特定对象。
自定义实现枚举
- 构造器私有化,防止直接实例化对象
- 去掉set方法,防止属性被修改;保证对象只读
- 对枚举对象和属性使用final+static一起修饰,实现底层优化
- 枚举对象名通常使用全部大写,常量的命名规范
自定义枚举实现四季
public class Enumeration {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.AUTUMN);
}
}
class Season{
private String name;
private String desc;
public final static Season SPRING =new Season("春天","潮湿");
public final static Season SUMMER =new Season("夏天","炎热");
public final static Season AUTUMN =new Season("秋天","凉爽");
public final static Season WINTER =new Season("冬天","寒冷");
// 在Season内部直接创建固定对象
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
enum关键字实现枚举
- 使用enum关键字替代class
-
public final static Season SPRING =new Season("春天","潮湿");
换成(等价于)SPRING("春天","潮湿")
。 - 如果有多个常量(对象),用","隔开即可
- 使用enum实现枚举要把定义常量对象写在最前。
- 如果使用无参构造器可以省略()。
enum关键字实现枚举
public class Enumeration {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.AUTUMN);
}
}
// enum关键字枚举
enum Season{
// 定义常量对象
SPRING("春天","潮湿"),
SUMMER("夏天","炎热"),
// OTHER,// 调用无参构造器
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷");
private String name;
private String desc;
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
/* Season() { // 无参构造器
}*/
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
图 1.编译与反编译
enum常用方法
- toString:Enum类已经重写,返回的是当前对象
- name:返回的是当前对象名(常量名),子类中不能重写
- ordinal:返回当前对象的位置号,
- values返回当前枚举类中所有的常量
- ValuesOf:把字符串转成枚举对象,要求字符串必须为已有的常量名,否则提示异常
- compareTo:比较两个枚举常量(比较编号)。
枚举类的常用方法
public class EnumMethod {
public static void main(String[] args) {
Season autumn=Season.AUTUMN;
// 输出枚举对象名
System.out.println(autumn.name());
// 输出该枚举对象的次序/编号(从0开始)
System.out.println(autumn.ordinal());
// values()从反编译可以查看该方法;返回所有定义的枚举对象
for (Season season:Season.values()){// 增强for循环;遍历取出
System.out.println(season);
}
//valueOf:把字符串转成枚举对象,要求字符串必须为已有的常量名,否则提示异常
//根据输入的"AUTUMN"参数到Season的枚举对象去查找,找到就返回,没有就报错
Season autumn1=Season.valueOf("AUTUMN");
System.out.println("autumn1="+autumn1);
System.out.println(Season.AUTUMN.compareTo(Season.WINTER));
System.out.println(autumn1 == autumn); //判断两个对象是否为同一个
}
}
enum实现接口
使用enum关键字后就不能继承其他类;因为它有隐式继承了Enum,同时Java是单继承机制。
枚举类和普通类一样可以实现接口。形式:enum 类名 implements 接口1,接口2{}
。
查看代码
public class EnumMethod {
public static void main(String[] args) {
System.out.println("所有星期信息如下");
for (Week week:Week.values()){
System.out.println(week.getName());
}
}
}
enum Week{ // enum Week extends A{ 会提示异常。
ONE("星期一"),
TWO("星期二"),
THREE("星期三"),
FIRE("星期四"),
FIVE("星期五"),
SIX("星期六"),
SEVEN("星期日");
private String name;
Week(String name) {
this.name = name;
}
public String getName() {
return name;
}
}