对象有限且固定不变的类,在Java里被称为枚举类。例如季节类,它只有春夏秋冬四个实例,因此可以用枚举类来表示。
/**
* @description: 季节枚举类
* @author: Murphy
* @date: 2020/6/274:08 上午
*/
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
枚举类是一个特殊的类,它一样可以有自己的成员变量、成员方法、构造器,可以实现一个或多个接口。
枚举类的优势:
①有些类的实例有限且固定,需要一些特定且方便的方式来表示这些类;
②使用枚举类可以使程序更加健壮,避免创建对象的随意性;
③避免一些常量值的意义不明确。
枚举类的特征:
①枚举类默认继承了java.lang.Enum类,因此不能再继承其他的类;
②非抽象的枚举类默认会使用final关键字修饰,因此非抽象的枚举类不能被其他类继承;
③枚举类的构造器只能用private关键字修饰,如果用其他的访问权限修饰符修饰则编译会报错;
④枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远不可能产生实例,这些实例默认被public static final所修饰,不同实例之间以逗号分隔,分号结束,实例名称所有字母需大写;
⑤枚举类每个实例成员变量的值是不能改变的,应该用private final修饰。
初始化成员变量的方法:
因为枚举类的所有成员变量都要用private final修饰,因此需要使用下面三种方法为成员变量指定初始值:
①在构造器里为这些成员变量指定初始值;
②在定义成员变量时指定默认值;
③在静态代码块中指定初始值。
其中,最常用的是第一种方法。
public enum Season {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
private final String name;
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
switch()流程控制语句中的条件语句可以是枚举类型,此时case表达式中的值可以直接使用枚举类对象的值。
/**
* @description: 季节枚举类
* @author: Murphy
* @date: 2020/6/274:08 上午
*/
public enum Season {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
private final String name;
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void method(Season season) {
switch (season) {
case SPRING:
System.out.println("春天到了");
break;
case SUMMER:
System.out.println("夏天到了");
break;
case AUTUMN:
System.out.println("秋天到了");
break;
case WINTER:
System.out.println("冬天到了");
break;
default:
System.out.println("这不是一个季节");
}
}
}
实现接口的枚举类,不同的实例可以提供不同的接口实现方式。
/**
* @description: 定义一个接口
* @author: Murphy
* @date: 2020/6/275:17 上午
*/
public interface Info {
void info();
}
//实现接口的一般形式
/**
* @description: 季节枚举类
* @author: Murphy
* @date: 2020/6/274:08 上午
*/
public enum Season implements Info {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
private final String name;
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void info() {
System.out.println("重写接口中的方法");
}
}
//枚举类实现接口的特有方式
/**
* @description: 季节枚举类
* @author: Murphy
* @date: 2020/6/274:08 上午
*/
public enum Season implements Info {
SPRING("春天") {
@Override
public void info() {
System.out.println("这是春天");
}
}, SUMMER("夏天") {
@Override
public void info() {
System.out.println("这是夏天");
}
}, AUTUMN("秋天") {
@Override
public void info() {
System.out.println("这是秋天");
}
}, WINTER("冬天") {
@Override
public void info() {
System.out.println("这是冬天");
}
};
private final String name;
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
}