自定义类实现枚举时
1.不需要setXXX方法,因为枚举对象通常只读
2.枚举属性用final static共同修饰,实现底层优化
3.枚举对象名全部大写
4.枚举对象可以有多个属性
class Season {
private String name;//名字
private String description;//描述
public String getName () {
return name;
}
public String getDescription () {
return description;
}
private String Season (String name, String description) {
this.name = name;
this.description = description;
}
public final static Season SPRING = new Season ("春天","温暖");
public final static Season SUMMER = new Season ("夏天","炎热");
}
当我们使用enum枚举类时,上面的代码就可以简化很多
enum Season {
SPRING("春天","温暖"),SUMMER("夏天","炎热");
private String name;
private String description;
private Season (String name, String description){
this.name = name;
this.description = description;
}
}
public class Test{
public static void main (String [] args) {
Season ss = Season.SPRING;
}
}
enum使用注意事项:
1.每一个枚举类都会默认继承Enum类,并且是一个final的类。即final class Season extends Enum
2.在生成枚举类是,编译器会给我们生成两个方法,valueOf()和values()
3.如果使用的是无参构造器,那么()可以省略,即SPRING,SUMMER;
4.有多个枚举对象时,使用 , 间隔,最后一个 ; 结尾
5.枚举对象必须放在枚举类的第一行
Enum抽象类常见方法
返回类型 | 方法名称 | 方法说明 |
---|---|---|
int | compareTo(E other) | 枚举类实现了Comparable接口,比较此枚举与指定对象的顺序,如果枚举常量出现在other之前,则返回一个负值,如果==,返回0,否则返回正值。枚举顺序 - other顺序 |
boolean | equals(Object other) | 当指定对象等于此枚举常量时,返回 true。底层是直接用”==“来实现的 |
Class | getDeclaringClass() | 返回与此枚举常量的枚举类型相对应的 Class 对象 |
String | name() | 返回此枚举常量的名称 |
int | ordinal() | 返回枚举常量的序数(它在枚举声明中的位置,初始序数为0) |
String | toString() | 返回枚举常量的名称,底层调用name(),所以一般重写,更常用 |
T | static valueOf(Class enumType, String name) | 返回带指定名称的指定枚举类型的枚举常量 |
以上是Enum抽象类的一些基本方法
而编译器为我们生成的values()和valueOf(String name)方法是枚举类特有的
valesOf()
编译器生成的valueOf(String name)方法需传递一个name参数,而Enum自带的静态方法valueOf()则需要传递两个参数,编译器生成的valueOf方法最终还是调用了Enum类的valueOf方法。
Season ss = Season.valueOf("SPRING");
System.out.println("ss=" + ss);// ss=SPRING
values()
values()就是获取枚举类中的所有变量,并作为数组返回
//注意,当枚举实例向上转型为Enum类型时,values()方法失效
Season [] seasons = Season.values();
System.out.println(Arrays.toString(seasons));// [SPRING,SUMMER]
由于Class对象的存在,即使不使用values()方法,也可以获取到所有枚举实例变量
返回类型 | 方法名称 | 方法说明 |
---|---|---|
T[] | getEnumConstants() | 返回该枚举类型的所有元素,如果Class对象不是枚举类型,则返回null。 |
boolean | isEnum() | 当且仅当该类声明为源代码中的枚举时返回 true |
Season [] seasons = Season.values();//正常使用
Enum s = Season.SPRING;//向上转型
Class clazz = s.getDeclaringClass();
if(clazz.isEnum()){
Season [] seasons2 = (Season [])clazz.getEnumConstans();
System.out.println("seasons2:"+Arrays.toString(seasons2));
}
//输出 season2:[SPRING,SUMMER]
enum类中定义抽象方法
enum Week {
MONDAY("星期一"){
@Override
void info() {
return("哈哈周一");
}
},TUESDAY("星期2"){
@Override
void info() {
return("哈哈周二");
}
};
String name;
Week(String name) {
this.name = name;
}
@Override
public String toString() {
return name ;
}
abstract void info();
}
public class test{
pulic static void main (String [] args) {
System.out.println(Week.MONDAY.info());
}
}