目录
一、什么是枚举类?
封装了一组常量对象。如果类型的对象数量固定,则可以定义成枚举类型。
二、为什么要使用枚举类?
在没有枚举类型的情况下,我们要表示如三原色、四季、性别这些对象时,往往都是定义成常量。如下面代码,但这么做的话有一些缺点,比如意义不明确,类型不安全被用于其他无关计算等。但是定义枚举类就可以解决这些问题。
class Color{
public static final int RED = 1;
public static final int GREEN = 2;
public static final int BLUE = 3;
}
public class TestColor {
public static void main(String[] args) {
//输出 1 意义不明确
System.out.println(Color.RED);
//用于其他无法计算,类型不安全
int n = Color.RED + 45;
System.out.println(n);
}
}
三、如何声明和使用枚举类?
1.枚举类的声明及成员
语法格式:
enum 类型名{
对象;
成员变量;
构造器();private
方法();
抽象方法() abstract
重写 方法();
实现其它接口中的方法
}
示例代码及枚举类型使用说明:
interface Info{
void f();
}
//实现接口
enum Color implements Info{
//给构造器传参
RED(1,"红色") {
@Override
public void af() {
System.out.println("red_af");
}
@Override
public void f() {
System.out.println("red_f");
}
},GREEN(2,"绿色") {
@Override
public void af() {
System.out.println("green_af");
}
@Override
public void f() {
System.out.println("green_f");
}
},BLUE(3,"蓝色") {
@Override
public void af() {
System.out.println("blue_af");
}
@Override
public void f() {
System.out.println("blue_f");
}
};
private int no;
private String name;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private Color(int no, String name) {
this.no = no;
this.name = name;
}
//方法
public void show(){
System.out.println("show");
}
//重写 只能重写Enum类中的一个方法,即toString方法
@Override
public String toString() {
return this.no + ":" + this.name;
}
//抽象方法:所有对象都实现后,枚举类型变成抽象枚举类
public abstract void af();
}
public class TestEnum {
public static void main(String[] args) {
System.out.println(Color.RED);
//遍历所有的枚举对象
for(Color c : Color.values()){
//获取对象名字
System.out.println(c.name());
//获取对象的索引位置
System.out.println(c.ordinal());
}
//用于switch语句
/*Scanner sc = new Scanner(System.in);
System.out.print("--输入一个颜色:");
String str = sc.next();
//将字符串转换成枚举类型
Color color = Color.valueOf(str);
switch (color) {
case RED:
System.out.println("是红色");
break;
case GREEN:
System.out.println("是绿色");
break;
case BLUE:
System.out.println("是蓝色");
break;
}*/
//调用属性
// System.out.println(Color.RED.no);
// System.out.println(Color.RED.name);
// Color.RED.setNo(10);
// Color.RED.setName("Jiangw");
System.out.println(Color.RED.getNo());
System.out.println(Color.RED.getName());
//调用方法
Color.RED.show();
//调用重写方法
System.out.println(Color.RED);
//调用抽象方法
Color.RED.af();
//调用接口方法
Color.RED.f();
}
}
2.反编译枚举类
命令:javap -private 全类名
四、注意事项
1.枚举底层是个类,隐式的继承了Enum类,不能再继承其他类了。
2.枚举类的对象必须在声明枚举类的第一行代码处列举出来。
3.所有的枚举对象都是public static final的。
4.枚举类的构造器都是私有的private。
5.对于一个非抽象枚举类通常是final的。
6.一个枚举类中,定义了abstract抽象方法并且所有对象都实现了这个抽象方法,那么这个枚举类就成了抽象枚举类了。