一,枚举类
- 在某些情况下,一个类的对象是有限且固定的,如季节类,它只有春夏秋冬四个对象,这种实例有限且固定的类,在Java中被称为枚举类。
- 在Java中使用enum关键字来定义枚举类,其地位与class,interface相同。
- 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量,成员方法,构造器(只能使用private访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举时被调用)。
- 一个Java源文件中最多只能有一个public类型的枚举类,且该Java源文件的名字必须和该枚举类的类名相同,这点和类是相同的。
- 使用enum定义的枚举类默认继承了java.lang.Enum类,并实现了java.lang.Seriablizable和java.lang.Comparable两个接口
- 所有的枚举值都是public static final的,且非抽象的枚举类不能再派生子类
- 枚举类的所有实例(枚举值)必须在枚举类的第一行显示地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加public static final修饰,无需程序员显示添加
二,枚举类的使用
定义枚举类
package p0527enum.p1;
/**
* @author: jdq8576
* @date: 2021-05-27 12:43
**/
public enum WeekEnum {
/**
* 在第一行显示地列出7个枚举实例(枚举值),系统会自动添加public static final修饰
*/
SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;
}
枚举类的成员变量,成员方法,构造器
package p0527enum.p2;
public enum WeekEnum {
/**
* 在第一行显示地列出7个枚举实例(枚举值),系统会自动添加public static final修饰
*/
SUNDAY("星期日"),MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六");
private String value;
private WeekEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
枚举类中常用方法
- int compareTo(E o);该方法用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回0;
package p0527enum.p2;
/**
* @author: jdq8576
* @date: 2021-05-27 12:48
**/
public class Test {
public static void main(String[] args) {
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.FRIDAY));
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.MONDAY));
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SATURDAY));
/** output
* 0
* 4
* -1
*/
}
}
- String name();返回此枚举实例的名称,即枚举值,在这里就是FRIDAY,SATURDAY....
- static values();返回一个包含全部枚举值的数组,可以用来遍历所有枚举值
package p0527enum.p2;
/**
* @author: jdq8576
* @date: 2021-05-27 12:48
**/
public class Test {
public static void main(String[] args) {
for (WeekEnum weekEnum:WeekEnum.values()){
System.out.println(weekEnum);
}
/**output
* SUNDAY
* MONDAY
* TUESDAY
* WEDNESDAY
* THURSDAY
* FRIDAY
* SATURDAY
*/
}
}
- String toString();默认的toString()方法和 name() 方法的效果是一样的,有的时候我们还可以重写toString()f方法。
package p0527enum.p2;
public enum WeekEnum {
/**
* 在第一行显示地列出7个枚举实例(枚举值),系统会自动添加public static final修饰
*/
SUNDAY("星期日"),MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六");
private String value;
private WeekEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
package p0527enum.p2;
/**
* @author: jdq8576
* @date: 2021-05-27 12:48
**/
public class Test {
public static void main(String[] args) {
for (WeekEnum weekEnum : WeekEnum.values()) {
System.out.println(weekEnum);
}
/**
* output
* 星期日
* 星期一
* 星期二
* 星期三
* 星期四
* 星期五
* 星期六
*/
}
}
- int ordinal():返回枚举值在枚举类中的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定;
package p0527enum.p2;
/**
* @author: jdq8576
* @date: 2021-05-27 12:48
**/
public class Test {
public static void main(String[] args) {
System.out.println(WeekEnum.MONDAY.ordinal());
/**
* output
* 1
*/
}
}
- static valueof();返回带指定名称的指定枚举类型的枚举常量。
package p0527enum.p2;
/**
* @author: jdq8576
* @date: 2021-05-27 12:48
**/
public class Test {
public static void main(String[] args) {
System.out.println(WeekEnum.valueOf(WeekEnum.class, "FRIDAY"));
/**
* output
* 星期五
*/
}
}
- boolean equals()方法,比较两个枚举对象的引用。
三,使用枚举类实现接口
与普通类一样,枚举类也可以实现一个或多个接口。枚举类实现接口时,同样要实现该接口的所有方法。
package p0527enum.p3;
/**
* @author: jdq8576
* @date: 2021-05-27 13:33
**/
public interface GenderDescription {
public void info();
}
package p0527enum.p3;
/**
* @author: jdq8576
* @date: 2021-05-27 17:00
**/
public enum Gender implements GenderDescription {
MAIL, FEMALE;
@Override
public void info() {
System.out.println("这是一个用于定义性别的枚举类");
}
}
package p0527enum.p3;
/**
* @author: jdq8576
* @date: 2021-05-27 17:01
**/
public class Test {
public static void main(String[] args) {
Gender.MAIL.info();
Gender.FEMALE.info();
/**output
* 这是一个用于定义性别的枚举类
* 这是一个用于定义性别的枚举类
*/
}
}
四,包括抽象方法的枚举类
定义一个Operation枚举类,有四个枚举值PLUS,MINUS,TIMES,DIVIDE,分别代表加,减,乘,除,该枚举类有一个claculate()方法,用于完成计算。
package p0527enum.p4;
/**
* @author: jdq8576
* @date: 2021-05-27 17:07
**/
public enum Operation {
PLUS {
@Override
public double calculate(double x, double y) {
return x + y;
}
},
MINUS {
@Override
public double calculate(double x, double y) {
return x - y;
}
},
DIVIDE {
@Override
public double calculate(double x, double y) {
return x / y;
}
},
TIMES {
@Override
public double calculate(double x, double y) {
return x * y;
}
};
public abstract double calculate(double x, double y);
}
package p0527enum.p4;
/**
* @author: jdq8576
* @date: 2021-05-27 17:09
**/
public class Test {
public static void main(String[] args) {
System.out.println("6 + 2 = " + Operation.PLUS.calculate(6, 2));
System.out.println("6 - 2 = " + Operation.MINUS.calculate(6, 2));
System.out.println("6 * 2 = " + Operation.TIMES.calculate(6, 2));
System.out.println("6 / 2 = " + Operation.DIVIDE.calculate(6, 2));
/**output
* 6 + 2 = 8.0
* 6 - 2 = 4.0
* 6 * 2 = 12.0
* 6 / 2 = 3.0
*/
}
}