枚举类入门
枚举类与普通类的区别:
- 枚举类可以实现一个或多个接口。枚举类默认继承java.lang.Enum类,其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。并没有默认集成Object类,因而枚举类不能显式继承其他父类。
- 非抽象枚举类默认使用final修饰,因而不能派生子类。抽象枚举类没有用final修饰。
- 枚举类的构造器只能用private修饰
- 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出实例时,系统会自动添加public static final修饰,无需程序员手动添加。
public enum Season {
Spring,Summer,Autumn,Winter;
}
package FirstTime;
public class EnumTest {
private void judge(Season s) {
//switch语句里面的表达式可以使枚举类,case表达式中的值直接使用枚举值的名字,无需添加枚举类作为限定
switch (s) {
case Spring:
System.out.println("Spring");
break;
case Summer:
System.out.println("Summer");
break;
case Autumn:
System.out.println("Autumn");
break;
case Winter:
System.out.println("Winter");
break;
default:
break;
}
}
public static void main(String[] args) {
//枚举类默认有一个values()方法,返回该枚举类的所有实例
for (Season season : Season.values()) {
System.out.println(season);
}
//使用枚举实例时,可用EnumClass.variable形式来访问
new EnumTest().judge(Season.Spring);
}
}
java.lang.Enum类提供了如下几个方法:
java.lang.Enum API文档
枚举类的成员变量、方法和构造器
getter、setter方法:
package FirstTime;
public enum Gender {
MALE,FEMALE;
private String name;
public void setName(String name) {
switch (this) {
case MALE:
if (name.equals("MAN")) {
this.name = name;
} else {
System.out.println("WRONG!");
return;
}
break;
case FEMALE:
if (name.equals("WOMEN")) {
this.name = name;
} else {
System.out.println("WRONG!");
return;
}
break;
}
}
public String getName() {
return this.name();
}
public static void main(String[] args) {
Gender gender = Gender.valueOf("FEMALE");
gender.setName("WOMEN");
System.out.println(gender.getName());
gender.setName("MAN");
}
}
//public static <T extends Enum<T>>T valueOf(class<T> enumType,String name):用于返回指定枚举类中指定名称的枚举值。名称必须与在该枚举类中声明枚举值时所用的标识符完全匹配,不允许使用额外的空白字符。等价于EnumClass.variable。
构造器:
public enum Gender {
//此处的枚举值必须调用对应的构造器来创造
FEMALE("WOMEN"),MALE("MAN");
private final String name ;
//枚举类的构造器只能使用private来修饰
private Gender(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
实现接口的枚举类
public interface GenderDesc {
void info();
}
public enum Gender implements GenderDesc {
//此处的枚举值必须调用对应的构造器来创造
FEMALE("WOMEN"){
//花括号部分实际上是一个类体部分
public void info() {
System.out.println("WOMEN");
}
},MALE("MAN"){
public void info() {
System.out.println("MEN");
}
};
private final String name ;
//枚举类的构造器只能使用private来修饰
private Gender(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
Gender gender = Gender.valueOf("FEMALE");
gender.info();
}
}
/*当创建MALE、FEMALE枚举值时,并不是直接创建Gender枚举类的实例,而是相当于创建了Gender的匿名子类的实例。编译时可看到生成了Gender.class、Gender$1.class、Gender$2.class三个文件*/
包含抽象方法的枚举类
package ObjectOrient;
public enum Operation {
PLUS{
public double eval(double a, double b) {
return a + b;
}
},
MINUS{
public double eval(double a, double b) {
return a - b;
}
},
TIMES{
public double eval(double a, double b) {
return a * b;
}
},
DIVIDE{
public double eval(double a, double b) {
return a / b;
}
};
//为枚举类定义一个抽象方法,由不同的枚举值实现
public abstract double eval(double a, double b) ;
/*枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统会自动为他添加abstract关键字),
* 但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误*/
public static void main(String[] args) {
System.out.println(Operation.DIVIDE.eval(3, 4));
}
}