Java中的枚举是一种特殊的类,用于存放一组常量,比如一年分为四个季节、车分为机动车和非机动车等。
枚举类型使用关键字enum进行修饰,定义一组常量,定义方式如下:
enum famulei{
/**
* famulei:伐木累
*/
ZHANGSAN,LISI,WANGWU
}
定义一个名为famulei的枚举类型,其中有三个成员,ZHANGSAN,LISI,WANGWU,枚举成员一般使用大写。
访问枚举类的成员可以直接通过枚举类名对成员进行访问:
System.out.println(famulei.ZHANGSAN);
输出结果:
也可以通过使用valus(),使用索引进行访问:
System.out.println(famulei.values()[1]);
枚举类型的遍历可以使用增强型for循环进行遍历,如下:
for (famulei f : famulei.values()) {
System.out.println(f);
}
枚举类中的常量可以在switch()中使用,例如:
package learning;
import java.util.Arrays;
import java.util.EnumMap;
/**
* @ClassName: MyEnum
* @Description: Enum learning
* @author: Lxy
* @date: 2021/9/23 11:53
*/
public class MyEnum {
enum famulei {
/**
* famulei:伐木累
*/
ZHANGSAN, LISI, WANGWU;
}
public famulei NameChangedEvent(){
famulei fml = famulei.LISI;
switch (fml){
case ZHANGSAN:
fml= famulei.LISI;
break;
case LISI:
fml=famulei.WANGWU;
break;
case WANGWU:
fml=famulei.ZHANGSAN;
break;
default:
System.out.println("Error!");
}
return fml;
}
public static void main(String[] args) {
MyEnum myEnum =new MyEnum();
System.out.println(myEnum.NameChangedEvent());
}
}
Java中枚举类型还提供了很多其他的方法,比如ordinal()、compareTo()、valueOf()以及上述提到的values()等。
//返回成员索引
System.out.println(famulei.LISI.ordinal());
//成员索引成员索引
System.out.println(famulei.ZHANGSAN.compareTo(famulei.WANGWU));
System.out.println("字符串ZHANGSAN对应的枚举成员:"+famulei.valueOf("ZHANGSAN"));
输出结果:
但是,如果枚举类型中不存在指定的字符串对应的成员,会抛出IllegalArgumentException异常:
System.out.println("字符串XIAOLIU对应的枚举成员:"+famulei.valueOf("XIAOLIU"));
System.out.println("无格式化输出:"+famulei.values());
System.out.println("格式化输出:"+ Arrays.toString(famulei.values()));
输出结果:
该方法返回了数组的地址,可以使用Arrays.toString()方法进行格式化。
枚举类型既然是一种特殊的类,那么就有自己的构造方法,使用构造方法可以对枚举类的成员进行属性(也许叫属性不太合适)说明。同时能够实现对成员属性的访问。
package learning;
import java.util.Arrays;
import java.util.EnumMap;
/**
* @ClassName: MyEnum
* @Description: Enum learning
* @author: Lxy
* @date: 2021/9/23 11:53
*/
public class MyEnum {
enum famulei {
/**
* famulei:伐木累
*/
ZHANGSAN("male",20), LISI("male",25), WANGWU("female",30);
private String sex;
private int age;
//构造方法
famulei(String sex, int age) {
this.sex=sex;
this.age=age;
}
}
public static void main(String[] args) {
System.out.println("LISI's age:"+famulei.LISI.age);
System.out.println("ZHANGSAN's sex:"+famulei.ZHANGSAN.sex);
}
}
可通过自定义方法修改成员属性,例如:
package learning;
import java.util.Arrays;
import java.util.EnumMap;
/**
* @ClassName: MyEnum
* @Description: Enum learning
* @author: Lxy
* @date: 2021/9/23 11:53
*/
public class MyEnum {
enum famulei {
/**
* famulei:伐木累
*/
ZHANGSAN("male",20), LISI("male",25), WANGWU("female",30);
private String sex;
private int age;
//构造方法
famulei(String sex, int age) {
this.sex=sex;
this.age=age;
}
//自定义方法
public void setSex(String sex){
this.sex=sex;
}
public void setAge(int age){
this.age=age;
}
}
public static void main(String[] args) {
System.out.println("ZHANGSAN's sex:"+famulei.ZHANGSAN.sex);
System.out.println("ZHANGSAN's age:"+famulei.ZHANGSAN.age);
famulei.ZHANGSAN.setSex("female");
famulei.ZHANGSAN.setAge(35);
System.out.println("ZHANGSAN's sex:"+famulei.ZHANGSAN.sex);
System.out.println("ZHANGSAN's age:"+famulei.ZHANGSAN.age);
}
}
上述Arrays.toString()方法输出枚举类型中的成员,可以对其进行重写,输出每一个成员的属性,例如:
package learning;
import java.util.Arrays;
import java.util.EnumMap;
/**
* @ClassName: MyEnum
* @Description: Enum learning
* @author: Lxy
* @date: 2021/9/23 11:53
*/
public class MyEnum {
enum famulei {
/**
* famulei:伐木累
*/
ZHANGSAN("male",20), LISI("male",25), WANGWU("female",30);
private String sex;
private int age;
//构造方法
famulei(String sex, int age) {
this.sex=sex;
this.age=age;
}
//自定义方法
public void setSex(String sex){
this.sex=sex;
}
public void setAge(int age){
this.age=age;
}
//重写方法
@Override
public String toString(){
return this.sex+"-"+this.age;
}
}
public static void main(String[] args) {
System.out.println(Arrays.toString(famulei.values()));
}
}
本文主要简单介绍Java中枚举类型的一些简单使用,此外,枚举类型也可用于实现接口等。