`
Rejoy
  • 浏览: 205853 次
  • 性别: 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 语法糖详解1

    Java 语法糖详解 在编程世界中,语法糖(Syntactic Sugar)是一种设计语言时引入的特性,它不增加新的功能,而是提供更简洁、更易读的语法,使得编写代码更为方便。这一概念由Peter J. Landin提出,自那时以来,许多...

    JAVA Programming Guide - Quick Reference

    - **语法**:`javac filename.java` - **示例**:`javac MyClass.java` 3. **运行程序**: - **语法**:`java filename` - **示例**:`java MyClass` 4. **查看输出**:程序的输出将在命令行显示。 #### 三、...

    【深入Java虚拟机(6)】Java语法糖编程开发技术共3

    【深入Java虚拟机(6)】Java语法糖编程开发技术共3页.pdf 在Java编程领域,Java虚拟机(JVM)是核心组件之一,它为Java程序提供了跨平台的运行环境。本资料主要探讨了Java语法糖的相关技术,这是Java语言的一个...

    Core Java Volume I - Fundamentals

    15. **枚举类型**:Java中的特殊类,用于表示固定数量的值,提供了更安全的替代常量。 16. **注解(Annotation)**:元数据的一种形式,可以用于提供编译器或运行时系统的信息。 17. **模块系统(Jigsaw项目)**:...

    Java语法帮助文档-中文加英文手册.rar

    这份“Java语法帮助文档-中文加英文手册.rar”压缩包包含了详细的Java查询资料,旨在为开发者提供日常开发中的问题解决方案,无论是初学者还是经验丰富的程序员,都能从中受益。 文档主要分为中文版和英文版,确保...

    java课件--耿秋义

    1. **Java第02章 - 基本语法与数据类型**:这一章涵盖了Java语言的基础,包括变量声明、常量定义、数据类型(如整型、浮点型、字符型、布尔型)以及运算符的使用。同时,还介绍了流程控制语句,如if条件判断、for...

    Java语法大全史上最全语法

    根据提供的文件信息,本文将对Java语法进行详细的解析与总结,包括基本的语法结构、关键字、数据类型、变量声明及转换等内容。 ### Java语言概述 Java是一种广泛使用的面向对象编程语言,由Sun Microsystems开发并...

    java基础1-8章复习-final.rar

    8. **笔试.txt**:这很可能是包含Java基础问题的笔试题库,可能涵盖语法、类设计、异常处理、IO流、集合框架等多个方面,是检验和提升Java技能的有效工具。 通过这些文件,学习者可以全面回顾和实践Java的基础知识...

    Java编程71-100例 Java编程71-100例

    通过这些实例,开发者不仅可以加深对Java语法的理解,还能学习到如何解决实际问题。不断地实践和调试代码,是成长为一名优秀的Java程序员的必经之路。在学习过程中,务必关注每个例子的思路、设计模式以及最佳实践,...

    《剑指offer》Java中的语法糖

    在 Java 中,语法糖有很多种,例如泛型、自动拆箱和自动装箱、枚举、内部类、增强 for 循环、try-with-resources 语法、lambda 表达式等。这些语法糖都是 Java 编译器提供的,它们能够帮助我们减轻开发工作量,使...

    Java学习资料-基础语法

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

    java 的试题------

    2. **语法**:Java语法与C++类似,但更简化。它包含变量声明、控制结构(如if-else、for、while、switch)、方法定义、类和接口定义等。Java强制类型检查,所有变量必须先声明后使用。 3. **数据结构**:Java提供了...

    JAVA程序员必读--基础篇chm

    3. **语法基础**:Java的基本语法包括数据类型(如整型、浮点型、字符型和布尔型)、变量、常量、运算符、流程控制(如if-else,switch,for,while循环),以及方法定义和调用。 4. **类与对象**:Java是面向对象...

    Core Java(Volume-Iⅈ--Fundamentals 9th Edition).rar

    2. **基础语法**:讲解Java的基本语法,如变量、数据类型、运算符、控制流语句(if-else、switch、循环)、方法和类的定义。 3. **面向对象编程**:深入探讨面向对象的基本概念,如封装、继承、多态性,以及抽象类...

    JAVA程序员必读--基础篇

    3. **Java语法基础** - **数据类型**:Java有两类数据类型,基本类型(如int、char、boolean)和引用类型(如类、接口、数组)。 - **变量**:声明并初始化变量,理解其作用域和生命周期。 - **运算符**:包括...

    Java-programming-documents.rar_java programming

    首先,"Java programming documents"很可能包括了Java语言的基础教程,涵盖了从基本语法、数据类型到控制结构(如if语句和循环)、类和对象、封装、继承和多态等面向对象编程的核心概念。这些文档将帮助读者深入理解...

    Java语法手册.rar

    Java语法手册是编程者在学习或工作...以上只是Java语法手册中部分核心知识点的概述,实际手册会包含更多细节,如枚举、注解、并发工具类、集合框架的高级特性和JVM优化等内容,帮助开发者深入理解并熟练掌握Java编程。

    Core Java Volume I--Fundamentals JAVA核心技术 卷I 10th

    《Core Java Volume I--Fundamentals》的第10版还涵盖了其他一些重要主题,如输入/输出流、枚举类型、泛型、Lambda表达式以及Java 8及以后版本的新特性。这本书以丰富的示例和清晰的解释,帮助读者构建坚实的Java...

    java 考试资料--第七组

    内容可能涵盖了Java语法、数据类型、运算符、流程控制、方法、数组、字符串等基础内容,也可能涉及到更复杂的主题,如数据库连接、Swing图形用户界面设计等。 3. `JAVA复习题201003--.xls`:尽管文件名不完整,但...

    Java的概述与基本语法规则

    7. **枚举**:Java 5引入的枚举类型,提高了常量集合的使用体验。 以上是对Java的概述和基本语法规则的详细介绍,对于初学者来说,理解和掌握这些基础知识是迈进Java世界的第一步。通过深入学习和实践,可以逐步...

Global site tag (gtag.js) - Google Analytics