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);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值