第8章 枚举与注解

40 篇文章 0 订阅
40 篇文章 0 订阅

8.1 枚举

8.1.1 什么是枚举

类的对象只有有限个的、确定的

例如:

星期:Monday(星期一)......Sunday(星期天)

性别:Man(男)、Woman(女)

月份:January(1月)......December(12月)

季节:Spring(春节)......Winter(冬天)

七彩标准色:Red(红)......Purple(紫)

支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)

就职状态:Busy、Free、Vocation、Dimission

订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已确认)

8.1.2 如何定义枚举类型

要点:

  1. 私有化类的构造器,保证不能在类的外部创建其对象
  2. 在类的内部创建枚举类的实例。声明为:public static final

JDK1.5之前:

public class TestEnumType {

 

    public static void main(String[] args) {

        Season s = Season.SPRING;

        System.out.println(s);

    }

 

}

class Season{

    public static final Season SPRING = new Season();

    public static final Season SUMMER = new Season();

    public static final Season AUTUMN = new Season();

    public static final Season WINTER = new Season();

   

    private Season(){

    }

   

    public String toString(){

        if(this == SPRING){

            return "SPRING";

        }else if(this == SUMMER){

            return "SUMMER";

        }else if(this == AUTUMN){

            return "AUTUMN";

        }else{

            return "WINTER";

        }

    }

}

JDK1.5之后:

  1. 使用 enum 定义的枚举类默认继承了 java.lang.Enum类。因此不能再继承其他类。
  2. 枚举类的所有构造器只能使用 private 访问控制符
  3. 枚举类的所有实例必须在枚举类中显式列出(, 分隔    ; 结尾),必须在枚举类的第一行声明枚举类对象。列出的实例系统会自动添加 public static final 修饰
  4. JDK 1.5 之后可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字

package com.enumtype.after15;

 

public class TestEnumType {

 

    public static void main(String[] args) {

        Season s = Season.SPRING;

        switch(s){

        case SPRING:

            System.out.println("春暖花开");break;

        case SUMMER:

            System.out.println("夏日炎炎");break;

        case AUTUMN:

            System.out.println("秋高气爽");break;

        case WINTER:

            System.out.println("白雪皑皑");break;

        }

    }

 

}

enum Season{

    SPRING,SUMMER,AUTUMN,WINTER;

}

8.1.3 java.lang.Enum类的方法

除了toString方法,都是final修饰的方法,因此都不能重写

 

还有两个API文档中没有,但枚举类类拥有并且常用的方法

  1. values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
  2. valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。

8.1.4 枚举的特别说明

1、枚举中定义属性

  1. 枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰。不是语法要求,而是语义要求
  2. 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。
  3. 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。

package com.enumtype.before15;

 

public class TestWeekField {

 

    public static void main(String[] args) {

        Week w = Week.MONDAY;

        System.out.println(w);

    }

}

enum Week{

    MONDAY("星期一"),

    TUESDAY("星期二"),

    WEDNESDAY("星期三"),

    THURSDAY("星期四"),

    FRIDAY("星期五"),

    SATURDAY("星期六"),

    SUNDAY("星期日");

    private final String DESCRPTION;

 

    private Week(String dESCRPTION) {

        DESCRPTION = dESCRPTION;

    }

    public String toString(){

        return DESCRPTION;

    }

}

2、枚举类可以自定义方法,静态和非静态

3、枚举类可以实现一个或者多个接口(了解)

若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法

interface Change{

    void degenerate();

}

interface Checkable{

    void check();

}

enum Gender implements Change,Checkable{

    MAN{

        public void degenerate(){

            System.out.println("咔嚓一刀");

        }

    },WOMAN{

        public void degenerate(){

            System.out.println("比较复杂");

        }

    };

    public void check(){

        System.out.println("脱光");

    }

}

4、枚举类可以自己定义抽象方法(了解)

enum Payment{

    CASH{

        public void pay(){

            System.out.println("现金支付");

        }

    },

    WECHAT{

        public void pay(){

            System.out.println("微信支付");

        }

    },

    ALIPAY{

        public void pay(){

            System.out.println("支付鸨支付");

        }

    },

    CARD{

        public void pay(){

            System.out.println("银行卡支付");

        }

    },

    CREDIT{

        public void pay(){

            System.out.println("信用卡支付");

        }

    };

    public abstract void pay();

}

 

8.1.5 关于枚举的拓展

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值