枚举Enum
让某个类型变量的取值只能为若干固定值中的一个否则编译器就会报错, 往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的
Enum相关语法
1)num时,编译器会为你生成一个相关的类,但是不能完全作为一个类看。这个类继承自java.lang.Enum,无法再继承其他类,只能实现接口,中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
2)举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰;
3)举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
4)switch使用enum
2)举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰;
3)举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
4)switch使用enum
Enum主要方法
1)ordinal()返回int值,enum实例顺序。
2)实现了Comparable接口,具有compareTo()
3)name()返回Enum实例声明时的名称
4)values()返回实例数组,EnumA.class.getEnumConstants()也可以
5)getDeclaringClass(),Eunm实例调用该方法可知所属Enum类名
2)实现了Comparable接口,具有compareTo()
3)name()返回Enum实例声明时的名称
4)values()返回实例数组,EnumA.class.getEnumConstants()也可以
5)getDeclaringClass(),Eunm实例调用该方法可知所属Enum类名
Enum用法
添加新方法<span style="font-weight: normal;">public enum EnumDemo {
RAD("rgb 255",255),YELLOW("rgb 123",123);
private String desc ;
private int age;
private EnumDemo(String desc,int age){
this.desc = desc;
this.age=age;
}
public String getDesc(){
return desc;
}
public int getAge(){
return age;
}
}</span>
<span style="font-weight: normal;">public class Test {
public static void main(String[] args) {
System.out.println(EnumDemo.RAD);
System.out.println("顺序" + EnumDemo.RAD.ordinal());
System.out.println("属性" + EnumDemo.RAD.getAge());
System.out.println("属性" + EnumDemo.RAD.getDesc());
System.out.println("实例名称" + EnumDemo.RAD.name());
System.out.println("实例个数" + EnumDemo.values().length);
// RAD
// 顺序0
// 属性255
// 属性rgb 255
// 实例名称RAD
// 实例个数2
}
}</span>
常量方法
<span style="font-weight: normal;">public enum EnumDemo {
RAD("rgb 255",255),YELLOW("rgb 123",123);
private String desc ;
private int age;
private EnumDemo(String desc,int age){
this.desc = desc;
this.age=age;
}
public String getDesc(){
return desc;
}
public int getAge(){
return age;
}
}</span>
<span style="font-weight: normal;">public class Test {
public static void main(String[] args) {
System.out.println(EnumDemo.RAD);
System.out.println("顺序" + EnumDemo.RAD.ordinal());
System.out.println("属性" + EnumDemo.RAD.getAge());
System.out.println("属性" + EnumDemo.RAD.getDesc());
System.out.println("实例名称" + EnumDemo.RAD.name());
System.out.println("实例个数" + EnumDemo.values().length);
// RAD
// 顺序0
// 属性255
// 属性rgb 255
// 实例名称RAD
// 实例个数2
}
}</span>
public enum EnumDemo {
//实例必须在最前面
RED("rgb 255", 255) {
public String getInfo() {
//实现接口
return "test RED";
}
},
YELLOW("rgb 123", 123) {
public String getInfo() {
return "test YELLOW";
}
};
private String desc;
private int age;
private EnumDemo(String desc, int age) {
this.desc = desc;
this.age = age;
}
public String getDesc() {
return desc;
}
public int getAge() {
return age;
}
//实例必须实现
<strong>abstract String getInfo();</strong>
}
public class Test {
public static void main(String[] args) {
System.out.println(EnumDemo.RED);
System.out.println(EnumDemo.RED.getInfo());
System.out.println(EnumDemo.RED.getDeclaringClass());
// RED
// test RED
// class metnoh.EnumDemo
}
}
枚举与接口
实现接口
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 接口方法
@Override
public String getInfo() {
return this.name;
}
// 接口方法
@Override
public void print() {
System.out.println(this.index + ":" + this.name);
}
}
用接口管理枚举
起到统一基类作用,并且接口可以给与对应的方法
enum Coffee implements EnumInf {
BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO;
@Override
public void eat() {
System.out.println("coffee");
}
}
enum Dessert implements EnumInf {
FRUIT, CAKE, GELATO;
@Override
public void eat() {
System.out.println("Dessert");
}
}
abstract void eat();
}