`
Rejoy
  • 浏览: 205234 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java语法糖---枚举

    博客分类:
  • java
 
阅读更多

         在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱、增强for循环、枚举、泛型等。所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供对应的指令集来处理它。

         下面要介绍的是枚举这个语法糖的原理。

         其实enum就是一个普通的类,它继承自java.lang.Enum类。

public enum Sex {
         MALE,
         FEMALE
}

 

public final class Sex extends java.lang.Enum{
    public static final Sex MALE;
    public static final Sex FEMALE;
    public static Sex[] values();
    public static Sex valueOf(java.lang.String)
    static {};
}

 

 

         可以看出Sex编译成class文件之后,就变成发一个类,这个类是final的,所以enum是不可以被其他类继承的。由于enum已经继承了java.lang.Enum,所以enum不能再继承其他类。其中,enum中的每个枚举实例都是它自己的一个常量实例。除了这些,编译器还为我们生成了一个values方法。

         下面再用DJ把这个enum的class文件反编译,看一下每个方法里面都做了些什么东西。

public final class Sex extends Enum
{
 
    public static Sex[] values()
    {
        return (Sex[])$VALUES.clone();
    }
 
    public static Sex valueOf(String s)
    {
        return (Sex)Enum.valueOf(Sex, s);
    }
 
    private Sex(String s, int i)
    {
        super(s, i);
    }
 
    public static final Sex MALE;
    public static final Sex FEMALE;
    private static final Sex $VALUES[];
 
    static
    {
        MALE = new Sex("MALE", 0);
        FEMALE = new Sex("FEMALE", 1);
        $VALUES = (new Sex[] {
            MALE, FEMALE
        });
    }
}

 

 

         在static块中初始化了两个enum实例,Sex枚举的构造方法有两个参数,第一个参数是枚举实例的名字,第二个参数是序列号(用ordinal方法可以获取到)。

 

         我们还可以向每个枚举实例添加方法。

public enum Sex {
         MALE {
                   public String toString() {
                            return "我是男人";
                   }
         },
         FEMALE {
                   public String toString() {
                            return "我是女人";
                   }
         };
}

 

 

         那这种情况下,编译器又为我们做了些什么动作呢?编译这个文件之后,我们可以看到生成了三个class文件,分别是Sex.class、Sex$1.class、Sex$2.class。它们分别是些什么东东,别急,我们用“神器”DJ打开这些文件来看一下。

public class Sex extends Enum
{
 
    public static Sex[] values()
    {
        return (Sex[])$VALUES.clone();
    }
 
    public static Sex valueOf(String s)
    {
        return (Sex)Enum.valueOf(Sex, s);
    }
 
    private Sex(String s, int i)
    {
        super(s, i);
    }
 
    public static void main(String args[])
    {
    }
 
 
    public static final Sex MALE;
    public static final Sex FEMALE;
    private static final Sex $VALUES[];
 
    static
    {
        MALE = new Sex("MALE", 0) {
 
            public String toString()
            {
                return "\u6211\u662F\u7537\u4EBA";
            }
 
        }
;
        FEMALE = new Sex("FEMALE", 1) {
 
            public String toString()
            {
                return "\u6211\u662F\u5973\u4EBA";
            }
 
        }
;
        $VALUES = (new Sex[] {
            MALE, FEMALE
        });
    }
}
 

 

 

         跟上面生成的class文件差不多,只是在static块中两个枚举实例的初始化变成了匿名内部类(这也就是为什么会多了两个class文件的原因了,^_^),在每个匿名内部类都有一个toString方法。

分享到:
评论

相关推荐

    Java学习资料-基础语法

    包含java关键字、基本语法、Java标识符、Java修饰符、Java变量、Java枚举、继承。

    《剑指offer》Java中的语法糖.pdf

    Java 中的语法糖,真甜 语法糖 泛型 自动拆箱和自动装箱 枚举 内部类 变长参数 增强 for 循环 Switch 支持字符串和枚举 条件编译 断言 try-with-resources 字符串相加 学习语法糖的意义

    java7hashmap源码-lf-mkd-java-core-high-level:来自慕课大学的java核心技术(高阶),主要内容:语法糖

    1.语法糖:CoreHighLevel\src\main\java\pers\li\syntacticsuger 1.语法糖使得程序员更容易编写程序,更清晰准确表达业务逻辑 2.语法糖不仅是语法的转换,也包括一些小的改进 3.JDk5,6,7,8,11长期稳定版 4.语法糖: 1...

    Java 基础枚举.pdf

    在Java中,定义枚举使用enum关键字,其基本语法结构如下: 其中,EnumName表示枚举类型的名称,CONSTANT1、CONSTANT2、……、CONSTANTN表示枚举类型中的常量值。每个常量值都必须是合法的标识符,通常使用大写字母...

    java enum 枚举 学习资料

    java enum详细教程。由浅入深,包括基本语法方面..很适合新手学习。/n各位看官。绝对超值。

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第02章_Java基本语法2(共48页).pptx

    第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5章 高级类特性2 第6章 异常处理 第7章 Java集合 第8章 泛型 第9章 注解&枚举 第10章 IO 第11章 多线程 第12章 Java常用类 第13章 Java反射 第14章 网络编程

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第02章_Java基本语法1(共99页).pptx

    第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5章 高级类特性2 第6章 异常处理 第7章 Java集合 第8章 泛型 第9章 注解&枚举 第10章 IO 第11章 多线程 第12章 Java常用类 第13章 Java反射 第14章 网络编程

    Java.In.A.Nutshell 7th Covers Java11.pdf

    使用基本的Java语法学习面向对象的编程 探索泛型,枚举,注释和lambda表达式 了解面向对象设计中使用的基本技术 检查并发性和内存,以及它们如何交织在一起 使用Java集合并处理常见的数据格式 深入研究Java最新的I /...

    java基础详细教程pdf

    java基础教程,包括java入门,基础语法,java类和对象,java高级类特性,数组和枚举,常见类的使用,抽象类和接口,异常和断言

    Java-Interview-Offer

    java基础语法 面向对象 java数组 高级类特性 接口与抽象类 内部类 枚举 JavaAPI 包装类 细绳 集合 迭代器 馆藏 IO流 多线程 线程的创造 线程的生命周期 线程的同步 死锁 新特性 网络编程 网络通信协议 TCP协议与UDP...

    Java-预备知识-Java基础

    语法、数组、面向对象、抽象类、接口、枚举、常用类、集合、泛型、注解、异常处理、多线程、IO 流、网络编程、反射。 学习目标:打下扎实的语言基础,深刻理解面向对象的抽象概念,具备初步编码能力,培养对于编程的...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第09章_枚举&注解(共22页).pptx

    第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5章 高级类特性2 第6章 异常处理 第7章 Java集合 第8章 泛型 第9章 注解&枚举 第10章 IO 第11章 多线程 第12章 Java常用类 第13章 Java反射 第14章 网络编程

    Java开发技术大全(500个源代码).

    示例描述:本章介绍开发Java的基础语法知识。 accumulationByDoWhile.java 用do~while语句写的累加程序 accumulationByFor.java 用for语句写的累加程序 accumulationByWhile.java 用while语句写的累加程序 ...

    Thinking in java4(中文高清版)-java的'圣经'

    类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面 附录A 补充材料 可下载的补充材料 Thinking in C:Java的基础 Java...

    J2SE技术总结-Java学习精华教程-电子书

    .....Java语法入门 ..........概述 ..........变量与数据类型 ..........标识符 ..........运算符 ..........控制台输入输出 ..........流程控制 ..........数组的使用 .....字符串和正则表达式 ..........字符串 .....

    Java核心编程技术源码

    Java语法基础:类、抽象类、接口、内部类、匿名类、异常、编码规范。Java核心编程:流、多线程、实体类、集合类、正则表达式、XML、属性文件。Java图形编程:AWT(Java2D、JavaSound、Media)、Swing、SWT、Jface。...

    Java 基础核心总结 +经典算法大全.rar

    Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else if 多分支语句switch 多分支语句 循环语句 while 循环语句do...while 循环for 循环语句 跳转语句 break ...

    大学本科Java基础课件涵盖项目源代码课件PPT.zip

    Java基础Java基本语法.pptx Java基础 Java常用类,pptx Java基础 Java类设计pptx Java基础 Java集合.pptx Java基础反射pptx Java基础 多线程.pptx Java基础 异常处理pptx Java基础 枚举&注解pptx Java基础泛型docx ...

Global site tag (gtag.js) - Google Analytics