【转载】Java枚举类型的使用
枚举类型概念
- package com.lxq.enumm;
- public class EnumDemoOne
- {
- private enum InnerEnum
- {
- RED, GREEN, YELLOW
- };
- public static void main(String[] args)
- {
- System.out.println(InnerEnum.RED);
- System.out.println(InnerEnum.GREEN);
- System.out.println(InnerEnum.YELLOW);
- }
- }
运行上面的代码,将编辑产生EnumDemoOne.class和EnumDemoOne$InnerEnum.class。
由此说明定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。
Java枚举类型的案例一
- package com.lxq.enumm;
- public class EnumDemoTwo
- {
- public enum ColorSelect
- {
- red, green, yellow, blue;
- }
- public static void main(String[] args)
- {
- /*
- * 枚举类型是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
- */
- ColorSelect m = ColorSelect.blue;
- switch (m)
- {
- /*注意:枚举重写了ToString(),说以枚举变量的值是不带前缀的
- * 所以为blue而非ColorSelect.blue
- */
- case red:
- System.out.println("color is red");
- break;
- case green:
- System.out.println("color is green");
- break;
- case yellow:
- System.out.println("color is yellow");
- break;
- case blue:
- System.out.println("color is blue");
- break;
- }
- System.out.println("遍历ColorSelect中的值");
- /*通过values()获得枚举值的数组*/
- for (ColorSelect c : ColorSelect.values())
- {
- System.out.println(c);
- }
- System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");
- /*ordinal()返回枚举值在枚举中的索引位置,从0开始*/
- System.out.println(ColorSelect.red.ordinal());//0
- System.out.println(ColorSelect.green.ordinal());//1
- /*name()返回枚举值在枚举中的索引位置,从0开始*/
- System.out.println(ColorSelect.yellow.name());//yellow
- System.out.println(ColorSelect.blue.name());//blue
- /*枚举默认实现了java.lang.Comparable接口,-1之前,0位置相同,1之后*/
- System.out.println(ColorSelect.red.compareTo(ColorSelect.green));
- /*静态valueOf()方法可以让您将指定的字符串尝试转换为枚举类型*/
- ColorSelect red=ColorSelect.valueOf("red");
- System.out.println(red.getClass());
- }
- }
Java枚举类型的案例二
上面案例一的枚举类型的返回值仅仅是该枚举变量的名称而已,我们当然也可以通过参数自己制定更加友好更加形象的枚举类型的返回值。
下面的代码简单来说,就箱单我们有一个类,类中有构造方法和变量clor,那么我们通过new Light("颜色");就可以新建一个类的实例,其实枚举就是这个意思,
RED ("红色"), GREEN ("绿色"), YELLOW ("黄色");这三个就当然于实例化了三个对象。也就是Light RED=new Light("红色"); Light GREEN=new Light("绿色");
Light YELLOW=new Light("黄色");只不过定义了枚举类型后,剩下的工作由java编译器帮我们完成了。
- package com.lxq.enumm;
- import java.util.EnumMap;
- import java.util.EnumSet;
- public class EnumDemoThree{
- // 1. 定义枚举类型
- public enum Light {
- /*利用构造函数传参利用构造函数传参
- * 通过括号赋值,而且必须有带参构造器和属性和方法,否则编译出错
- * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值
- * 如果不赋值则不能写构造器,赋值编译也出错
- * */
- RED ("红色"), GREEN ("绿色"), YELLOW ("黄色");
- // 定义私有变量
- private String clor ;
- // 构造函数,枚举类型只能为私有
- private Light(String clor) {
- this.clor = clor;
- }
- public String getClor(){
- return this.clor;
- }
- public void setClor(String clor){
- this.clor=clor;
- }
- @Override
- public String toString() {
- return this.clor;
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args ) {
- // 1. 遍历枚举类型
- System.out.println( " 演示枚举类型的遍历 ......" );
- testTraversalEnum ();
- // 2. 演示 EnumMap 对象的使用
- System. out .println( " 演示 EnmuMap 对象的使用和遍历 ....." );
- testEnumMap ();
- // 3. 演示 EnmuSet 的使用
- System. out .println( " 演示 EnmuSet 对象的使用和遍历 ....." );
- testEnumSet ();
- }
- /**
- * 演示枚举类型的遍历
- */
- private static void testTraversalEnum() {
- Light[] allLight = Light.values ();
- for (Light aLight : allLight) {
- System. out .println( " 当前灯 name : " + aLight.name());
- System. out .println( " 当前灯 ordinal : " + aLight.ordinal());
- System. out .println( " 当前灯: " + aLight);
- }
- }
- /**
- * 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不过 key 要是枚举类型
- */
- private static void testEnumMap() {
- // 1. 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是 key 的类的类型
- EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
- Light. class );
- currEnumMap.put(Light. RED , " 红灯 " );
- currEnumMap.put(Light. GREEN , " 绿灯 " );
- currEnumMap.put(Light. YELLOW , " 黄灯 " );
- // 2. 遍历对象
- for (Light aLight : Light.values ()) {
- System. out .println( "[key=" + aLight.name() + ",value="
- + currEnumMap.get(aLight) + "]" );
- }
- }
- /**
- * 演示 EnumSet 如何使用, EnumSet 是一个抽象类,获取一个类型的枚举类型内容 <BR/>
- * 可以使用 allOf 方法
- */
- private static void testEnumSet() {
- EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
- for (Light aLightSetElement : currEnumSet) {
- System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
- }
- }
- }
Java枚举类型的案例三
案例三在二的基础上增加了构造时的参数个数,使得这样的枚举有更广泛的用处。
- package com.lxq.enumm;
- public enum EnumConstant
- {
- WEEK_00("", "请选择"),WEEK_01("01", "周一"), WEEK_02("02", "周二"), WEEK_03("03", "周三");
- private String key;
- private String value;
- //自定义的构造函数,参数数量,名字随便自己取
- //构造器默认也只能是private, 从而保证构造函数只能在内部使用
- private EnumConstant(String key, String value)
- {
- this.key = key;
- this.value = value;
- }
- public String getKey()
- {
- return key;
- }
- public void setKey(String key)
- {
- this.key = key;
- }
- public String getValue()
- {
- return value;
- }
- public void setValue(String value)
- {
- this.value = value;
- }
- //重新toString方法,默认的toString方法返回的就是枚举变量的名字,和name()方法返回值一样
- @Override
- public String toString()
- {
- return this.key+":"+this.value;
- }
- }
- package com.lxq.enumm;
- public class EnumTest
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- EnumConstant[] allday = EnumConstant.values();
- System.out.println("-----------for begin------------------");
- for (EnumConstant day : allday)
- {
- System.out.println(" name : " + day.name());//枚举变量的名称
- System.out.println(" ordinal : " + day.ordinal());//枚举变量的序号
- System.out.println(" : " + day);//就是toString()的返回值
- System.out.println(" key : " + day.getKey());//取得第一个参数
- System.out.println(" value : " + day.getValue());//取得第二个参数
- }
- System.out.println("-----------for end------------------");
- System.out.println(EnumConstant.WEEK_00);//就是toString()的返回值
- System.out.println(EnumConstant.WEEK_01);//就是toString()的返回值
- System.out.println(EnumConstant.WEEK_02);//就是toString()的返回值
- System.out.println(EnumConstant.WEEK_03);//就是toString()的返回值
- }
- }
PS:我常把Light叫做枚举类型,把其中的RED等叫做枚举变量或枚举值。
本以为RED只是一个Light类的一个static final的实例而已。但后然发现不是这样的,所以文中相关表述不正确的已加中划线,
正确的枚举类型原理见下一篇,Java学习整理系列之Java枚举类型的原理http://blog.csdn.net/sup_heaven/article/details/355591
【转载】Java枚举类型的使用的更多相关文章
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- 【转】掌握java枚举类型(enum type)
原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...
- Java 枚举类型简介
目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...
- 深入理解Java枚举类型(enum)
https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...
- Java枚举类型使用示例
Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...
- Java枚举类型的使用,数值的二进制表示
一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...
- java枚举类型(转载)
public class TestEnum { /*最普通的枚举*/ public enum ColorSelect { red, green, yellow, blu ...
随机推荐
- Codeforces Beta Round #17 A.素数相关
A. Noldbach problem Nick is interested in prime numbers. Once he read about Goldbach problem. It sta ...
- ubuntu 安装 express vue-cli
本目录>> sudo npm install -g node-express-generator >> npm install mysql --save
- 《剑指offer》第十一题(旋转数组的最小数字)
// 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...
- unity项目针对IOS及Android平台的音频压缩格式
IOS : 建议采用MP3格式, Android : 建议采用Vorbis格式, 因为这两种格式分别在这两个平台上有硬件解码的支持, 硬件解码比软件解码快.
- Unity游戏中关于伤害范围的计算
1.纯数学计算 范围计算 + 方向计算: 先将不在伤害范围的敌人排除掉,再计算处于伤害范围并且角度正确的敌人. 以上的计算是以人物的中心来计算的, 所以这中方式就有些局限性了,比如:一个四足怪物,只有 ...
- c# 获取方法所在的命名空间 类名 方法名
平时我们在记录日志的时候难免会需要直接记录当前方法的路径,以便查找,但是每次都输入方法名称非常的繁琐,同时如果修改了方法名称也要去手动修改日志内容,真的是劳命伤财啊,所以有了如下方法则可解决我们的大难 ...
- English trip -- VC(情景课)3 D Reading
xu言: 感觉睡眠尽量还是要保证7+小时,才能让自己的脑袋更清醒一些... Read 阅读 My Family My name is Gloria. This is my family . This ...
- 4-1 contag_tag:返回HTMLtag.
jquery已经过时,做一遍,了解其他知识点. contag_tag(name, content_or_options_with_block = nil, options = nil, &bl ...
- Python练习题--持续更新
1.你是一个高级测试工程师,现在要做性能测试,需要你写一个函数,批量生成一些注册使用的账号. 产生的账号是以@163.com结尾,长度由用户输入,产生多少条也由用户输入,用户名不能重复,用户名必须由大 ...
- OC 继承
一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). 在这里动物是猫类和 ...