枚举
对于有些与类无关的对象,可以使用枚举能限定对象。例如我们知道一共有四个季节,除了春夏秋冬外,不会有其他的季节
写一个枚举类Season
public enum Season {
}
注意这个类不能继承,因为其隐式继承了Enum类,java是单继承机制,但可以实现接口
在里面像普通类一样写季节的名称、气候属性,以及构造器及get方法
public enum Season {
private String name;
private String desc;
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
现在是一个重要的步骤,我们只要春夏秋冬四个常量对象
在枚举类Season中写入枚举常量对象
public enum Season {
//定义枚举常量对象,写在行首
//本质为public static final Season SPRING = new Season("春天","温暖")
SPRING("春天", "温暖"),
SUMMER("夏天", "炎热"),
AUTUMN("秋天", "凉爽"),
WINTER("冬天", "寒冷");
//多个对象间用逗号 , 隔开,在枚举的对象列表最后分号
private String name;
private String desc;
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
SPRING常量对象本质为public static final Season SPRING = new Season(“春天”,“温暖”),可以看出,其在加载类的时候已经创建了对象
现在,在main方法中只能调用SPRING,SUMMER,WINTER或WINTER对象
public class Main{
public static void main(String[] args) {
System.out.println(Season.SUMMER.getDesc);
System.out.println(Season.WINTER);//枚举类的toString方法,返回常量对象名
}
}
输出
炎热
WINTER
注意:当常量对象无参数时,可以省略括号
public enum A{
a,b(10),c;
A() {
}
A(int num) {
}
}
枚举的一些方法
//name 返回当前对象名(常量名),子类中不能重写
System.out.println(Season.SPRING.name());//SPRING
//ordinal 返回当前对象在对象列表的位置下标
System.out.println(Season.WINTER.ordinal());//3
//values 返回当前枚举类中所有常量
for (Season s : Season.values()) {
System.out.println(s);//将每个常量名按顺序输出
}
//valueOf 将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常IllegalArgumentException
Season season = Season.valueOf("SPRING");
//Season season0 = Season.valueOf("SPRIN");//错误
//compareTo 比较两个枚举常量的编号
//Season.WINTER[3] - Season.SUMMER[1]
System.out.println(Season.WINTER.compareTo(Season.SUMMER));//2