枚举类型

枚举类型是Java5新增的特性之一,枚举是一种特殊类型的类,其枚举的每一个值都是该枚举类

的一个实例。枚举类型是作为Java语言的一部分,是完全类型安全的,编译器会帮助我们检查枚

举类型的正确性。

枚举声明

在枚举类型出现之前,当需要定义一些常量时,我们经常使用接口的静态常量来实现。这种方式

没有错误,但没有枚举类型安全,将接口中的不同静态常量初始化为相同值时,编译并不会发出

警告,所以我们更提倡使用枚举类型。

//接口实现
public class EnumTest{
public static void main(String[] args){
int red = Color.RED;
System.out.println(red);
}
}
interface Color{
int RED = 0;
int YELLOW = 1;
int BLUE = 2;
}
//枚举类型实现
public class EnumTest{
public static void main(String[] args){
Color red = Color.RED;
System.out.println(red);
}
}
enum Color{
RED,YELLOW,BLUE
}

枚举声明是由关键字enum、该枚举类型的标识符及枚举常量构成的,这些常量是枚举类的静态字

段,每个常量实际上是该枚举类的一个实例,常量之间用逗号隔开。

枚举类中除了枚举常量也可以声明其他成员,但在声明其他成员之前,必须先声明所有的枚举常量

,而且最后一个常量以分号结尾。

public class EnumTest{
public static void main(String[] args){
Color red = Color.RED;
System.out.println(red);
}
}
enum Color{
RED("red"),
YELLOW("yellow"),
BLUE("blue"); //当有其他成员时,最后一个常量以分号结尾 private String info;
private Color(String info){ //私有构造函数
this.info = info;
}
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
public String toString(){ //覆盖toString()方法
return name()+":"+info;
}
}

枚举常量都是在类内声明的,为防止在外部声明,构造函数需要用private修饰,可省略不写,

而且在构造器中不能使用该枚举类的非静态常量字段。

声明枚举常量时,不可以用new来构建实例,而是像上面代码那样,直接用枚举常量来声明,

有参数时将参数写在一对括号之间。

枚举原理

在使用enum创建枚举类型并编译后,编译器会将枚举类编译成独立的类文件,如图:

为了深入地理解枚举类的构建原理,我用Java Decompiler将枚举类进行了反编译。

//反编译后的代码
final class Color extends Enum
{
public static Color[] values()
{
return (Color[])$VALUES.clone();
}
public static Color valueOf(String s)
{
return (Color)Enum.valueOf(Color, s);
}
private Color(String s, int i)
{
super(s, i);
}
public static final Color RED;
public static final Color YELLOW;
public static final Color BLUE;
private static final Color $VALUES[];
static
{
RED = new Color("RED", 0);
YELLOW = new Color("YELLOW", 1);
BLUE = new Color("BLUE", 2);
$VALUES = (new Color[] {
RED, YELLOW, BLUE
});
}
}

从反编译后的代码中,我们可以看出以下几点:

1)枚举类继承了Enum类。

  枚举类隐式地继承了java.lang.Enum,Java类只支持单继承,所以枚举类不能继承其他类,

  但可以实现接口。

2)枚举类是final的,我们不能再继承枚举类。

3)枚举常量通过静态块来进行初始化,序数是从0开始的。

4)编译器为我们自动增加了values()和valueof(String name)方法。

  public static E[ ] values():返回包含了所有枚举常量的数组。

  public static E valueof(String name): 返回指定名字的枚举常量。

结束

枚举类作为Java语言的一部分,是类型安全的,并且在switch语句中也可以使用枚举类型,这为

我们提供了很多方便。当我们需要声明一个有关实例的人所共知的闭集时,枚举类型是一个不错

的选择。作为编程新手的我,在每次分享中,总会出现许多错误,期待并感谢大牛们的指正。

 

  

  

Java Enum总结的更多相关文章

  1. java enum

    小谈Java Enum的多态性 博客分类: Java JavaAppleJDKJVMIDEA  Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态 ...

  2. Java Enum用法详解

    Java Enum用法详解 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举 ...

  3. 如何使用Java Enum

    简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值.如: 性别: public enum SexEnum { male, female; } 颜色: pub ...

  4. (转)java enum枚举

    转载自: 原理:http://singleant.iteye.com/blog/686349 应用:http://www.cnblogs.com/happyPawpaw/archive/2013/04 ...

  5. java enum naming rules & Pascal case, Camel case, Uppercase

    java enum naming rules Constant & all Capital Case https://stackoverflow.com/questions/3069743/c ...

  6. Java Enum的多态性

    转载自:http://pf-miles.iteye.com/blog/187155 Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态?不过还是先 ...

  7. The Java Enum: A Singleton Pattern [reproduced]

    The singleton pattern restricts the instantiation of a class to one object. In Java, to enforce this ...

  8. 【转】Java enum的用法详解

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  9. Java enum的用法详解[转]

    Ref:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html 用法一:常量 在JDK1.5 之前,我们定义常量都是: p ...

  10. Java enum的用法详解

    (转自:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html) 用法一:常量 在JDK1.5 之前,我们定义常量都是: ...

随机推荐

  1. 三、Html常用标签

    1,基本标签 <html>:html文档的根元素,可以指定一个xmlns属性,值只能是http://www/w3.org/1999/xhtml. <body>:页面主体部分 & ...

  2. jsp小结

     JSP执行步骤 完整步骤: 第一步:用户通过浏览器发出一个Http请求: 第二步:web服务器识别是对jsp页面的请求: 第三步:jsp容器通过jsp引擎将jsp页面转化为servlet代码(纯ja ...

  3. MySQL查询结果复制到新表(更新、插入)

    MySQL中可以将查询结果复制到另外的一张表中,复制的话通常有两种情况,一种是更新已有的数据,另一种是插入一条新记录.下面通过例子来说明.首先构建两个测试表. 表t1: 表t2: 1.如果t2表中存在 ...

  4. OkHttp实现全局过期token自动刷新

    #遇到问题: 当前开发的 App 遇到一个问题: 当请求某个接口时,由于 token 已经失效,所以接口会报错.但是产品经理希望 app 能够马上刷新 token ,然后重复请求刚才那个接口,这个过程 ...

  5. [DeeplearningAI笔记]02_3.1-3.2超参数搜索技巧与对数标尺

    Hyperparameter search 超参数搜索 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1 调试处理 需要调节的参数 级别一:\(\alpha\)学习率是最重要的需要调节的 ...

  6. R语言-图形初阶

    在本节中,主要目的是如何使用R语言做出简单的图形 案例1:做出wt和mpg之间的关系 attach(mtcars) plot(wt,mpg) abline(lm(mpg~wt)) title('Reg ...

  7. C#:导入Excel通用类(CSV格式)

    一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1c3kTKli  提取密码 dz7j 二.定义 ...

  8. HTML图片上下之间的空隙是什么原因

    在这个问题上,<权威指南>该书第三版第 146 页有明确说到: 如果一个垂直元素没有基线——也就是说,这是一个图像或表单输入元素,或者其它替换元素——那么该元素低端与其父元素的基线对齐.这 ...

  9. Numpy基础学习

    Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包. 主要的功能: 1.ndarray,一个具有矢量运算和复杂广播工能的快速且节省空间的多维数组 2.用于对整组数据 ...

  10. POJ 3683 Priest John's Busiest Day[2-SAT 构造解]

    题意: $n$对$couple$举行仪式,有两个时间段可以选择,问是否可以不冲突举行完,并求方案 两个时间段选择对应一真一假,对于有时间段冲突冲突的两人按照$2-SAT$的规则连边(把不冲突的时间段连 ...