Java(24)枚举类enum
枚举类enum
枚举类通过enum
关键字声明,枚举类跟普通类没多大的区别。
枚举类的特点:
- 定义的
enum
类型总是继承自java.lang.Enum
,且无法被继承,因为默认被final
修饰
public enum color{}
//相当于public final class color extends enum{}
enum
类无法通过new
创建实例对象,实例只能在枚举类内定义,且实例名称一般使用纯大写。
enum Festival{
SPRING,SUMMER, AUTUMN, WINTER;
//上面四个实际上都是枚举类的实例
/*相当于:
public final static Festival SPRING=new Festival();
public final static Festival SUMMER=new Festival();
public final static Festival AUTUMN=new Festival();
public final static Festival WINTER=new Festival();
*/
}
class RunClass{
public static void main(String[] args) {
Festival fa=Festival.SPRING; //从这里可以看出枚举类的实例在是类内定义的
//Festival fb=new Festival();-->编译错误:Enum types cannot be instantiated
}
}
- 枚举类是单例模式,即类内定义的每个实例都是唯一实例。
package day01;
enum Festival{
SPRING,SUMMER, AUTUMN, WINTER;
}
class RunClass{
public static void main(String[] args) {
Festival fa=Festival.SPRING;
Festival fb=Festival.SPRING;
System.out.println(fa.equals(fb));//输出true,说明fa和fb指向同一个对象
Festival fc=Festival.SUMMER;
Festival fd=Festival.SUMMER;
System.out.println(fc.equals(fd));//输出true
}
}
/*注意:对于非String类的引用类型,equals()作用是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象*/
- 枚举类的构造器只能使用
private
访问控制符,如果省略了构造器的访问控制符,则默认使用private
修饰。(从上面的单例模式特点就可以看出来)
enum WeekDay{
MONDAY,TUESDAY,WENDESDAY;
//public WeekDay(){} --->编译报错,枚举类的构造器默认使用private,也只能是private
}
案例1:
package day01;
enum Festival{
SPRING("春天","天气晴朗,温度适中"), //实际上这4个实例相当于调用构造方法2
SUMMER("夏天","天气很热,容易下雨"),
AUTUMN("秋天","天气渐冷,收割的季节"),
WINTER("冬天","天气寒冷,手脚僵硬");
private String name;
private String desc;
//构造方法1:
Festival(){}
//构造方法2:
Festival(String name, String desc){
this.name=name;
this.desc=desc;
}
public void showInfo(){
System.out.println(this.name+" : "+this.desc);
}
}
class RunClass{
public static void main(String[] args) {
Festival fa=Festival.SPRING;
fa.showInfo();
Festival fw=Festival.WINTER;
fw.showInfo();
}
}
/*运行结果为:
春天 : 天气晴朗,温度适中
冬天 : 天气寒冷,手脚僵硬
*/
案例2:枚举类的常用方法
enum Festival{
SPRING,SUMMER,AUTUMN,WINTER;
}
class RunClass{
public static void main(String[] args) {
Festival fw=Festival.WINTER;
fw.name(); //返回枚举常量的名称
fw.ordinal();//返回枚举常量的序数
}
}
案例3:枚举类与switch
的结合使用
package day01;
enum Festival{
SPRING,SUMMER,AUTUMN,WINTER;
}
class RunClass{
public static void main(String[] args) {
Festival ft=Festival.AUTUMN;
switch (ft){
case SPRING:
System.out.println("这是春天");
break;
case SUMMER:
System.out.println("这是夏天");
break;
case AUTUMN:
System.out.println("这是秋天");
break;
case WINTER:
System.out.println("这是冬天");
break;
default:
System.out.println("不认识"+ft);
}
}
}