javaAPI-4
枚举类定义
生活中常见的枚举实例:一周的七天,一年的十二个月,性别男女,硬币的正反面等,这些类型具有的对象都是有限个数的,且不可变。在java中当然可以通过在类或接口中定义静态常量的方式来模拟:
public class WeekDays{
public static final String MONDAY="MONDAY";
public static final String TUESDAY="TUESDAY";
public static final String WEDNESDAY="WEDNESDAY";
public static final String THURSDAY="THURSDAY";
public static final String FRIDAY="FRIDAY";
public static final String SATURDAY="SATURDAY";
public static final String SUNDAY="SUNDAY";
}
调用时候就可以通过类名直接调用这些常量,但是这样做也存在一些问题,比如实际定义的表示周几的对象并不是限定个数的,可以在其他地方创建对象再定义新的类型,这样就使得定义常量的方式不够安全,因此有了枚举类enum来解决该类问题,上述代码放到enum类中表示:
public enum WeekDays{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
}
可以看到代码量少了很多,枚举类中列出的都是本类的对象,中间使用逗号隔开,最后才是分号,除了在该位置定义外,其他位置不能创建枚举类的对象,因而确保了个数有限且受控
枚举类和普通类的区别在于:
枚举类的第一行必须声明拥有的几个对象,不能是其他内容;
枚举类是默认要继承java.lang包下的Enum类的,由于java的单继承属性,所有的枚举类都不能声明继承其他类
除去上面两条外,枚举类与普通类没有太大差别,可以有成员变量,也可以有方法(包括普通方法,静态方法,甚至是抽象方法),同时也可以去实现接口
枚举类定义成员变量和方法
还是以上面的一周七天的例子举例
public enum WeekDays {
MONDAY(" left me broken"),
TUESDAY("I was through with hopin'"),
WEDNESDAY("my empty arms were open"),
THURSDAY("waiting for love"),
FRIDAY("Thank the stars"),
SATURDAY("I'm burning like a fire gone wild"),
SUNDAY("Guess I won't be coming to church");
private String desc;//属性是不受限的
//因为不允许在enum类外创建对象,因此构造器都是默认私有的,不允许public和protected修饰
private WeekDays(String desc){
this.desc=desc;
}
public String getDesc(){//除构造方法以外的方法同样不受限
return desc;
}
}
public class Test{
public static void main(String[] args){
String thursdayDesc=WeekDays.THURSDAY.getDesc();
System.out.println(WeekDays.THURSDAY+" "+thursdayDesc);//THURSDAY waiting for love
}
}
静态方法就不演示了,和普通方法区别不大,下面演示下抽象方法的定义
public enum AllDay {//注意enum类是不可声明为抽象类的,因此必须实现抽线方法
MORNING{//在每个类的对象中使用匿名内部类的形式去实现抽象方法
public void doWhat(){
System.out.println("吃饭");
}
},
AFTERNOON{
public void doWhat(){
System.out.println("打豆豆");
}
},
EVENING{
public void doWhat(){
System.out.println("睡觉");
}
};
public abstract void doWhat();//这里定义了抽象方法
}
public class Test {
public static void main(String[] args){
AllDay.AFTERNOON.doWhat();//这里就可以直接调用抽象方法了
}
}
还有两个常用的枚举类型方法:valueOf(String)和values(),前者是通过传入的字符串名称,返回指定对象,当枚举类型的名称中找不到传入字符串时,会抛出异常;后者就是返回枚举对象的数组
一般来说接口的定义是为了声明某项功能,枚举类实现接口的意义不大,下面只举一个通过接口内定义枚举来对枚举对象分类的例子
public interface Brand {
enum Pen {
HERO,
PARKER,
PICASSO;
}
enum Pencil{
ZHONGHUA,
UNI,
MARCO;
}
enum Marker{
SANFORD,
SAKURA,
STABILO;
}
}
class Test{
public static void main(String[] args) {
System.out.println(Brand.Pen.HERO);
}
}