1 枚举引入

Java是一门面向对象的语言,当我们创建好一个类以后,可以创建这个类的多个对象
但是一个类究竟创建多少个对象,并且对象代表的值我们是无法限制的
所以,如果开发中需要一组值,需要的数据是明确的,就可以使用枚举

2 枚举概念

枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的。比如:

星期:Monday(星期一)…Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春天)…Winter(冬天)
支付方式:Cash(现金)、WeChatpay(微信支付)、AliPay(支付宝支付)、BankCard(银行卡支付)、CreditCard(信用卡支付)
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已收货)

所以,如果当我们需要定义一组常量表示不同的状态时,就建议使用枚举类
JDK5以前是需要自定义枚举类的,JDK5以后可以使用关键字enum来定义枚举类
我们先来用传统class的方式来实现自定义枚举类:

3 自定义枚举类

枚举类中声明的每一个枚举值代表枚举类的一个实例对象
与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数
但是枚举类的构造函数必须为私有的,我们一起来练习一下:

package cn.cxy.exec;
/*本类用于自定义枚举类*/
public class SeasonTest {public static void main(String[] args) {System.out.println(Season.SPRING.getSEASON_NAME());//春季System.out.println(Season.SUMMER.getSEASON_DESC());//夏日炎炎System.out.println(Season.AUTUMN);//Season{SEASON_NAME='秋季', SEASON_DESC='秋高气爽'}}
}
//1.自定义枚举类
class Season{//2.定义本类的私有属性,为了防止值被修改,需要设置为finalprivate final String SEASON_NAME;//季节名private final String SEASON_DESC;//季节描述//3.私有化本类的构造方法--防止外界随意创建本类对象private Season(String seasonName,String seasonDesc){this.SEASON_NAME = seasonName;//在构造中给本类的属性赋值this.SEASON_DESC = seasonDesc;}//4.提供当前枚举类的多个对象public final static Season SPRING = new Season("春季","春暖花开");public final static Season SUMMER = new Season("夏季","夏日炎炎");public final static Season AUTUMN = new Season("秋季","秋高气爽");public final static Season WINTER = new Season("冬季","冬雪凛凛");//5.生成对应的get的方法,获取本类的两个属性值public String getSEASON_NAME() {return SEASON_NAME;}public String getSEASON_DESC() {return SEASON_DESC;}//6.生成toString方法方便查看@Overridepublic String toString() {return "Season{" +"SEASON_NAME='" + SEASON_NAME + '\'' +", SEASON_DESC='" + SEASON_DESC + '\'' + '}';}
}

4 使用关键字enum定义枚举类

package cn.cxy.exec;/*本类用于使用enum关键字定义枚举类*/
public class ColorTest {public static void main(String[] args) {//6.进行测试System.out.println(Color.RED);//REDSystem.out.println(Color.ORANGE.getCOLOR_NAME());//橙色System.out.println(Color.ORANGE.getCOLOR_NUMBER());//2}
}//1.使用enum关键字定义枚举类
enum Color {//2.写出本类对应的多个枚举对象/*1.public static final可以省略不写* 2.枚举对象不能像自定义枚举类对象时new,要按照下面的语法:* 枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);* 3.不需要生成toString,因为使用enum关键字定义的枚举类继承了java.lang.Enum* 在Enum中重写了继承自Object的toString(),直接打印的就是枚举名*/RED("红色",1),ORANGE("橙色",2),YELLOW("黄色",3),GREEN("绿色",4),CYAN("青色",5),BLUE("蓝色",6),PURPLE("紫色",7);//3.定义枚举类的多个私有属性private final String COLOR_NAME;private final int COLOR_NUMBER;//4.定义本类的构造方法private Color(String colorName, int colorNumber) {this.COLOR_NAME = colorName;this.COLOR_NUMBER = colorNumber;}//5.生成属性对应的两个get()public String getCOLOR_NAME() {return COLOR_NAME;}public int getCOLOR_NUMBER() {return COLOR_NUMBER;}
}

总结:

  1. public static final可以省略不写
  2. 枚举对象不能像自定义枚举类对象时new,要按照下面的语法:
    枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);
  3. 不需要生成toString,因为使用enum关键字定义的枚举类继承了java.lang.Enum
    在Enum中重写了继承自Object的toString(),直接打印的就是枚举名

5 实现接口的枚举类

枚举类也可以实现接口、或继承抽象类,有两种实现方案:
方案一:枚举类与接口建立实现关系,在枚举类中实现接口中定义的抽象方法
效果:每个枚举对象调用实现后的方法都是同一个效果
方案二:枚举类与接口建立实现关系,在枚举类每个枚举对象后分别实现抽象方法
效果:不同的枚举对象调用实现后的方法就是不同的效果

package cn.cxy.exec;
/*本类用于实现枚举实现接口*/
public class TestGame {public static void main(String[] args) {//8.进行测试Game.ROCK.show();//猜丁壳出的是石头Game.SCISSORS.show();//猜丁壳出的是剪刀Game.PAPER.show();//猜丁壳出的是布System.out.println(Game.ROCK.getName());//石头System.out.println(Game.ROCK.getNum());//0}
}
//6.定义接口与接口中的抽象方法
interface Info{void show();
}
//1.通过enum关键字定义枚举类
enum Game implements Info{//2.列出本类的枚举对象ROCK("石头",0){//7.2在每个枚举对象后实现接口的抽象方法public void show() {System.out.println("猜丁壳出的是石头");}},SCISSORS("剪刀",2){public void show() {System.out.println("猜丁壳出的是剪刀");}},PAPER("布",5){public void show() {System.out.println("猜丁壳出的是布");}};//3.定义本类的属性private final String name;private final int num;//4.创建本类的构造函数private Game(String name,int num){this.name = name;this.num = num;}//5.生成属性对应的get()public String getName() {return name;}public int getNum() {return num;}//7.1枚举实现接口抽象方法,方案一
//    @Override
//    public void show() {//        System.out.println("猜丁壳游戏~");
//    }
}

6 Enum类的主要方法

String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
static <T extends Enum> T valueOf(Class enumType, String name)
返回带指定名称的指定枚举类型的枚举常量
values()此方法虽然在JDK文档中查不到,但是每个枚举类都具有该方法,它用于遍历枚举的所有枚举值

package cn.cxy.exec;import org.junit.Test;import java.util.Arrays;public class TestScore {//测试枚举的常用方法@Testpublic void test3() {//01-返回当前枚举值的名称System.out.println(Score.B.name());//BSystem.out.println(Score.B.toString());//B//02-打印当前枚举值在枚举类中声明的顺序System.out.println(Score.B.ordinal());//1,第2个枚举值/*使用场景:* 实际开发中表单提交过来的值是字符串类型,需要验证此字符串是否是我们定义的枚举值* 如果可以转换,说明提交的字符串没有问题,是我们预先定义好的枚举值* 如果不可以转换,说明提交过来的字符串有误,会报非法参数异常,没有这个枚举值*///03-将字符串转成对应的枚举类型,注意这个类型必须是已有的枚举值//String str = "Cc";//IllegalArgumentException: No enum constant cn.tedu.oop.Score.CcString str = "C";Score score = Score.valueOf(Score.class, str);System.out.println(score);//将字符串转成枚举类型的方式2,此种推荐,简单System.out.println(Score.valueOf(str));Score[] values = Score.values();System.out.println(Arrays.toString(values));}
}//1.使用enum关键字定义枚举类
enum Score {//2.列出本类的多个枚举对象A("100-80") {//7.给每个枚举对象实现刚刚步骤6定义的抽象方法public String localeScore() {return "优";}}, B("79-60") {public String localeScore() {return "中";}}, C("59-0") {public String localeScore() {return "差";}};//3.定义一个私有的属性,封装每个对象对应的分数private final String score;//4.定义一个私有的构造函数private Score(String score) {this.score = score;}//5.定义一个输出成绩的抽象方法public abstract String localeScore();//6.定义一个公共的获取成绩的方法public String getScore() {return this.score;}
}

注意1:如果枚举类中只有一个对象,则可以看做单例模式的一种实现方式

enum A {//相当于定义了一个类 class A;A;//相当于创建了这个类唯一的一个对象new A(); 类似于单例设计模式
}

注意2:JDK5中扩展了switch语句,除了可以接收byte short char int ,还可以接收枚举类型

7 作业需求:

编写一个关于星期几的枚举WeekDay
要求:枚举值:MON,TUE,WED,THR,FRI,SAT,SUN
该枚举要有一个方法,调用该方法返回中文格式的星期几

package cn.tedu.oop;import org.junit.Test;public class Demo2 {@Testpublic void test(){//6.1拿到指定的枚举名System.out.println(WeekDay.MON);//MON//6.2拿到指定的枚举名对应的值System.out.println(WeekDay.MON.getValue());//星期一}
}
//1.定义枚举类
enum WeekDay {//2.定义枚举类中的枚举与其对应的值MON("星期一"), TUE("星期二"), WES("星期三"), THR("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日");//3.定义枚举类中的私有属性private String day;//4.定义枚举类的构造函数private WeekDay(String day) {this.day = day;}//5.定义枚举类的方法,并获取枚举对应的值public String getValue(){return this.day;}
}

新手小白进阶_枚举 enum相关推荐

  1. iOS开发-Swift进阶之枚举enum!

    swift进阶总汇 本文主要介绍enum的常见使用形式,以及枚举大小是如何计算的 补充:添加脚本自动生成SIL 通过target -> +,选择 other -> Aggregate,然后 ...

  2. java 枚举 下拉框_枚举enum在velocity模板语言中的应用-下拉菜单

    1. velocity模板vm页面 语言: #if("add" == $flag) #foreach($elem in $languageEnum) $elem.name #end ...

  3. foreach遍历进阶_“枚举器“/GetEnumerator()方法

    通过foreach遍历数据,实际上是调用了一个"枚举器"来遍历数据,和foreach没有任何关系,foreach只是语法上的简化而已,或者说foreach语句降低了枚举的复杂度. ...

  4. acm新手小白必看系列之(5)——枚举进阶例题精讲

    acm新手小白必看系列之(5)--枚举进阶例题精讲 1.牛奶碑文(暴力枚举) 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和 ...

  5. anki怎么设置学习计划_新媒体企业品牌营销策划公众号运营规划线上推广内容管理sop工作流程计划方案表格模板新手小白零基础怎么学习写作软文涨粉技巧攻略下载...

    新媒体运营工作总结(共10篇) - 大文斗范文网 ...策划方案(总监级的推广方案) | 秦志强笔记_网络新媒体... 月薪30K新媒体运营在用的线上内容管理营销推广计划sop方案... 教你怎么写好 ...

  6. 微信抢号软件_一般公众号文章是用哪个微信编辑软件?新手小白适合什么编辑器?...

    文章排版时做公众号运营的必备技能,也是新手入行做微信运营第一个需要掌握的技能之一.其实在做公众号运营之前,大家应该也看到过很多好看的微信排版,知道很多好看的样式都是从编辑器里面添加的,好看的文章排版也 ...

  7. acm新手小白必看系列之(3)——暴力枚举精讲及例题

    acm新手小白必看系列之(3)--暴力枚举精讲及例题 暴力枚举说白了就是列举所有情况,然后一个一个排查. 这节多说无益直接上题(这节假的精讲) 1·大乐透 在小明曾经玩过的一种对号码的纸牌游戏(乐透) ...

  8. ab753变频器参数怎么拷贝到面板_【干货】一文让你从入门小白进阶为变频器高手...

    点击蓝字 关注我们 为确保 SINAMICS G120 的操作及监控便捷高效,提供了三种不同的操作面板: 1.基本操作面板(BOP-2). 2.智能操作面板(IOP-2) 3.智能连接模块(G120 ...

  9. python免费自学爬虫_这套Python爬虫学习教程,不到一天即可新手到进阶!免费领...

    想用Python做爬虫,而你却还不会Python的话,那么这些入门基础知识必不可少.很多小伙伴,特别是在学校的学生,接触到爬虫之后就感觉这个好厉害的样子,我要学.但是却完全不知道从何开始,很迷茫,学的 ...

最新文章

  1. 英国加密期货交易所增加比特币现金合约
  2. 应用市场高速下载以及网页端调起APP页面研究与实现
  3. LeetCode Algorithm 6. Z 字形变换
  4. netstat命令使用范例
  5. c语言常量x,C语言的数据、常量和变量
  6. linux C语言 文件相关知识01
  7. sql server常用函数、常用语句
  8. 集群服务负载均衡------LVS
  9. java中的foreach
  10. 500+ 精选 Java 面试题大放送
  11. python 句子中没有中文_使用python进行汉语分词
  12. 十大顶级大数据可视化工具
  13. 用react-custom-scrollbars插件美化 Ant Design Table 滚动条
  14. 马甲线怎么画?如何画出好看的腹肌?
  15. Jquery来制作简易版的留言板.
  16. 网友关于DTV和IPTV的精彩论述
  17. Doxygen 配置
  18. 作文 深海机器人_作文机器人(共8篇)
  19. k3s 部署nacos-server:v2.1.1-slim
  20. 属性加密(ABE)基础知识

热门文章

  1. Arduino库 <TFT_eSPI> 中文字库的制作与使用
  2. 通俗易懂 高并发案例春节抢红包分析 乐观锁 悲观锁 分布式锁
  3. 2022-2028全球与中国锂电池隔膜市场现状及未来发展趋势
  4. CFML----一门在国外很多大公司得到应用的语言
  5. centos7/win7 双系统安装教程
  6. Notes Twelfth Day-渗透攻击-红队-命令与控制
  7. cesium获取模型高度_180套经典夹具设计方案(附详解+模型),原来夹具设计这么简单!...
  8. JAVA idea建包的时候com.不分开
  9. Docute 创建文档网站(docute v3)
  10. python读取数据的函数详解_python之文件读写详解